/*
 *
 *    Copyright (c) 2022 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

// THIS FILE IS GENERATED BY ZAP

package chip.devicecontroller;

import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class ChipClusters {

  public interface DefaultClusterCallback {
    void onSuccess();

    void onError(Exception error);
  }

  public interface CharStringAttributeCallback {
    /** Indicates a successful read for a CHAR_STRING attribute. */
    void onSuccess(String value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface OctetStringAttributeCallback {
    /** Indicates a successful read for an OCTET_STRING attribute. */
    void onSuccess(byte[] value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface IntegerAttributeCallback {
    void onSuccess(int value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface LongAttributeCallback {
    void onSuccess(long value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface BooleanAttributeCallback {
    void onSuccess(boolean value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface FloatAttributeCallback {
    void onSuccess(float value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface DoubleAttributeCallback {
    void onSuccess(double value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public abstract static class BaseChipCluster {
    protected long chipClusterPtr;

    public BaseChipCluster(long devicePtr, int endpointId) {
      chipClusterPtr = initWithDevice(devicePtr, endpointId);
    }

    public abstract long initWithDevice(long devicePtr, int endpointId);

    public native void deleteCluster(long chipClusterPtr);

    @SuppressWarnings("deprecation")
    protected void finalize() throws Throwable {
      super.finalize();

      if (chipClusterPtr != 0) {
        deleteCluster(chipClusterPtr);
        chipClusterPtr = 0;
      }
    }
  }

  public static class IdentifyCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 3L;

    public IdentifyCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void identify(DefaultClusterCallback callback, Integer identifyTime) {
      identify(chipClusterPtr, callback, identifyTime, null);
    }

    public void identify(
        DefaultClusterCallback callback, Integer identifyTime, int timedInvokeTimeoutMs) {
      identify(chipClusterPtr, callback, identifyTime, timedInvokeTimeoutMs);
    }

    public void triggerEffect(
        DefaultClusterCallback callback, Integer effectIdentifier, Integer effectVariant) {
      triggerEffect(chipClusterPtr, callback, effectIdentifier, effectVariant, null);
    }

    public void triggerEffect(
        DefaultClusterCallback callback,
        Integer effectIdentifier,
        Integer effectVariant,
        int timedInvokeTimeoutMs) {
      triggerEffect(
          chipClusterPtr, callback, effectIdentifier, effectVariant, timedInvokeTimeoutMs);
    }

    private native void identify(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer identifyTime,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void triggerEffect(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer effectIdentifier,
        Integer effectVariant,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readIdentifyTimeAttribute(IntegerAttributeCallback callback) {
      readIdentifyTimeAttribute(chipClusterPtr, callback);
    }

    public void writeIdentifyTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeIdentifyTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeIdentifyTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeIdentifyTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeIdentifyTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeIdentifyTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readIdentifyTypeAttribute(IntegerAttributeCallback callback) {
      readIdentifyTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeIdentifyTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeIdentifyTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readIdentifyTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeIdentifyTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeIdentifyTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readIdentifyTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeIdentifyTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class GroupsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 4L;

    public GroupsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void addGroup(AddGroupResponseCallback callback, Integer groupId, String groupName) {
      addGroup(chipClusterPtr, callback, groupId, groupName, null);
    }

    public void addGroup(
        AddGroupResponseCallback callback,
        Integer groupId,
        String groupName,
        int timedInvokeTimeoutMs) {
      addGroup(chipClusterPtr, callback, groupId, groupName, timedInvokeTimeoutMs);
    }

    public void viewGroup(ViewGroupResponseCallback callback, Integer groupId) {
      viewGroup(chipClusterPtr, callback, groupId, null);
    }

    public void viewGroup(
        ViewGroupResponseCallback callback, Integer groupId, int timedInvokeTimeoutMs) {
      viewGroup(chipClusterPtr, callback, groupId, timedInvokeTimeoutMs);
    }

    public void getGroupMembership(
        GetGroupMembershipResponseCallback callback, ArrayList<Integer> groupList) {
      getGroupMembership(chipClusterPtr, callback, groupList, null);
    }

    public void getGroupMembership(
        GetGroupMembershipResponseCallback callback,
        ArrayList<Integer> groupList,
        int timedInvokeTimeoutMs) {
      getGroupMembership(chipClusterPtr, callback, groupList, timedInvokeTimeoutMs);
    }

    public void removeGroup(RemoveGroupResponseCallback callback, Integer groupId) {
      removeGroup(chipClusterPtr, callback, groupId, null);
    }

    public void removeGroup(
        RemoveGroupResponseCallback callback, Integer groupId, int timedInvokeTimeoutMs) {
      removeGroup(chipClusterPtr, callback, groupId, timedInvokeTimeoutMs);
    }

    public void removeAllGroups(DefaultClusterCallback callback) {
      removeAllGroups(chipClusterPtr, callback, null);
    }

    public void removeAllGroups(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      removeAllGroups(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void addGroupIfIdentifying(
        DefaultClusterCallback callback, Integer groupId, String groupName) {
      addGroupIfIdentifying(chipClusterPtr, callback, groupId, groupName, null);
    }

    public void addGroupIfIdentifying(
        DefaultClusterCallback callback,
        Integer groupId,
        String groupName,
        int timedInvokeTimeoutMs) {
      addGroupIfIdentifying(chipClusterPtr, callback, groupId, groupName, timedInvokeTimeoutMs);
    }

    private native void addGroup(
        long chipClusterPtr,
        AddGroupResponseCallback Callback,
        Integer groupId,
        String groupName,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void viewGroup(
        long chipClusterPtr,
        ViewGroupResponseCallback Callback,
        Integer groupId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getGroupMembership(
        long chipClusterPtr,
        GetGroupMembershipResponseCallback Callback,
        ArrayList<Integer> groupList,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeGroup(
        long chipClusterPtr,
        RemoveGroupResponseCallback Callback,
        Integer groupId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeAllGroups(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void addGroupIfIdentifying(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer groupId,
        String groupName,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface AddGroupResponseCallback {
      void onSuccess(Integer status, Integer groupId);

      void onError(Exception error);
    }

    public interface ViewGroupResponseCallback {
      void onSuccess(Integer status, Integer groupId, String groupName);

      void onError(Exception error);
    }

    public interface GetGroupMembershipResponseCallback {
      void onSuccess(@Nullable Integer capacity, ArrayList<Integer> groupList);

      void onError(Exception error);
    }

    public interface RemoveGroupResponseCallback {
      void onSuccess(Integer status, Integer groupId);

      void onError(Exception error);
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readNameSupportAttribute(IntegerAttributeCallback callback) {
      readNameSupportAttribute(chipClusterPtr, callback);
    }

    public void subscribeNameSupportAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNameSupportAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readNameSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNameSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ScenesCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 5L;

    public ScenesCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void addScene(
        AddSceneResponseCallback callback,
        Integer groupId,
        Integer sceneId,
        Integer transitionTime,
        String sceneName,
        ArrayList<ChipStructs.ScenesClusterExtensionFieldSet> extensionFieldSets) {
      addScene(
          chipClusterPtr,
          callback,
          groupId,
          sceneId,
          transitionTime,
          sceneName,
          extensionFieldSets,
          null);
    }

    public void addScene(
        AddSceneResponseCallback callback,
        Integer groupId,
        Integer sceneId,
        Integer transitionTime,
        String sceneName,
        ArrayList<ChipStructs.ScenesClusterExtensionFieldSet> extensionFieldSets,
        int timedInvokeTimeoutMs) {
      addScene(
          chipClusterPtr,
          callback,
          groupId,
          sceneId,
          transitionTime,
          sceneName,
          extensionFieldSets,
          timedInvokeTimeoutMs);
    }

    public void viewScene(ViewSceneResponseCallback callback, Integer groupId, Integer sceneId) {
      viewScene(chipClusterPtr, callback, groupId, sceneId, null);
    }

    public void viewScene(
        ViewSceneResponseCallback callback,
        Integer groupId,
        Integer sceneId,
        int timedInvokeTimeoutMs) {
      viewScene(chipClusterPtr, callback, groupId, sceneId, timedInvokeTimeoutMs);
    }

    public void removeScene(
        RemoveSceneResponseCallback callback, Integer groupId, Integer sceneId) {
      removeScene(chipClusterPtr, callback, groupId, sceneId, null);
    }

    public void removeScene(
        RemoveSceneResponseCallback callback,
        Integer groupId,
        Integer sceneId,
        int timedInvokeTimeoutMs) {
      removeScene(chipClusterPtr, callback, groupId, sceneId, timedInvokeTimeoutMs);
    }

    public void removeAllScenes(RemoveAllScenesResponseCallback callback, Integer groupId) {
      removeAllScenes(chipClusterPtr, callback, groupId, null);
    }

    public void removeAllScenes(
        RemoveAllScenesResponseCallback callback, Integer groupId, int timedInvokeTimeoutMs) {
      removeAllScenes(chipClusterPtr, callback, groupId, timedInvokeTimeoutMs);
    }

    public void storeScene(StoreSceneResponseCallback callback, Integer groupId, Integer sceneId) {
      storeScene(chipClusterPtr, callback, groupId, sceneId, null);
    }

    public void storeScene(
        StoreSceneResponseCallback callback,
        Integer groupId,
        Integer sceneId,
        int timedInvokeTimeoutMs) {
      storeScene(chipClusterPtr, callback, groupId, sceneId, timedInvokeTimeoutMs);
    }

    public void recallScene(
        DefaultClusterCallback callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Optional<Integer> transitionTime) {
      recallScene(chipClusterPtr, callback, groupId, sceneId, transitionTime, null);
    }

    public void recallScene(
        DefaultClusterCallback callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Optional<Integer> transitionTime,
        int timedInvokeTimeoutMs) {
      recallScene(chipClusterPtr, callback, groupId, sceneId, transitionTime, timedInvokeTimeoutMs);
    }

    public void getSceneMembership(GetSceneMembershipResponseCallback callback, Integer groupId) {
      getSceneMembership(chipClusterPtr, callback, groupId, null);
    }

    public void getSceneMembership(
        GetSceneMembershipResponseCallback callback, Integer groupId, int timedInvokeTimeoutMs) {
      getSceneMembership(chipClusterPtr, callback, groupId, timedInvokeTimeoutMs);
    }

    private native void addScene(
        long chipClusterPtr,
        AddSceneResponseCallback Callback,
        Integer groupId,
        Integer sceneId,
        Integer transitionTime,
        String sceneName,
        ArrayList<ChipStructs.ScenesClusterExtensionFieldSet> extensionFieldSets,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void viewScene(
        long chipClusterPtr,
        ViewSceneResponseCallback Callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeScene(
        long chipClusterPtr,
        RemoveSceneResponseCallback Callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeAllScenes(
        long chipClusterPtr,
        RemoveAllScenesResponseCallback Callback,
        Integer groupId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void storeScene(
        long chipClusterPtr,
        StoreSceneResponseCallback Callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void recallScene(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Optional<Integer> transitionTime,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getSceneMembership(
        long chipClusterPtr,
        GetSceneMembershipResponseCallback Callback,
        Integer groupId,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface AddSceneResponseCallback {
      void onSuccess(Integer status, Integer groupId, Integer sceneId);

      void onError(Exception error);
    }

    public interface ViewSceneResponseCallback {
      void onSuccess(
          Integer status,
          Integer groupId,
          Integer sceneId,
          Optional<Integer> transitionTime,
          Optional<String> sceneName,
          Optional<ArrayList<ChipStructs.ScenesClusterExtensionFieldSet>> extensionFieldSets);

      void onError(Exception error);
    }

    public interface RemoveSceneResponseCallback {
      void onSuccess(Integer status, Integer groupId, Integer sceneId);

      void onError(Exception error);
    }

    public interface RemoveAllScenesResponseCallback {
      void onSuccess(Integer status, Integer groupId);

      void onError(Exception error);
    }

    public interface StoreSceneResponseCallback {
      void onSuccess(Integer status, Integer groupId, Integer sceneId);

      void onError(Exception error);
    }

    public interface GetSceneMembershipResponseCallback {
      void onSuccess(
          Integer status,
          @Nullable Integer capacity,
          Integer groupId,
          Optional<ArrayList<Integer>> sceneList);

      void onError(Exception error);
    }

    public interface CurrentGroupAttributeCallback {
      void onSuccess(Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readSceneCountAttribute(IntegerAttributeCallback callback) {
      readSceneCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeSceneCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSceneCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentSceneAttribute(IntegerAttributeCallback callback) {
      readCurrentSceneAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentSceneAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentSceneAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentGroupAttribute(CurrentGroupAttributeCallback callback) {
      readCurrentGroupAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentGroupAttribute(
        CurrentGroupAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentGroupAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSceneValidAttribute(BooleanAttributeCallback callback) {
      readSceneValidAttribute(chipClusterPtr, callback);
    }

    public void subscribeSceneValidAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSceneValidAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNameSupportAttribute(IntegerAttributeCallback callback) {
      readNameSupportAttribute(chipClusterPtr, callback);
    }

    public void subscribeNameSupportAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNameSupportAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readSceneCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSceneCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentSceneAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentSceneAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentGroupAttribute(
        long chipClusterPtr, CurrentGroupAttributeCallback callback);

    private native void subscribeCurrentGroupAttribute(
        long chipClusterPtr,
        CurrentGroupAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSceneValidAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeSceneValidAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNameSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNameSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OnOffCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 6L;

    public OnOffCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void off(DefaultClusterCallback callback) {
      off(chipClusterPtr, callback, null);
    }

    public void off(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      off(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void on(DefaultClusterCallback callback) {
      on(chipClusterPtr, callback, null);
    }

    public void on(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      on(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void toggle(DefaultClusterCallback callback) {
      toggle(chipClusterPtr, callback, null);
    }

    public void toggle(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      toggle(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void offWithEffect(
        DefaultClusterCallback callback, Integer effectId, Integer effectVariant) {
      offWithEffect(chipClusterPtr, callback, effectId, effectVariant, null);
    }

    public void offWithEffect(
        DefaultClusterCallback callback,
        Integer effectId,
        Integer effectVariant,
        int timedInvokeTimeoutMs) {
      offWithEffect(chipClusterPtr, callback, effectId, effectVariant, timedInvokeTimeoutMs);
    }

    public void onWithRecallGlobalScene(DefaultClusterCallback callback) {
      onWithRecallGlobalScene(chipClusterPtr, callback, null);
    }

    public void onWithRecallGlobalScene(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      onWithRecallGlobalScene(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void onWithTimedOff(
        DefaultClusterCallback callback,
        Integer onOffControl,
        Integer onTime,
        Integer offWaitTime) {
      onWithTimedOff(chipClusterPtr, callback, onOffControl, onTime, offWaitTime, null);
    }

    public void onWithTimedOff(
        DefaultClusterCallback callback,
        Integer onOffControl,
        Integer onTime,
        Integer offWaitTime,
        int timedInvokeTimeoutMs) {
      onWithTimedOff(
          chipClusterPtr, callback, onOffControl, onTime, offWaitTime, timedInvokeTimeoutMs);
    }

    private native void off(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void on(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void toggle(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void offWithEffect(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer effectId,
        Integer effectVariant,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void onWithRecallGlobalScene(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void onWithTimedOff(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer onOffControl,
        Integer onTime,
        Integer offWaitTime,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface StartUpOnOffAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readOnOffAttribute(BooleanAttributeCallback callback) {
      readOnOffAttribute(chipClusterPtr, callback);
    }

    public void subscribeOnOffAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnOffAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGlobalSceneControlAttribute(BooleanAttributeCallback callback) {
      readGlobalSceneControlAttribute(chipClusterPtr, callback);
    }

    public void subscribeGlobalSceneControlAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGlobalSceneControlAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOnTimeAttribute(IntegerAttributeCallback callback) {
      readOnTimeAttribute(chipClusterPtr, callback);
    }

    public void writeOnTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOnTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOnTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOnTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOnTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOffWaitTimeAttribute(IntegerAttributeCallback callback) {
      readOffWaitTimeAttribute(chipClusterPtr, callback);
    }

    public void writeOffWaitTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOffWaitTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOffWaitTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOffWaitTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOffWaitTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOffWaitTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartUpOnOffAttribute(StartUpOnOffAttributeCallback callback) {
      readStartUpOnOffAttribute(chipClusterPtr, callback);
    }

    public void writeStartUpOnOffAttribute(DefaultClusterCallback callback, Integer value) {
      writeStartUpOnOffAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeStartUpOnOffAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeStartUpOnOffAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeStartUpOnOffAttribute(
        StartUpOnOffAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartUpOnOffAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readOnOffAttribute(long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeOnOffAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGlobalSceneControlAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeGlobalSceneControlAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOnTimeAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOnTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOnTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOffWaitTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOffWaitTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOffWaitTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStartUpOnOffAttribute(
        long chipClusterPtr, StartUpOnOffAttributeCallback callback);

    private native void writeStartUpOnOffAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeStartUpOnOffAttribute(
        long chipClusterPtr,
        StartUpOnOffAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OnOffSwitchConfigurationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 7L;

    public OnOffSwitchConfigurationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readSwitchTypeAttribute(IntegerAttributeCallback callback) {
      readSwitchTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeSwitchTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSwitchTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSwitchActionsAttribute(IntegerAttributeCallback callback) {
      readSwitchActionsAttribute(chipClusterPtr, callback);
    }

    public void writeSwitchActionsAttribute(DefaultClusterCallback callback, Integer value) {
      writeSwitchActionsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeSwitchActionsAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeSwitchActionsAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeSwitchActionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSwitchActionsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readSwitchTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSwitchTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSwitchActionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeSwitchActionsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeSwitchActionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class LevelControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 8L;

    public LevelControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void moveToLevel(
        DefaultClusterCallback callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToLevel(
          chipClusterPtr, callback, level, transitionTime, optionsMask, optionsOverride, null);
    }

    public void moveToLevel(
        DefaultClusterCallback callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToLevel(
          chipClusterPtr,
          callback,
          level,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void move(
        DefaultClusterCallback callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride) {
      move(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
    }

    public void move(
        DefaultClusterCallback callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      move(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void step(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      step(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void step(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      step(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stop(
        DefaultClusterCallback callback, Integer optionsMask, Integer optionsOverride) {
      stop(chipClusterPtr, callback, optionsMask, optionsOverride, null);
    }

    public void stop(
        DefaultClusterCallback callback,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stop(chipClusterPtr, callback, optionsMask, optionsOverride, timedInvokeTimeoutMs);
    }

    public void moveToLevelWithOnOff(
        DefaultClusterCallback callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToLevelWithOnOff(
          chipClusterPtr, callback, level, transitionTime, optionsMask, optionsOverride, null);
    }

    public void moveToLevelWithOnOff(
        DefaultClusterCallback callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToLevelWithOnOff(
          chipClusterPtr,
          callback,
          level,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveWithOnOff(
        DefaultClusterCallback callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride) {
      moveWithOnOff(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
    }

    public void moveWithOnOff(
        DefaultClusterCallback callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveWithOnOff(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stepWithOnOff(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      stepWithOnOff(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void stepWithOnOff(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stepWithOnOff(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stopWithOnOff(
        DefaultClusterCallback callback, Integer optionsMask, Integer optionsOverride) {
      stopWithOnOff(chipClusterPtr, callback, optionsMask, optionsOverride, null);
    }

    public void stopWithOnOff(
        DefaultClusterCallback callback,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stopWithOnOff(chipClusterPtr, callback, optionsMask, optionsOverride, timedInvokeTimeoutMs);
    }

    private native void moveToLevel(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void move(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void step(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stop(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveToLevelWithOnOff(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveWithOnOff(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stepWithOnOff(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopWithOnOff(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface CurrentLevelAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface OnLevelAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface OnTransitionTimeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface OffTransitionTimeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface DefaultMoveRateAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface StartUpCurrentLevelAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readCurrentLevelAttribute(CurrentLevelAttributeCallback callback) {
      readCurrentLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentLevelAttribute(
        CurrentLevelAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRemainingTimeAttribute(IntegerAttributeCallback callback) {
      readRemainingTimeAttribute(chipClusterPtr, callback);
    }

    public void subscribeRemainingTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRemainingTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinLevelAttribute(IntegerAttributeCallback callback) {
      readMinLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxLevelAttribute(IntegerAttributeCallback callback) {
      readMaxLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentFrequencyAttribute(IntegerAttributeCallback callback) {
      readCurrentFrequencyAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentFrequencyAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentFrequencyAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinFrequencyAttribute(IntegerAttributeCallback callback) {
      readMinFrequencyAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinFrequencyAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinFrequencyAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxFrequencyAttribute(IntegerAttributeCallback callback) {
      readMaxFrequencyAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxFrequencyAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxFrequencyAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOptionsAttribute(IntegerAttributeCallback callback) {
      readOptionsAttribute(chipClusterPtr, callback);
    }

    public void writeOptionsAttribute(DefaultClusterCallback callback, Integer value) {
      writeOptionsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOptionsAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOptionsAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOptionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOptionsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOnOffTransitionTimeAttribute(IntegerAttributeCallback callback) {
      readOnOffTransitionTimeAttribute(chipClusterPtr, callback);
    }

    public void writeOnOffTransitionTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOnOffTransitionTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOnOffTransitionTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOnOffTransitionTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOnOffTransitionTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnOffTransitionTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOnLevelAttribute(OnLevelAttributeCallback callback) {
      readOnLevelAttribute(chipClusterPtr, callback);
    }

    public void writeOnLevelAttribute(DefaultClusterCallback callback, Integer value) {
      writeOnLevelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOnLevelAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOnLevelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOnLevelAttribute(
        OnLevelAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOnTransitionTimeAttribute(OnTransitionTimeAttributeCallback callback) {
      readOnTransitionTimeAttribute(chipClusterPtr, callback);
    }

    public void writeOnTransitionTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOnTransitionTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOnTransitionTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOnTransitionTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOnTransitionTimeAttribute(
        OnTransitionTimeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnTransitionTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOffTransitionTimeAttribute(OffTransitionTimeAttributeCallback callback) {
      readOffTransitionTimeAttribute(chipClusterPtr, callback);
    }

    public void writeOffTransitionTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOffTransitionTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOffTransitionTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOffTransitionTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOffTransitionTimeAttribute(
        OffTransitionTimeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOffTransitionTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDefaultMoveRateAttribute(DefaultMoveRateAttributeCallback callback) {
      readDefaultMoveRateAttribute(chipClusterPtr, callback);
    }

    public void writeDefaultMoveRateAttribute(DefaultClusterCallback callback, Integer value) {
      writeDefaultMoveRateAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeDefaultMoveRateAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeDefaultMoveRateAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeDefaultMoveRateAttribute(
        DefaultMoveRateAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDefaultMoveRateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartUpCurrentLevelAttribute(StartUpCurrentLevelAttributeCallback callback) {
      readStartUpCurrentLevelAttribute(chipClusterPtr, callback);
    }

    public void writeStartUpCurrentLevelAttribute(DefaultClusterCallback callback, Integer value) {
      writeStartUpCurrentLevelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeStartUpCurrentLevelAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeStartUpCurrentLevelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeStartUpCurrentLevelAttribute(
        StartUpCurrentLevelAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartUpCurrentLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readCurrentLevelAttribute(
        long chipClusterPtr, CurrentLevelAttributeCallback callback);

    private native void subscribeCurrentLevelAttribute(
        long chipClusterPtr,
        CurrentLevelAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readRemainingTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRemainingTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMinFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOptionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOptionsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOptionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOnOffTransitionTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOnOffTransitionTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOnOffTransitionTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOnLevelAttribute(
        long chipClusterPtr, OnLevelAttributeCallback callback);

    private native void writeOnLevelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOnLevelAttribute(
        long chipClusterPtr, OnLevelAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOnTransitionTimeAttribute(
        long chipClusterPtr, OnTransitionTimeAttributeCallback callback);

    private native void writeOnTransitionTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOnTransitionTimeAttribute(
        long chipClusterPtr,
        OnTransitionTimeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOffTransitionTimeAttribute(
        long chipClusterPtr, OffTransitionTimeAttributeCallback callback);

    private native void writeOffTransitionTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOffTransitionTimeAttribute(
        long chipClusterPtr,
        OffTransitionTimeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readDefaultMoveRateAttribute(
        long chipClusterPtr, DefaultMoveRateAttributeCallback callback);

    private native void writeDefaultMoveRateAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeDefaultMoveRateAttribute(
        long chipClusterPtr,
        DefaultMoveRateAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readStartUpCurrentLevelAttribute(
        long chipClusterPtr, StartUpCurrentLevelAttributeCallback callback);

    private native void writeStartUpCurrentLevelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeStartUpCurrentLevelAttribute(
        long chipClusterPtr,
        StartUpCurrentLevelAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BinaryInputBasicCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 15L;

    public BinaryInputBasicCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readOutOfServiceAttribute(BooleanAttributeCallback callback) {
      readOutOfServiceAttribute(chipClusterPtr, callback);
    }

    public void writeOutOfServiceAttribute(DefaultClusterCallback callback, Boolean value) {
      writeOutOfServiceAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOutOfServiceAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeOutOfServiceAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOutOfServiceAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOutOfServiceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPresentValueAttribute(BooleanAttributeCallback callback) {
      readPresentValueAttribute(chipClusterPtr, callback);
    }

    public void writePresentValueAttribute(DefaultClusterCallback callback, Boolean value) {
      writePresentValueAttribute(chipClusterPtr, callback, value, null);
    }

    public void writePresentValueAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writePresentValueAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribePresentValueAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePresentValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStatusFlagsAttribute(IntegerAttributeCallback callback) {
      readStatusFlagsAttribute(chipClusterPtr, callback);
    }

    public void subscribeStatusFlagsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStatusFlagsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readOutOfServiceAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeOutOfServiceAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOutOfServiceAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPresentValueAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writePresentValueAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribePresentValueAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStatusFlagsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeStatusFlagsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class DescriptorCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 29L;

    public DescriptorCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface DeviceListAttributeCallback {
      void onSuccess(List<ChipStructs.DescriptorClusterDeviceType> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ServerListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ClientListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PartsListAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readDeviceListAttribute(DeviceListAttributeCallback callback) {
      readDeviceListAttribute(chipClusterPtr, callback);
    }

    public void subscribeDeviceListAttribute(
        DeviceListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDeviceListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readServerListAttribute(ServerListAttributeCallback callback) {
      readServerListAttribute(chipClusterPtr, callback);
    }

    public void subscribeServerListAttribute(
        ServerListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeServerListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClientListAttribute(ClientListAttributeCallback callback) {
      readClientListAttribute(chipClusterPtr, callback);
    }

    public void subscribeClientListAttribute(
        ClientListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClientListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPartsListAttribute(PartsListAttributeCallback callback) {
      readPartsListAttribute(chipClusterPtr, callback);
    }

    public void subscribePartsListAttribute(
        PartsListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePartsListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readDeviceListAttribute(
        long chipClusterPtr, DeviceListAttributeCallback callback);

    private native void subscribeDeviceListAttribute(
        long chipClusterPtr,
        DeviceListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readServerListAttribute(
        long chipClusterPtr, ServerListAttributeCallback callback);

    private native void subscribeServerListAttribute(
        long chipClusterPtr,
        ServerListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readClientListAttribute(
        long chipClusterPtr, ClientListAttributeCallback callback);

    private native void subscribeClientListAttribute(
        long chipClusterPtr,
        ClientListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPartsListAttribute(
        long chipClusterPtr, PartsListAttributeCallback callback);

    private native void subscribePartsListAttribute(
        long chipClusterPtr, PartsListAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BindingCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 30L;

    public BindingCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface BindingAttributeCallback {
      void onSuccess(List<ChipStructs.BindingClusterTargetStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readBindingAttribute(BindingAttributeCallback callback) {
      readBindingAttribute(chipClusterPtr, callback);
    }

    public void writeBindingAttribute(
        DefaultClusterCallback callback, ArrayList<ChipStructs.BindingClusterTargetStruct> value) {
      writeBindingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeBindingAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.BindingClusterTargetStruct> value,
        int timedWriteTimeoutMs) {
      writeBindingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBindingAttribute(
        BindingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBindingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readBindingAttribute(
        long chipClusterPtr, BindingAttributeCallback callback);

    private native void writeBindingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.BindingClusterTargetStruct> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBindingAttribute(
        long chipClusterPtr, BindingAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class AccessControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 31L;

    public AccessControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface AclAttributeCallback {
      void onSuccess(List<ChipStructs.AccessControlClusterAccessControlEntry> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ExtensionAttributeCallback {
      void onSuccess(List<ChipStructs.AccessControlClusterExtensionEntry> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readAclAttribute(AclAttributeCallback callback) {
      readAclAttribute(chipClusterPtr, callback);
    }

    public void writeAclAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterAccessControlEntry> value) {
      writeAclAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeAclAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterAccessControlEntry> value,
        int timedWriteTimeoutMs) {
      writeAclAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeAclAttribute(
        AclAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAclAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readExtensionAttribute(ExtensionAttributeCallback callback) {
      readExtensionAttribute(chipClusterPtr, callback);
    }

    public void writeExtensionAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterExtensionEntry> value) {
      writeExtensionAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeExtensionAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterExtensionEntry> value,
        int timedWriteTimeoutMs) {
      writeExtensionAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeExtensionAttribute(
        ExtensionAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeExtensionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSubjectsPerAccessControlEntryAttribute(IntegerAttributeCallback callback) {
      readSubjectsPerAccessControlEntryAttribute(chipClusterPtr, callback);
    }

    public void subscribeSubjectsPerAccessControlEntryAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSubjectsPerAccessControlEntryAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTargetsPerAccessControlEntryAttribute(IntegerAttributeCallback callback) {
      readTargetsPerAccessControlEntryAttribute(chipClusterPtr, callback);
    }

    public void subscribeTargetsPerAccessControlEntryAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTargetsPerAccessControlEntryAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAccessControlEntriesPerFabricAttribute(IntegerAttributeCallback callback) {
      readAccessControlEntriesPerFabricAttribute(chipClusterPtr, callback);
    }

    public void subscribeAccessControlEntriesPerFabricAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAccessControlEntriesPerFabricAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readAclAttribute(long chipClusterPtr, AclAttributeCallback callback);

    private native void writeAclAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterAccessControlEntry> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeAclAttribute(
        long chipClusterPtr, AclAttributeCallback callback, int minInterval, int maxInterval);

    private native void readExtensionAttribute(
        long chipClusterPtr, ExtensionAttributeCallback callback);

    private native void writeExtensionAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterExtensionEntry> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeExtensionAttribute(
        long chipClusterPtr, ExtensionAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSubjectsPerAccessControlEntryAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSubjectsPerAccessControlEntryAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTargetsPerAccessControlEntryAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeTargetsPerAccessControlEntryAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAccessControlEntriesPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAccessControlEntriesPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BridgedActionsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 37L;

    public BridgedActionsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void instantAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      instantAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void instantAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      instantAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void instantActionWithTransition(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Integer transitionTime) {
      instantActionWithTransition(
          chipClusterPtr, callback, actionID, invokeID, transitionTime, null);
    }

    public void instantActionWithTransition(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Integer transitionTime,
        int timedInvokeTimeoutMs) {
      instantActionWithTransition(
          chipClusterPtr, callback, actionID, invokeID, transitionTime, timedInvokeTimeoutMs);
    }

    public void startAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      startAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void startAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      startAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void startActionWithDuration(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID, Long duration) {
      startActionWithDuration(chipClusterPtr, callback, actionID, invokeID, duration, null);
    }

    public void startActionWithDuration(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        int timedInvokeTimeoutMs) {
      startActionWithDuration(
          chipClusterPtr, callback, actionID, invokeID, duration, timedInvokeTimeoutMs);
    }

    public void stopAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      stopAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void stopAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      stopAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void pauseAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      pauseAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void pauseAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      pauseAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void pauseActionWithDuration(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID, Long duration) {
      pauseActionWithDuration(chipClusterPtr, callback, actionID, invokeID, duration, null);
    }

    public void pauseActionWithDuration(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        int timedInvokeTimeoutMs) {
      pauseActionWithDuration(
          chipClusterPtr, callback, actionID, invokeID, duration, timedInvokeTimeoutMs);
    }

    public void resumeAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      resumeAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void resumeAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      resumeAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void enableAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      enableAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void enableAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      enableAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void enableActionWithDuration(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID, Long duration) {
      enableActionWithDuration(chipClusterPtr, callback, actionID, invokeID, duration, null);
    }

    public void enableActionWithDuration(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        int timedInvokeTimeoutMs) {
      enableActionWithDuration(
          chipClusterPtr, callback, actionID, invokeID, duration, timedInvokeTimeoutMs);
    }

    public void disableAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      disableAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void disableAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      disableAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void disableActionWithDuration(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID, Long duration) {
      disableActionWithDuration(chipClusterPtr, callback, actionID, invokeID, duration, null);
    }

    public void disableActionWithDuration(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        int timedInvokeTimeoutMs) {
      disableActionWithDuration(
          chipClusterPtr, callback, actionID, invokeID, duration, timedInvokeTimeoutMs);
    }

    private native void instantAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void instantActionWithTransition(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        Integer transitionTime,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void startAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void startActionWithDuration(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void pauseAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void pauseActionWithDuration(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void resumeAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enableAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enableActionWithDuration(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void disableAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void disableActionWithDuration(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ActionListAttributeCallback {
      void onSuccess(List<ChipStructs.BridgedActionsClusterActionStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface EndpointListAttributeCallback {
      void onSuccess(List<ChipStructs.BridgedActionsClusterEndpointListStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readActionListAttribute(ActionListAttributeCallback callback) {
      readActionListAttribute(chipClusterPtr, callback);
    }

    public void subscribeActionListAttribute(
        ActionListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActionListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEndpointListAttribute(EndpointListAttributeCallback callback) {
      readEndpointListAttribute(chipClusterPtr, callback);
    }

    public void subscribeEndpointListAttribute(
        EndpointListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEndpointListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSetupUrlAttribute(CharStringAttributeCallback callback) {
      readSetupUrlAttribute(chipClusterPtr, callback);
    }

    public void subscribeSetupUrlAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSetupUrlAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readActionListAttribute(
        long chipClusterPtr, ActionListAttributeCallback callback);

    private native void subscribeActionListAttribute(
        long chipClusterPtr,
        ActionListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readEndpointListAttribute(
        long chipClusterPtr, EndpointListAttributeCallback callback);

    private native void subscribeEndpointListAttribute(
        long chipClusterPtr,
        EndpointListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSetupUrlAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeSetupUrlAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BasicCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 40L;

    public BasicCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface VendorIDAttributeCallback {
      void onSuccess(Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readDataModelRevisionAttribute(IntegerAttributeCallback callback) {
      readDataModelRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeDataModelRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDataModelRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readVendorNameAttribute(CharStringAttributeCallback callback) {
      readVendorNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readVendorIDAttribute(VendorIDAttributeCallback callback) {
      readVendorIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorIDAttribute(
        VendorIDAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductNameAttribute(CharStringAttributeCallback callback) {
      readProductNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductIDAttribute(IntegerAttributeCallback callback) {
      readProductIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductIDAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNodeLabelAttribute(CharStringAttributeCallback callback) {
      readNodeLabelAttribute(chipClusterPtr, callback);
    }

    public void writeNodeLabelAttribute(DefaultClusterCallback callback, String value) {
      writeNodeLabelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNodeLabelAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeNodeLabelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNodeLabelAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNodeLabelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLocationAttribute(CharStringAttributeCallback callback) {
      readLocationAttribute(chipClusterPtr, callback);
    }

    public void writeLocationAttribute(DefaultClusterCallback callback, String value) {
      writeLocationAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLocationAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeLocationAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLocationAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLocationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readHardwareVersionAttribute(IntegerAttributeCallback callback) {
      readHardwareVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeHardwareVersionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeHardwareVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readHardwareVersionStringAttribute(CharStringAttributeCallback callback) {
      readHardwareVersionStringAttribute(chipClusterPtr, callback);
    }

    public void subscribeHardwareVersionStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeHardwareVersionStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSoftwareVersionAttribute(LongAttributeCallback callback) {
      readSoftwareVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeSoftwareVersionAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSoftwareVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSoftwareVersionStringAttribute(CharStringAttributeCallback callback) {
      readSoftwareVersionStringAttribute(chipClusterPtr, callback);
    }

    public void subscribeSoftwareVersionStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSoftwareVersionStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readManufacturingDateAttribute(CharStringAttributeCallback callback) {
      readManufacturingDateAttribute(chipClusterPtr, callback);
    }

    public void subscribeManufacturingDateAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeManufacturingDateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPartNumberAttribute(CharStringAttributeCallback callback) {
      readPartNumberAttribute(chipClusterPtr, callback);
    }

    public void subscribePartNumberAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePartNumberAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductURLAttribute(CharStringAttributeCallback callback) {
      readProductURLAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductURLAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductURLAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductLabelAttribute(CharStringAttributeCallback callback) {
      readProductLabelAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductLabelAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductLabelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSerialNumberAttribute(CharStringAttributeCallback callback) {
      readSerialNumberAttribute(chipClusterPtr, callback);
    }

    public void subscribeSerialNumberAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSerialNumberAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLocalConfigDisabledAttribute(BooleanAttributeCallback callback) {
      readLocalConfigDisabledAttribute(chipClusterPtr, callback);
    }

    public void writeLocalConfigDisabledAttribute(DefaultClusterCallback callback, Boolean value) {
      writeLocalConfigDisabledAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLocalConfigDisabledAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeLocalConfigDisabledAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLocalConfigDisabledAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLocalConfigDisabledAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readReachableAttribute(BooleanAttributeCallback callback) {
      readReachableAttribute(chipClusterPtr, callback);
    }

    public void subscribeReachableAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeReachableAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUniqueIDAttribute(CharStringAttributeCallback callback) {
      readUniqueIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeUniqueIDAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUniqueIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readDataModelRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeDataModelRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readVendorNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeVendorNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback);

    private native void subscribeVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback, int minInterval, int maxInterval);

    private native void readProductNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductIDAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeProductIDAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNodeLabelAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeNodeLabelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNodeLabelAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLocationAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeLocationAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLocationAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readHardwareVersionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeHardwareVersionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readHardwareVersionStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeHardwareVersionStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSoftwareVersionAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeSoftwareVersionAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSoftwareVersionStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeSoftwareVersionStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readManufacturingDateAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeManufacturingDateAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPartNumberAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribePartNumberAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductURLAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductURLAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductLabelAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductLabelAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSerialNumberAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeSerialNumberAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLocalConfigDisabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeLocalConfigDisabledAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLocalConfigDisabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readReachableAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeReachableAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUniqueIDAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeUniqueIDAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OtaSoftwareUpdateProviderCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 41L;

    public OtaSoftwareUpdateProviderCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void queryImage(
        QueryImageResponseCallback callback,
        Integer vendorId,
        Integer productId,
        Long softwareVersion,
        ArrayList<Integer> protocolsSupported,
        Optional<Integer> hardwareVersion,
        Optional<String> location,
        Optional<Boolean> requestorCanConsent,
        Optional<byte[]> metadataForProvider) {
      queryImage(
          chipClusterPtr,
          callback,
          vendorId,
          productId,
          softwareVersion,
          protocolsSupported,
          hardwareVersion,
          location,
          requestorCanConsent,
          metadataForProvider,
          null);
    }

    public void queryImage(
        QueryImageResponseCallback callback,
        Integer vendorId,
        Integer productId,
        Long softwareVersion,
        ArrayList<Integer> protocolsSupported,
        Optional<Integer> hardwareVersion,
        Optional<String> location,
        Optional<Boolean> requestorCanConsent,
        Optional<byte[]> metadataForProvider,
        int timedInvokeTimeoutMs) {
      queryImage(
          chipClusterPtr,
          callback,
          vendorId,
          productId,
          softwareVersion,
          protocolsSupported,
          hardwareVersion,
          location,
          requestorCanConsent,
          metadataForProvider,
          timedInvokeTimeoutMs);
    }

    public void applyUpdateRequest(
        ApplyUpdateResponseCallback callback, byte[] updateToken, Long newVersion) {
      applyUpdateRequest(chipClusterPtr, callback, updateToken, newVersion, null);
    }

    public void applyUpdateRequest(
        ApplyUpdateResponseCallback callback,
        byte[] updateToken,
        Long newVersion,
        int timedInvokeTimeoutMs) {
      applyUpdateRequest(chipClusterPtr, callback, updateToken, newVersion, timedInvokeTimeoutMs);
    }

    public void notifyUpdateApplied(
        DefaultClusterCallback callback, byte[] updateToken, Long softwareVersion) {
      notifyUpdateApplied(chipClusterPtr, callback, updateToken, softwareVersion, null);
    }

    public void notifyUpdateApplied(
        DefaultClusterCallback callback,
        byte[] updateToken,
        Long softwareVersion,
        int timedInvokeTimeoutMs) {
      notifyUpdateApplied(
          chipClusterPtr, callback, updateToken, softwareVersion, timedInvokeTimeoutMs);
    }

    private native void queryImage(
        long chipClusterPtr,
        QueryImageResponseCallback Callback,
        Integer vendorId,
        Integer productId,
        Long softwareVersion,
        ArrayList<Integer> protocolsSupported,
        Optional<Integer> hardwareVersion,
        Optional<String> location,
        Optional<Boolean> requestorCanConsent,
        Optional<byte[]> metadataForProvider,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void applyUpdateRequest(
        long chipClusterPtr,
        ApplyUpdateResponseCallback Callback,
        byte[] updateToken,
        Long newVersion,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void notifyUpdateApplied(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        byte[] updateToken,
        Long softwareVersion,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface QueryImageResponseCallback {
      void onSuccess(
          Integer status,
          Optional<Long> delayedActionTime,
          Optional<String> imageURI,
          Optional<Long> softwareVersion,
          Optional<String> softwareVersionString,
          Optional<byte[]> updateToken,
          Optional<Boolean> userConsentNeeded,
          Optional<byte[]> metadataForRequestor);

      void onError(Exception error);
    }

    public interface ApplyUpdateResponseCallback {
      void onSuccess(Integer action, Long delayedActionTime);

      void onError(Exception error);
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OtaSoftwareUpdateRequestorCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 42L;

    public OtaSoftwareUpdateRequestorCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void announceOtaProvider(
        DefaultClusterCallback callback,
        Long providerNodeId,
        Integer vendorId,
        Integer announcementReason,
        Optional<byte[]> metadataForNode,
        Integer endpoint) {
      announceOtaProvider(
          chipClusterPtr,
          callback,
          providerNodeId,
          vendorId,
          announcementReason,
          metadataForNode,
          endpoint,
          null);
    }

    public void announceOtaProvider(
        DefaultClusterCallback callback,
        Long providerNodeId,
        Integer vendorId,
        Integer announcementReason,
        Optional<byte[]> metadataForNode,
        Integer endpoint,
        int timedInvokeTimeoutMs) {
      announceOtaProvider(
          chipClusterPtr,
          callback,
          providerNodeId,
          vendorId,
          announcementReason,
          metadataForNode,
          endpoint,
          timedInvokeTimeoutMs);
    }

    private native void announceOtaProvider(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Long providerNodeId,
        Integer vendorId,
        Integer announcementReason,
        Optional<byte[]> metadataForNode,
        Integer endpoint,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface DefaultOtaProvidersAttributeCallback {
      void onSuccess(List<ChipStructs.OtaSoftwareUpdateRequestorClusterProviderLocation> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface UpdateStateProgressAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readDefaultOtaProvidersAttribute(DefaultOtaProvidersAttributeCallback callback) {
      readDefaultOtaProvidersAttribute(chipClusterPtr, callback);
    }

    public void writeDefaultOtaProvidersAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.OtaSoftwareUpdateRequestorClusterProviderLocation> value) {
      writeDefaultOtaProvidersAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeDefaultOtaProvidersAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.OtaSoftwareUpdateRequestorClusterProviderLocation> value,
        int timedWriteTimeoutMs) {
      writeDefaultOtaProvidersAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeDefaultOtaProvidersAttribute(
        DefaultOtaProvidersAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDefaultOtaProvidersAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUpdatePossibleAttribute(BooleanAttributeCallback callback) {
      readUpdatePossibleAttribute(chipClusterPtr, callback);
    }

    public void subscribeUpdatePossibleAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUpdatePossibleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUpdateStateAttribute(IntegerAttributeCallback callback) {
      readUpdateStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeUpdateStateAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUpdateStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUpdateStateProgressAttribute(UpdateStateProgressAttributeCallback callback) {
      readUpdateStateProgressAttribute(chipClusterPtr, callback);
    }

    public void subscribeUpdateStateProgressAttribute(
        UpdateStateProgressAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUpdateStateProgressAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readDefaultOtaProvidersAttribute(
        long chipClusterPtr, DefaultOtaProvidersAttributeCallback callback);

    private native void writeDefaultOtaProvidersAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.OtaSoftwareUpdateRequestorClusterProviderLocation> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeDefaultOtaProvidersAttribute(
        long chipClusterPtr,
        DefaultOtaProvidersAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readUpdatePossibleAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeUpdatePossibleAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUpdateStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeUpdateStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUpdateStateProgressAttribute(
        long chipClusterPtr, UpdateStateProgressAttributeCallback callback);

    private native void subscribeUpdateStateProgressAttribute(
        long chipClusterPtr,
        UpdateStateProgressAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class LocalizationConfigurationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 43L;

    public LocalizationConfigurationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface SupportedLocalesAttributeCallback {
      void onSuccess(List<String> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readActiveLocaleAttribute(CharStringAttributeCallback callback) {
      readActiveLocaleAttribute(chipClusterPtr, callback);
    }

    public void writeActiveLocaleAttribute(DefaultClusterCallback callback, String value) {
      writeActiveLocaleAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeActiveLocaleAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeActiveLocaleAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeActiveLocaleAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveLocaleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedLocalesAttribute(SupportedLocalesAttributeCallback callback) {
      readSupportedLocalesAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportedLocalesAttribute(
        SupportedLocalesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedLocalesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readActiveLocaleAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeActiveLocaleAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeActiveLocaleAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSupportedLocalesAttribute(
        long chipClusterPtr, SupportedLocalesAttributeCallback callback);

    private native void subscribeSupportedLocalesAttribute(
        long chipClusterPtr,
        SupportedLocalesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class TimeFormatLocalizationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 44L;

    public TimeFormatLocalizationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface SupportedCalendarTypesAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readHourFormatAttribute(IntegerAttributeCallback callback) {
      readHourFormatAttribute(chipClusterPtr, callback);
    }

    public void writeHourFormatAttribute(DefaultClusterCallback callback, Integer value) {
      writeHourFormatAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeHourFormatAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeHourFormatAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeHourFormatAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeHourFormatAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveCalendarTypeAttribute(IntegerAttributeCallback callback) {
      readActiveCalendarTypeAttribute(chipClusterPtr, callback);
    }

    public void writeActiveCalendarTypeAttribute(DefaultClusterCallback callback, Integer value) {
      writeActiveCalendarTypeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeActiveCalendarTypeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeActiveCalendarTypeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeActiveCalendarTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveCalendarTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedCalendarTypesAttribute(
        SupportedCalendarTypesAttributeCallback callback) {
      readSupportedCalendarTypesAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportedCalendarTypesAttribute(
        SupportedCalendarTypesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedCalendarTypesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readHourFormatAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeHourFormatAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeHourFormatAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActiveCalendarTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeActiveCalendarTypeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeActiveCalendarTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSupportedCalendarTypesAttribute(
        long chipClusterPtr, SupportedCalendarTypesAttributeCallback callback);

    private native void subscribeSupportedCalendarTypesAttribute(
        long chipClusterPtr,
        SupportedCalendarTypesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class UnitLocalizationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 45L;

    public UnitLocalizationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readTemperatureUnitAttribute(IntegerAttributeCallback callback) {
      readTemperatureUnitAttribute(chipClusterPtr, callback);
    }

    public void writeTemperatureUnitAttribute(DefaultClusterCallback callback, Integer value) {
      writeTemperatureUnitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeTemperatureUnitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeTemperatureUnitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeTemperatureUnitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTemperatureUnitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readTemperatureUnitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeTemperatureUnitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeTemperatureUnitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class PowerSourceConfigurationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 46L;

    public PowerSourceConfigurationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface SourcesAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readSourcesAttribute(SourcesAttributeCallback callback) {
      readSourcesAttribute(chipClusterPtr, callback);
    }

    public void subscribeSourcesAttribute(
        SourcesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSourcesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readSourcesAttribute(
        long chipClusterPtr, SourcesAttributeCallback callback);

    private native void subscribeSourcesAttribute(
        long chipClusterPtr, SourcesAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class PowerSourceCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 47L;

    public PowerSourceCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface WiredAssessedInputVoltageAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface WiredAssessedInputFrequencyAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface WiredAssessedCurrentAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveWiredFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BatVoltageAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BatPercentRemainingAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BatTimeRemainingAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveBatFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BatTimeToFullChargeAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BatChargingCurrentAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveBatChargeFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readStatusAttribute(IntegerAttributeCallback callback) {
      readStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOrderAttribute(IntegerAttributeCallback callback) {
      readOrderAttribute(chipClusterPtr, callback);
    }

    public void subscribeOrderAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOrderAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDescriptionAttribute(CharStringAttributeCallback callback) {
      readDescriptionAttribute(chipClusterPtr, callback);
    }

    public void subscribeDescriptionAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDescriptionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredAssessedInputVoltageAttribute(
        WiredAssessedInputVoltageAttributeCallback callback) {
      readWiredAssessedInputVoltageAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredAssessedInputVoltageAttribute(
        WiredAssessedInputVoltageAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredAssessedInputVoltageAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredAssessedInputFrequencyAttribute(
        WiredAssessedInputFrequencyAttributeCallback callback) {
      readWiredAssessedInputFrequencyAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredAssessedInputFrequencyAttribute(
        WiredAssessedInputFrequencyAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredAssessedInputFrequencyAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredCurrentTypeAttribute(IntegerAttributeCallback callback) {
      readWiredCurrentTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredCurrentTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredCurrentTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredAssessedCurrentAttribute(WiredAssessedCurrentAttributeCallback callback) {
      readWiredAssessedCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredAssessedCurrentAttribute(
        WiredAssessedCurrentAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredAssessedCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredNominalVoltageAttribute(LongAttributeCallback callback) {
      readWiredNominalVoltageAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredNominalVoltageAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredNominalVoltageAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredMaximumCurrentAttribute(LongAttributeCallback callback) {
      readWiredMaximumCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredMaximumCurrentAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredMaximumCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredPresentAttribute(BooleanAttributeCallback callback) {
      readWiredPresentAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredPresentAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredPresentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveWiredFaultsAttribute(ActiveWiredFaultsAttributeCallback callback) {
      readActiveWiredFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveWiredFaultsAttribute(
        ActiveWiredFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveWiredFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatVoltageAttribute(BatVoltageAttributeCallback callback) {
      readBatVoltageAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatVoltageAttribute(
        BatVoltageAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatVoltageAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatPercentRemainingAttribute(BatPercentRemainingAttributeCallback callback) {
      readBatPercentRemainingAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatPercentRemainingAttribute(
        BatPercentRemainingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatPercentRemainingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatTimeRemainingAttribute(BatTimeRemainingAttributeCallback callback) {
      readBatTimeRemainingAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatTimeRemainingAttribute(
        BatTimeRemainingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatTimeRemainingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatChargeLevelAttribute(IntegerAttributeCallback callback) {
      readBatChargeLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatChargeLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatChargeLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatReplacementNeededAttribute(BooleanAttributeCallback callback) {
      readBatReplacementNeededAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatReplacementNeededAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatReplacementNeededAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatReplaceabilityAttribute(IntegerAttributeCallback callback) {
      readBatReplaceabilityAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatReplaceabilityAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatReplaceabilityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatPresentAttribute(BooleanAttributeCallback callback) {
      readBatPresentAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatPresentAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatPresentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveBatFaultsAttribute(ActiveBatFaultsAttributeCallback callback) {
      readActiveBatFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveBatFaultsAttribute(
        ActiveBatFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveBatFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatReplacementDescriptionAttribute(CharStringAttributeCallback callback) {
      readBatReplacementDescriptionAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatReplacementDescriptionAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatReplacementDescriptionAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatCommonDesignationAttribute(LongAttributeCallback callback) {
      readBatCommonDesignationAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatCommonDesignationAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatCommonDesignationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatANSIDesignationAttribute(CharStringAttributeCallback callback) {
      readBatANSIDesignationAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatANSIDesignationAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatANSIDesignationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatIECDesignationAttribute(CharStringAttributeCallback callback) {
      readBatIECDesignationAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatIECDesignationAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatIECDesignationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatApprovedChemistryAttribute(LongAttributeCallback callback) {
      readBatApprovedChemistryAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatApprovedChemistryAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatApprovedChemistryAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatCapacityAttribute(LongAttributeCallback callback) {
      readBatCapacityAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatCapacityAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatCapacityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatQuantityAttribute(IntegerAttributeCallback callback) {
      readBatQuantityAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatQuantityAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatQuantityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatChargeStateAttribute(IntegerAttributeCallback callback) {
      readBatChargeStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatChargeStateAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatChargeStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatTimeToFullChargeAttribute(BatTimeToFullChargeAttributeCallback callback) {
      readBatTimeToFullChargeAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatTimeToFullChargeAttribute(
        BatTimeToFullChargeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatTimeToFullChargeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatFunctionalWhileChargingAttribute(BooleanAttributeCallback callback) {
      readBatFunctionalWhileChargingAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatFunctionalWhileChargingAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatFunctionalWhileChargingAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatChargingCurrentAttribute(BatChargingCurrentAttributeCallback callback) {
      readBatChargingCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatChargingCurrentAttribute(
        BatChargingCurrentAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatChargingCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveBatChargeFaultsAttribute(
        ActiveBatChargeFaultsAttributeCallback callback) {
      readActiveBatChargeFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveBatChargeFaultsAttribute(
        ActiveBatChargeFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveBatChargeFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readStatusAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOrderAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeOrderAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readDescriptionAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeDescriptionAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWiredAssessedInputVoltageAttribute(
        long chipClusterPtr, WiredAssessedInputVoltageAttributeCallback callback);

    private native void subscribeWiredAssessedInputVoltageAttribute(
        long chipClusterPtr,
        WiredAssessedInputVoltageAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWiredAssessedInputFrequencyAttribute(
        long chipClusterPtr, WiredAssessedInputFrequencyAttributeCallback callback);

    private native void subscribeWiredAssessedInputFrequencyAttribute(
        long chipClusterPtr,
        WiredAssessedInputFrequencyAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWiredCurrentTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeWiredCurrentTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWiredAssessedCurrentAttribute(
        long chipClusterPtr, WiredAssessedCurrentAttributeCallback callback);

    private native void subscribeWiredAssessedCurrentAttribute(
        long chipClusterPtr,
        WiredAssessedCurrentAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWiredNominalVoltageAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeWiredNominalVoltageAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWiredMaximumCurrentAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeWiredMaximumCurrentAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWiredPresentAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeWiredPresentAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActiveWiredFaultsAttribute(
        long chipClusterPtr, ActiveWiredFaultsAttributeCallback callback);

    private native void subscribeActiveWiredFaultsAttribute(
        long chipClusterPtr,
        ActiveWiredFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatVoltageAttribute(
        long chipClusterPtr, BatVoltageAttributeCallback callback);

    private native void subscribeBatVoltageAttribute(
        long chipClusterPtr,
        BatVoltageAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatPercentRemainingAttribute(
        long chipClusterPtr, BatPercentRemainingAttributeCallback callback);

    private native void subscribeBatPercentRemainingAttribute(
        long chipClusterPtr,
        BatPercentRemainingAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatTimeRemainingAttribute(
        long chipClusterPtr, BatTimeRemainingAttributeCallback callback);

    private native void subscribeBatTimeRemainingAttribute(
        long chipClusterPtr,
        BatTimeRemainingAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatChargeLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBatChargeLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatReplacementNeededAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeBatReplacementNeededAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatReplaceabilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBatReplaceabilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatPresentAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeBatPresentAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActiveBatFaultsAttribute(
        long chipClusterPtr, ActiveBatFaultsAttributeCallback callback);

    private native void subscribeActiveBatFaultsAttribute(
        long chipClusterPtr,
        ActiveBatFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatReplacementDescriptionAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeBatReplacementDescriptionAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatCommonDesignationAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeBatCommonDesignationAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatANSIDesignationAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeBatANSIDesignationAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatIECDesignationAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeBatIECDesignationAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatApprovedChemistryAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeBatApprovedChemistryAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatCapacityAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeBatCapacityAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatQuantityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBatQuantityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatChargeStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBatChargeStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatTimeToFullChargeAttribute(
        long chipClusterPtr, BatTimeToFullChargeAttributeCallback callback);

    private native void subscribeBatTimeToFullChargeAttribute(
        long chipClusterPtr,
        BatTimeToFullChargeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatFunctionalWhileChargingAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeBatFunctionalWhileChargingAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatChargingCurrentAttribute(
        long chipClusterPtr, BatChargingCurrentAttributeCallback callback);

    private native void subscribeBatChargingCurrentAttribute(
        long chipClusterPtr,
        BatChargingCurrentAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readActiveBatChargeFaultsAttribute(
        long chipClusterPtr, ActiveBatChargeFaultsAttributeCallback callback);

    private native void subscribeActiveBatChargeFaultsAttribute(
        long chipClusterPtr,
        ActiveBatChargeFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class GeneralCommissioningCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 48L;

    public GeneralCommissioningCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void armFailSafe(
        ArmFailSafeResponseCallback callback, Integer expiryLengthSeconds, Long breadcrumb) {
      armFailSafe(chipClusterPtr, callback, expiryLengthSeconds, breadcrumb, null);
    }

    public void armFailSafe(
        ArmFailSafeResponseCallback callback,
        Integer expiryLengthSeconds,
        Long breadcrumb,
        int timedInvokeTimeoutMs) {
      armFailSafe(chipClusterPtr, callback, expiryLengthSeconds, breadcrumb, timedInvokeTimeoutMs);
    }

    public void setRegulatoryConfig(
        SetRegulatoryConfigResponseCallback callback,
        Integer newRegulatoryConfig,
        String countryCode,
        Long breadcrumb) {
      setRegulatoryConfig(
          chipClusterPtr, callback, newRegulatoryConfig, countryCode, breadcrumb, null);
    }

    public void setRegulatoryConfig(
        SetRegulatoryConfigResponseCallback callback,
        Integer newRegulatoryConfig,
        String countryCode,
        Long breadcrumb,
        int timedInvokeTimeoutMs) {
      setRegulatoryConfig(
          chipClusterPtr,
          callback,
          newRegulatoryConfig,
          countryCode,
          breadcrumb,
          timedInvokeTimeoutMs);
    }

    public void commissioningComplete(CommissioningCompleteResponseCallback callback) {
      commissioningComplete(chipClusterPtr, callback, null);
    }

    public void commissioningComplete(
        CommissioningCompleteResponseCallback callback, int timedInvokeTimeoutMs) {

      commissioningComplete(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void armFailSafe(
        long chipClusterPtr,
        ArmFailSafeResponseCallback Callback,
        Integer expiryLengthSeconds,
        Long breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setRegulatoryConfig(
        long chipClusterPtr,
        SetRegulatoryConfigResponseCallback Callback,
        Integer newRegulatoryConfig,
        String countryCode,
        Long breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void commissioningComplete(
        long chipClusterPtr,
        CommissioningCompleteResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ArmFailSafeResponseCallback {
      void onSuccess(Integer errorCode, String debugText);

      void onError(Exception error);
    }

    public interface SetRegulatoryConfigResponseCallback {
      void onSuccess(Integer errorCode, String debugText);

      void onError(Exception error);
    }

    public interface CommissioningCompleteResponseCallback {
      void onSuccess(Integer errorCode, String debugText);

      void onError(Exception error);
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readBreadcrumbAttribute(LongAttributeCallback callback) {
      readBreadcrumbAttribute(chipClusterPtr, callback);
    }

    public void writeBreadcrumbAttribute(DefaultClusterCallback callback, Long value) {
      writeBreadcrumbAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeBreadcrumbAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeBreadcrumbAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBreadcrumbAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBreadcrumbAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRegulatoryConfigAttribute(IntegerAttributeCallback callback) {
      readRegulatoryConfigAttribute(chipClusterPtr, callback);
    }

    public void subscribeRegulatoryConfigAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRegulatoryConfigAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLocationCapabilityAttribute(IntegerAttributeCallback callback) {
      readLocationCapabilityAttribute(chipClusterPtr, callback);
    }

    public void subscribeLocationCapabilityAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLocationCapabilityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportsConcurrentConnectionAttribute(BooleanAttributeCallback callback) {
      readSupportsConcurrentConnectionAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportsConcurrentConnectionAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportsConcurrentConnectionAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readBreadcrumbAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void writeBreadcrumbAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBreadcrumbAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRegulatoryConfigAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRegulatoryConfigAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLocationCapabilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeLocationCapabilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSupportsConcurrentConnectionAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeSupportsConcurrentConnectionAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class NetworkCommissioningCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 49L;

    public NetworkCommissioningCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void scanNetworks(
        ScanNetworksResponseCallback callback,
        @Nullable Optional<byte[]> ssid,
        Optional<Long> breadcrumb) {
      scanNetworks(chipClusterPtr, callback, ssid, breadcrumb, null);
    }

    public void scanNetworks(
        ScanNetworksResponseCallback callback,
        @Nullable Optional<byte[]> ssid,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      scanNetworks(chipClusterPtr, callback, ssid, breadcrumb, timedInvokeTimeoutMs);
    }

    public void addOrUpdateWiFiNetwork(
        NetworkConfigResponseCallback callback,
        byte[] ssid,
        byte[] credentials,
        Optional<Long> breadcrumb) {
      addOrUpdateWiFiNetwork(chipClusterPtr, callback, ssid, credentials, breadcrumb, null);
    }

    public void addOrUpdateWiFiNetwork(
        NetworkConfigResponseCallback callback,
        byte[] ssid,
        byte[] credentials,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      addOrUpdateWiFiNetwork(
          chipClusterPtr, callback, ssid, credentials, breadcrumb, timedInvokeTimeoutMs);
    }

    public void addOrUpdateThreadNetwork(
        NetworkConfigResponseCallback callback,
        byte[] operationalDataset,
        Optional<Long> breadcrumb) {
      addOrUpdateThreadNetwork(chipClusterPtr, callback, operationalDataset, breadcrumb, null);
    }

    public void addOrUpdateThreadNetwork(
        NetworkConfigResponseCallback callback,
        byte[] operationalDataset,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      addOrUpdateThreadNetwork(
          chipClusterPtr, callback, operationalDataset, breadcrumb, timedInvokeTimeoutMs);
    }

    public void removeNetwork(
        NetworkConfigResponseCallback callback, byte[] networkID, Optional<Long> breadcrumb) {
      removeNetwork(chipClusterPtr, callback, networkID, breadcrumb, null);
    }

    public void removeNetwork(
        NetworkConfigResponseCallback callback,
        byte[] networkID,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      removeNetwork(chipClusterPtr, callback, networkID, breadcrumb, timedInvokeTimeoutMs);
    }

    public void connectNetwork(
        ConnectNetworkResponseCallback callback, byte[] networkID, Optional<Long> breadcrumb) {
      connectNetwork(chipClusterPtr, callback, networkID, breadcrumb, null);
    }

    public void connectNetwork(
        ConnectNetworkResponseCallback callback,
        byte[] networkID,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      connectNetwork(chipClusterPtr, callback, networkID, breadcrumb, timedInvokeTimeoutMs);
    }

    public void reorderNetwork(
        NetworkConfigResponseCallback callback,
        byte[] networkID,
        Integer networkIndex,
        Optional<Long> breadcrumb) {
      reorderNetwork(chipClusterPtr, callback, networkID, networkIndex, breadcrumb, null);
    }

    public void reorderNetwork(
        NetworkConfigResponseCallback callback,
        byte[] networkID,
        Integer networkIndex,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      reorderNetwork(
          chipClusterPtr, callback, networkID, networkIndex, breadcrumb, timedInvokeTimeoutMs);
    }

    private native void scanNetworks(
        long chipClusterPtr,
        ScanNetworksResponseCallback Callback,
        @Nullable Optional<byte[]> ssid,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void addOrUpdateWiFiNetwork(
        long chipClusterPtr,
        NetworkConfigResponseCallback Callback,
        byte[] ssid,
        byte[] credentials,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void addOrUpdateThreadNetwork(
        long chipClusterPtr,
        NetworkConfigResponseCallback Callback,
        byte[] operationalDataset,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeNetwork(
        long chipClusterPtr,
        NetworkConfigResponseCallback Callback,
        byte[] networkID,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void connectNetwork(
        long chipClusterPtr,
        ConnectNetworkResponseCallback Callback,
        byte[] networkID,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void reorderNetwork(
        long chipClusterPtr,
        NetworkConfigResponseCallback Callback,
        byte[] networkID,
        Integer networkIndex,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ScanNetworksResponseCallback {
      void onSuccess(
          Integer networkingStatus,
          Optional<String> debugText,
          Optional<ArrayList<ChipStructs.NetworkCommissioningClusterWiFiInterfaceScanResult>>
              wiFiScanResults,
          Optional<ArrayList<ChipStructs.NetworkCommissioningClusterThreadInterfaceScanResult>>
              threadScanResults);

      void onError(Exception error);
    }

    public interface NetworkConfigResponseCallback {
      void onSuccess(
          Integer networkingStatus, Optional<String> debugText, Optional<Integer> networkIndex);

      void onError(Exception error);
    }

    public interface ConnectNetworkResponseCallback {
      void onSuccess(
          Integer networkingStatus, Optional<String> debugText, @Nullable Long errorValue);

      void onError(Exception error);
    }

    public interface NetworksAttributeCallback {
      void onSuccess(List<ChipStructs.NetworkCommissioningClusterNetworkInfo> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LastNetworkingStatusAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LastNetworkIDAttributeCallback {
      void onSuccess(@Nullable byte[] value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LastConnectErrorValueAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMaxNetworksAttribute(IntegerAttributeCallback callback) {
      readMaxNetworksAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxNetworksAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxNetworksAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNetworksAttribute(NetworksAttributeCallback callback) {
      readNetworksAttribute(chipClusterPtr, callback);
    }

    public void subscribeNetworksAttribute(
        NetworksAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNetworksAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readScanMaxTimeSecondsAttribute(IntegerAttributeCallback callback) {
      readScanMaxTimeSecondsAttribute(chipClusterPtr, callback);
    }

    public void subscribeScanMaxTimeSecondsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeScanMaxTimeSecondsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readConnectMaxTimeSecondsAttribute(IntegerAttributeCallback callback) {
      readConnectMaxTimeSecondsAttribute(chipClusterPtr, callback);
    }

    public void subscribeConnectMaxTimeSecondsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeConnectMaxTimeSecondsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInterfaceEnabledAttribute(BooleanAttributeCallback callback) {
      readInterfaceEnabledAttribute(chipClusterPtr, callback);
    }

    public void writeInterfaceEnabledAttribute(DefaultClusterCallback callback, Boolean value) {
      writeInterfaceEnabledAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInterfaceEnabledAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeInterfaceEnabledAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInterfaceEnabledAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInterfaceEnabledAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLastNetworkingStatusAttribute(LastNetworkingStatusAttributeCallback callback) {
      readLastNetworkingStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeLastNetworkingStatusAttribute(
        LastNetworkingStatusAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLastNetworkingStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLastNetworkIDAttribute(LastNetworkIDAttributeCallback callback) {
      readLastNetworkIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeLastNetworkIDAttribute(
        LastNetworkIDAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLastNetworkIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLastConnectErrorValueAttribute(
        LastConnectErrorValueAttributeCallback callback) {
      readLastConnectErrorValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeLastConnectErrorValueAttribute(
        LastConnectErrorValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLastConnectErrorValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMaxNetworksAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxNetworksAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNetworksAttribute(
        long chipClusterPtr, NetworksAttributeCallback callback);

    private native void subscribeNetworksAttribute(
        long chipClusterPtr, NetworksAttributeCallback callback, int minInterval, int maxInterval);

    private native void readScanMaxTimeSecondsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeScanMaxTimeSecondsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readConnectMaxTimeSecondsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeConnectMaxTimeSecondsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInterfaceEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeInterfaceEnabledAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInterfaceEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLastNetworkingStatusAttribute(
        long chipClusterPtr, LastNetworkingStatusAttributeCallback callback);

    private native void subscribeLastNetworkingStatusAttribute(
        long chipClusterPtr,
        LastNetworkingStatusAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLastNetworkIDAttribute(
        long chipClusterPtr, LastNetworkIDAttributeCallback callback);

    private native void subscribeLastNetworkIDAttribute(
        long chipClusterPtr,
        LastNetworkIDAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLastConnectErrorValueAttribute(
        long chipClusterPtr, LastConnectErrorValueAttributeCallback callback);

    private native void subscribeLastConnectErrorValueAttribute(
        long chipClusterPtr,
        LastConnectErrorValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class DiagnosticLogsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 50L;

    public DiagnosticLogsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void retrieveLogsRequest(
        RetrieveLogsResponseCallback callback,
        Integer intent,
        Integer requestedProtocol,
        byte[] transferFileDesignator) {
      retrieveLogsRequest(
          chipClusterPtr, callback, intent, requestedProtocol, transferFileDesignator, null);
    }

    public void retrieveLogsRequest(
        RetrieveLogsResponseCallback callback,
        Integer intent,
        Integer requestedProtocol,
        byte[] transferFileDesignator,
        int timedInvokeTimeoutMs) {
      retrieveLogsRequest(
          chipClusterPtr,
          callback,
          intent,
          requestedProtocol,
          transferFileDesignator,
          timedInvokeTimeoutMs);
    }

    private native void retrieveLogsRequest(
        long chipClusterPtr,
        RetrieveLogsResponseCallback Callback,
        Integer intent,
        Integer requestedProtocol,
        byte[] transferFileDesignator,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface RetrieveLogsResponseCallback {
      void onSuccess(Integer status, byte[] content, Long timeStamp, Long timeSinceBoot);

      void onError(Exception error);
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class GeneralDiagnosticsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 51L;

    public GeneralDiagnosticsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void testEventTrigger(
        DefaultClusterCallback callback, byte[] enableKey, Long eventTrigger) {
      testEventTrigger(chipClusterPtr, callback, enableKey, eventTrigger, null);
    }

    public void testEventTrigger(
        DefaultClusterCallback callback,
        byte[] enableKey,
        Long eventTrigger,
        int timedInvokeTimeoutMs) {
      testEventTrigger(chipClusterPtr, callback, enableKey, eventTrigger, timedInvokeTimeoutMs);
    }

    private native void testEventTrigger(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        byte[] enableKey,
        Long eventTrigger,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface NetworkInterfacesAttributeCallback {
      void onSuccess(List<ChipStructs.GeneralDiagnosticsClusterNetworkInterfaceType> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveHardwareFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveRadioFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveNetworkFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readNetworkInterfacesAttribute(NetworkInterfacesAttributeCallback callback) {
      readNetworkInterfacesAttribute(chipClusterPtr, callback);
    }

    public void subscribeNetworkInterfacesAttribute(
        NetworkInterfacesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNetworkInterfacesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRebootCountAttribute(IntegerAttributeCallback callback) {
      readRebootCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRebootCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRebootCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUpTimeAttribute(LongAttributeCallback callback) {
      readUpTimeAttribute(chipClusterPtr, callback);
    }

    public void subscribeUpTimeAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUpTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTotalOperationalHoursAttribute(LongAttributeCallback callback) {
      readTotalOperationalHoursAttribute(chipClusterPtr, callback);
    }

    public void subscribeTotalOperationalHoursAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTotalOperationalHoursAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBootReasonsAttribute(IntegerAttributeCallback callback) {
      readBootReasonsAttribute(chipClusterPtr, callback);
    }

    public void subscribeBootReasonsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBootReasonsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveHardwareFaultsAttribute(ActiveHardwareFaultsAttributeCallback callback) {
      readActiveHardwareFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveHardwareFaultsAttribute(
        ActiveHardwareFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveHardwareFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveRadioFaultsAttribute(ActiveRadioFaultsAttributeCallback callback) {
      readActiveRadioFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveRadioFaultsAttribute(
        ActiveRadioFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveRadioFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveNetworkFaultsAttribute(ActiveNetworkFaultsAttributeCallback callback) {
      readActiveNetworkFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveNetworkFaultsAttribute(
        ActiveNetworkFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveNetworkFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTestEventTriggersEnabledAttribute(BooleanAttributeCallback callback) {
      readTestEventTriggersEnabledAttribute(chipClusterPtr, callback);
    }

    public void subscribeTestEventTriggersEnabledAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTestEventTriggersEnabledAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readNetworkInterfacesAttribute(
        long chipClusterPtr, NetworkInterfacesAttributeCallback callback);

    private native void subscribeNetworkInterfacesAttribute(
        long chipClusterPtr,
        NetworkInterfacesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readRebootCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRebootCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUpTimeAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeUpTimeAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTotalOperationalHoursAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTotalOperationalHoursAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBootReasonsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBootReasonsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActiveHardwareFaultsAttribute(
        long chipClusterPtr, ActiveHardwareFaultsAttributeCallback callback);

    private native void subscribeActiveHardwareFaultsAttribute(
        long chipClusterPtr,
        ActiveHardwareFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readActiveRadioFaultsAttribute(
        long chipClusterPtr, ActiveRadioFaultsAttributeCallback callback);

    private native void subscribeActiveRadioFaultsAttribute(
        long chipClusterPtr,
        ActiveRadioFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readActiveNetworkFaultsAttribute(
        long chipClusterPtr, ActiveNetworkFaultsAttributeCallback callback);

    private native void subscribeActiveNetworkFaultsAttribute(
        long chipClusterPtr,
        ActiveNetworkFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readTestEventTriggersEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeTestEventTriggersEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class SoftwareDiagnosticsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 52L;

    public SoftwareDiagnosticsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void resetWatermarks(DefaultClusterCallback callback) {
      resetWatermarks(chipClusterPtr, callback, null);
    }

    public void resetWatermarks(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      resetWatermarks(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void resetWatermarks(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ThreadMetricsAttributeCallback {
      void onSuccess(List<ChipStructs.SoftwareDiagnosticsClusterThreadMetrics> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readThreadMetricsAttribute(ThreadMetricsAttributeCallback callback) {
      readThreadMetricsAttribute(chipClusterPtr, callback);
    }

    public void subscribeThreadMetricsAttribute(
        ThreadMetricsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeThreadMetricsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentHeapFreeAttribute(LongAttributeCallback callback) {
      readCurrentHeapFreeAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentHeapFreeAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentHeapFreeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentHeapUsedAttribute(LongAttributeCallback callback) {
      readCurrentHeapUsedAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentHeapUsedAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentHeapUsedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentHeapHighWatermarkAttribute(LongAttributeCallback callback) {
      readCurrentHeapHighWatermarkAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentHeapHighWatermarkAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentHeapHighWatermarkAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readThreadMetricsAttribute(
        long chipClusterPtr, ThreadMetricsAttributeCallback callback);

    private native void subscribeThreadMetricsAttribute(
        long chipClusterPtr,
        ThreadMetricsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentHeapFreeAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeCurrentHeapFreeAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentHeapUsedAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeCurrentHeapUsedAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentHeapHighWatermarkAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeCurrentHeapHighWatermarkAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ThreadNetworkDiagnosticsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 53L;

    public ThreadNetworkDiagnosticsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void resetCounts(DefaultClusterCallback callback) {
      resetCounts(chipClusterPtr, callback, null);
    }

    public void resetCounts(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      resetCounts(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void resetCounts(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ChannelAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface RoutingRoleAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NetworkNameAttributeCallback {
      void onSuccess(@Nullable String value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PanIdAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ExtendedPanIdAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MeshLocalPrefixAttributeCallback {
      void onSuccess(@Nullable byte[] value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NeighborTableListAttributeCallback {
      void onSuccess(List<ChipStructs.ThreadNetworkDiagnosticsClusterNeighborTable> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface RouteTableListAttributeCallback {
      void onSuccess(List<ChipStructs.ThreadNetworkDiagnosticsClusterRouteTable> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PartitionIdAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface WeightingAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface DataVersionAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface StableDataVersionAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LeaderRouterIdAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveTimestampAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PendingTimestampAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface DelayAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ChannelMaskAttributeCallback {
      void onSuccess(@Nullable byte[] value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveNetworkFaultsListAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readChannelAttribute(ChannelAttributeCallback callback) {
      readChannelAttribute(chipClusterPtr, callback);
    }

    public void subscribeChannelAttribute(
        ChannelAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeChannelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRoutingRoleAttribute(RoutingRoleAttributeCallback callback) {
      readRoutingRoleAttribute(chipClusterPtr, callback);
    }

    public void subscribeRoutingRoleAttribute(
        RoutingRoleAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRoutingRoleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNetworkNameAttribute(NetworkNameAttributeCallback callback) {
      readNetworkNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeNetworkNameAttribute(
        NetworkNameAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNetworkNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPanIdAttribute(PanIdAttributeCallback callback) {
      readPanIdAttribute(chipClusterPtr, callback);
    }

    public void subscribePanIdAttribute(
        PanIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePanIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readExtendedPanIdAttribute(ExtendedPanIdAttributeCallback callback) {
      readExtendedPanIdAttribute(chipClusterPtr, callback);
    }

    public void subscribeExtendedPanIdAttribute(
        ExtendedPanIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeExtendedPanIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMeshLocalPrefixAttribute(MeshLocalPrefixAttributeCallback callback) {
      readMeshLocalPrefixAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeshLocalPrefixAttribute(
        MeshLocalPrefixAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeshLocalPrefixAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOverrunCountAttribute(LongAttributeCallback callback) {
      readOverrunCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeOverrunCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOverrunCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNeighborTableListAttribute(NeighborTableListAttributeCallback callback) {
      readNeighborTableListAttribute(chipClusterPtr, callback);
    }

    public void subscribeNeighborTableListAttribute(
        NeighborTableListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNeighborTableListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRouteTableListAttribute(RouteTableListAttributeCallback callback) {
      readRouteTableListAttribute(chipClusterPtr, callback);
    }

    public void subscribeRouteTableListAttribute(
        RouteTableListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRouteTableListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPartitionIdAttribute(PartitionIdAttributeCallback callback) {
      readPartitionIdAttribute(chipClusterPtr, callback);
    }

    public void subscribePartitionIdAttribute(
        PartitionIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePartitionIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWeightingAttribute(WeightingAttributeCallback callback) {
      readWeightingAttribute(chipClusterPtr, callback);
    }

    public void subscribeWeightingAttribute(
        WeightingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWeightingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDataVersionAttribute(DataVersionAttributeCallback callback) {
      readDataVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeDataVersionAttribute(
        DataVersionAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDataVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStableDataVersionAttribute(StableDataVersionAttributeCallback callback) {
      readStableDataVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeStableDataVersionAttribute(
        StableDataVersionAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStableDataVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLeaderRouterIdAttribute(LeaderRouterIdAttributeCallback callback) {
      readLeaderRouterIdAttribute(chipClusterPtr, callback);
    }

    public void subscribeLeaderRouterIdAttribute(
        LeaderRouterIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLeaderRouterIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDetachedRoleCountAttribute(IntegerAttributeCallback callback) {
      readDetachedRoleCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeDetachedRoleCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDetachedRoleCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readChildRoleCountAttribute(IntegerAttributeCallback callback) {
      readChildRoleCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeChildRoleCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeChildRoleCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRouterRoleCountAttribute(IntegerAttributeCallback callback) {
      readRouterRoleCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRouterRoleCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRouterRoleCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLeaderRoleCountAttribute(IntegerAttributeCallback callback) {
      readLeaderRoleCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeLeaderRoleCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLeaderRoleCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttachAttemptCountAttribute(IntegerAttributeCallback callback) {
      readAttachAttemptCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttachAttemptCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttachAttemptCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPartitionIdChangeCountAttribute(IntegerAttributeCallback callback) {
      readPartitionIdChangeCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePartitionIdChangeCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePartitionIdChangeCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBetterPartitionAttachAttemptCountAttribute(IntegerAttributeCallback callback) {
      readBetterPartitionAttachAttemptCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeBetterPartitionAttachAttemptCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBetterPartitionAttachAttemptCountAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readParentChangeCountAttribute(IntegerAttributeCallback callback) {
      readParentChangeCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeParentChangeCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeParentChangeCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxTotalCountAttribute(LongAttributeCallback callback) {
      readTxTotalCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxTotalCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxTotalCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxUnicastCountAttribute(LongAttributeCallback callback) {
      readTxUnicastCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxUnicastCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxUnicastCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxBroadcastCountAttribute(LongAttributeCallback callback) {
      readTxBroadcastCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxBroadcastCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxBroadcastCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxAckRequestedCountAttribute(LongAttributeCallback callback) {
      readTxAckRequestedCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxAckRequestedCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxAckRequestedCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxAckedCountAttribute(LongAttributeCallback callback) {
      readTxAckedCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxAckedCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxAckedCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxNoAckRequestedCountAttribute(LongAttributeCallback callback) {
      readTxNoAckRequestedCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxNoAckRequestedCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxNoAckRequestedCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxDataCountAttribute(LongAttributeCallback callback) {
      readTxDataCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxDataCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxDataCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxDataPollCountAttribute(LongAttributeCallback callback) {
      readTxDataPollCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxDataPollCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxDataPollCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxBeaconCountAttribute(LongAttributeCallback callback) {
      readTxBeaconCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxBeaconCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxBeaconCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxBeaconRequestCountAttribute(LongAttributeCallback callback) {
      readTxBeaconRequestCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxBeaconRequestCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxBeaconRequestCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxOtherCountAttribute(LongAttributeCallback callback) {
      readTxOtherCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxOtherCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxOtherCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxRetryCountAttribute(LongAttributeCallback callback) {
      readTxRetryCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxRetryCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxRetryCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxDirectMaxRetryExpiryCountAttribute(LongAttributeCallback callback) {
      readTxDirectMaxRetryExpiryCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxDirectMaxRetryExpiryCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxDirectMaxRetryExpiryCountAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxIndirectMaxRetryExpiryCountAttribute(LongAttributeCallback callback) {
      readTxIndirectMaxRetryExpiryCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxIndirectMaxRetryExpiryCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxIndirectMaxRetryExpiryCountAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxErrCcaCountAttribute(LongAttributeCallback callback) {
      readTxErrCcaCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxErrCcaCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxErrCcaCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxErrAbortCountAttribute(LongAttributeCallback callback) {
      readTxErrAbortCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxErrAbortCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxErrAbortCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxErrBusyChannelCountAttribute(LongAttributeCallback callback) {
      readTxErrBusyChannelCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxErrBusyChannelCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxErrBusyChannelCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxTotalCountAttribute(LongAttributeCallback callback) {
      readRxTotalCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxTotalCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxTotalCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxUnicastCountAttribute(LongAttributeCallback callback) {
      readRxUnicastCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxUnicastCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxUnicastCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxBroadcastCountAttribute(LongAttributeCallback callback) {
      readRxBroadcastCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxBroadcastCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxBroadcastCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxDataCountAttribute(LongAttributeCallback callback) {
      readRxDataCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxDataCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxDataCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxDataPollCountAttribute(LongAttributeCallback callback) {
      readRxDataPollCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxDataPollCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxDataPollCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxBeaconCountAttribute(LongAttributeCallback callback) {
      readRxBeaconCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxBeaconCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxBeaconCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxBeaconRequestCountAttribute(LongAttributeCallback callback) {
      readRxBeaconRequestCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxBeaconRequestCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxBeaconRequestCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxOtherCountAttribute(LongAttributeCallback callback) {
      readRxOtherCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxOtherCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxOtherCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxAddressFilteredCountAttribute(LongAttributeCallback callback) {
      readRxAddressFilteredCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxAddressFilteredCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxAddressFilteredCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxDestAddrFilteredCountAttribute(LongAttributeCallback callback) {
      readRxDestAddrFilteredCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxDestAddrFilteredCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxDestAddrFilteredCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxDuplicatedCountAttribute(LongAttributeCallback callback) {
      readRxDuplicatedCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxDuplicatedCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxDuplicatedCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrNoFrameCountAttribute(LongAttributeCallback callback) {
      readRxErrNoFrameCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrNoFrameCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrNoFrameCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrUnknownNeighborCountAttribute(LongAttributeCallback callback) {
      readRxErrUnknownNeighborCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrUnknownNeighborCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrUnknownNeighborCountAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrInvalidSrcAddrCountAttribute(LongAttributeCallback callback) {
      readRxErrInvalidSrcAddrCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrInvalidSrcAddrCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrInvalidSrcAddrCountAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrSecCountAttribute(LongAttributeCallback callback) {
      readRxErrSecCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrSecCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrSecCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrFcsCountAttribute(LongAttributeCallback callback) {
      readRxErrFcsCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrFcsCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrFcsCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrOtherCountAttribute(LongAttributeCallback callback) {
      readRxErrOtherCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrOtherCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrOtherCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveTimestampAttribute(ActiveTimestampAttributeCallback callback) {
      readActiveTimestampAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveTimestampAttribute(
        ActiveTimestampAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveTimestampAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPendingTimestampAttribute(PendingTimestampAttributeCallback callback) {
      readPendingTimestampAttribute(chipClusterPtr, callback);
    }

    public void subscribePendingTimestampAttribute(
        PendingTimestampAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePendingTimestampAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDelayAttribute(DelayAttributeCallback callback) {
      readDelayAttribute(chipClusterPtr, callback);
    }

    public void subscribeDelayAttribute(
        DelayAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDelayAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readChannelMaskAttribute(ChannelMaskAttributeCallback callback) {
      readChannelMaskAttribute(chipClusterPtr, callback);
    }

    public void subscribeChannelMaskAttribute(
        ChannelMaskAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeChannelMaskAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveNetworkFaultsListAttribute(
        ActiveNetworkFaultsListAttributeCallback callback) {
      readActiveNetworkFaultsListAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveNetworkFaultsListAttribute(
        ActiveNetworkFaultsListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveNetworkFaultsListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readChannelAttribute(
        long chipClusterPtr, ChannelAttributeCallback callback);

    private native void subscribeChannelAttribute(
        long chipClusterPtr, ChannelAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRoutingRoleAttribute(
        long chipClusterPtr, RoutingRoleAttributeCallback callback);

    private native void subscribeRoutingRoleAttribute(
        long chipClusterPtr,
        RoutingRoleAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNetworkNameAttribute(
        long chipClusterPtr, NetworkNameAttributeCallback callback);

    private native void subscribeNetworkNameAttribute(
        long chipClusterPtr,
        NetworkNameAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPanIdAttribute(long chipClusterPtr, PanIdAttributeCallback callback);

    private native void subscribePanIdAttribute(
        long chipClusterPtr, PanIdAttributeCallback callback, int minInterval, int maxInterval);

    private native void readExtendedPanIdAttribute(
        long chipClusterPtr, ExtendedPanIdAttributeCallback callback);

    private native void subscribeExtendedPanIdAttribute(
        long chipClusterPtr,
        ExtendedPanIdAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMeshLocalPrefixAttribute(
        long chipClusterPtr, MeshLocalPrefixAttributeCallback callback);

    private native void subscribeMeshLocalPrefixAttribute(
        long chipClusterPtr,
        MeshLocalPrefixAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOverrunCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeOverrunCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNeighborTableListAttribute(
        long chipClusterPtr, NeighborTableListAttributeCallback callback);

    private native void subscribeNeighborTableListAttribute(
        long chipClusterPtr,
        NeighborTableListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readRouteTableListAttribute(
        long chipClusterPtr, RouteTableListAttributeCallback callback);

    private native void subscribeRouteTableListAttribute(
        long chipClusterPtr,
        RouteTableListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPartitionIdAttribute(
        long chipClusterPtr, PartitionIdAttributeCallback callback);

    private native void subscribePartitionIdAttribute(
        long chipClusterPtr,
        PartitionIdAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWeightingAttribute(
        long chipClusterPtr, WeightingAttributeCallback callback);

    private native void subscribeWeightingAttribute(
        long chipClusterPtr, WeightingAttributeCallback callback, int minInterval, int maxInterval);

    private native void readDataVersionAttribute(
        long chipClusterPtr, DataVersionAttributeCallback callback);

    private native void subscribeDataVersionAttribute(
        long chipClusterPtr,
        DataVersionAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readStableDataVersionAttribute(
        long chipClusterPtr, StableDataVersionAttributeCallback callback);

    private native void subscribeStableDataVersionAttribute(
        long chipClusterPtr,
        StableDataVersionAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLeaderRouterIdAttribute(
        long chipClusterPtr, LeaderRouterIdAttributeCallback callback);

    private native void subscribeLeaderRouterIdAttribute(
        long chipClusterPtr,
        LeaderRouterIdAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readDetachedRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeDetachedRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readChildRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeChildRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRouterRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRouterRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLeaderRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeLeaderRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAttachAttemptCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAttachAttemptCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPartitionIdChangeCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePartitionIdChangeCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBetterPartitionAttachAttemptCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBetterPartitionAttachAttemptCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readParentChangeCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeParentChangeCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxTotalCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxTotalCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxUnicastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxUnicastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxBroadcastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxBroadcastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxAckRequestedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxAckRequestedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxAckedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxAckedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxNoAckRequestedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxNoAckRequestedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxDataCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxDataCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxDataPollCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxDataPollCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxBeaconCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxBeaconCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxBeaconRequestCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxBeaconRequestCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxRetryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxRetryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxDirectMaxRetryExpiryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxDirectMaxRetryExpiryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxIndirectMaxRetryExpiryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxIndirectMaxRetryExpiryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxErrCcaCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxErrCcaCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxErrAbortCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxErrAbortCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxErrBusyChannelCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxErrBusyChannelCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxTotalCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxTotalCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxUnicastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxUnicastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxBroadcastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxBroadcastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxDataCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxDataCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxDataPollCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxDataPollCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxBeaconCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxBeaconCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxBeaconRequestCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxBeaconRequestCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxAddressFilteredCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxAddressFilteredCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxDestAddrFilteredCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxDestAddrFilteredCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxDuplicatedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxDuplicatedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrNoFrameCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrNoFrameCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrUnknownNeighborCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrUnknownNeighborCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrInvalidSrcAddrCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrInvalidSrcAddrCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrSecCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrSecCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrFcsCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrFcsCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActiveTimestampAttribute(
        long chipClusterPtr, ActiveTimestampAttributeCallback callback);

    private native void subscribeActiveTimestampAttribute(
        long chipClusterPtr,
        ActiveTimestampAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPendingTimestampAttribute(
        long chipClusterPtr, PendingTimestampAttributeCallback callback);

    private native void subscribePendingTimestampAttribute(
        long chipClusterPtr,
        PendingTimestampAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readDelayAttribute(long chipClusterPtr, DelayAttributeCallback callback);

    private native void subscribeDelayAttribute(
        long chipClusterPtr, DelayAttributeCallback callback, int minInterval, int maxInterval);

    private native void readChannelMaskAttribute(
        long chipClusterPtr, ChannelMaskAttributeCallback callback);

    private native void subscribeChannelMaskAttribute(
        long chipClusterPtr,
        ChannelMaskAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readActiveNetworkFaultsListAttribute(
        long chipClusterPtr, ActiveNetworkFaultsListAttributeCallback callback);

    private native void subscribeActiveNetworkFaultsListAttribute(
        long chipClusterPtr,
        ActiveNetworkFaultsListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class WiFiNetworkDiagnosticsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 54L;

    public WiFiNetworkDiagnosticsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void resetCounts(DefaultClusterCallback callback) {
      resetCounts(chipClusterPtr, callback, null);
    }

    public void resetCounts(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      resetCounts(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void resetCounts(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface BssidAttributeCallback {
      void onSuccess(@Nullable byte[] value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SecurityTypeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface WiFiVersionAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ChannelNumberAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface RssiAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BeaconLostCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BeaconRxCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PacketMulticastRxCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PacketMulticastTxCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PacketUnicastRxCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PacketUnicastTxCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentMaxRateAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface OverrunCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readBssidAttribute(BssidAttributeCallback callback) {
      readBssidAttribute(chipClusterPtr, callback);
    }

    public void subscribeBssidAttribute(
        BssidAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBssidAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSecurityTypeAttribute(SecurityTypeAttributeCallback callback) {
      readSecurityTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeSecurityTypeAttribute(
        SecurityTypeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSecurityTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiFiVersionAttribute(WiFiVersionAttributeCallback callback) {
      readWiFiVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiFiVersionAttribute(
        WiFiVersionAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiFiVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readChannelNumberAttribute(ChannelNumberAttributeCallback callback) {
      readChannelNumberAttribute(chipClusterPtr, callback);
    }

    public void subscribeChannelNumberAttribute(
        ChannelNumberAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeChannelNumberAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRssiAttribute(RssiAttributeCallback callback) {
      readRssiAttribute(chipClusterPtr, callback);
    }

    public void subscribeRssiAttribute(
        RssiAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRssiAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBeaconLostCountAttribute(BeaconLostCountAttributeCallback callback) {
      readBeaconLostCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeBeaconLostCountAttribute(
        BeaconLostCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBeaconLostCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBeaconRxCountAttribute(BeaconRxCountAttributeCallback callback) {
      readBeaconRxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeBeaconRxCountAttribute(
        BeaconRxCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBeaconRxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketMulticastRxCountAttribute(
        PacketMulticastRxCountAttributeCallback callback) {
      readPacketMulticastRxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketMulticastRxCountAttribute(
        PacketMulticastRxCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketMulticastRxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketMulticastTxCountAttribute(
        PacketMulticastTxCountAttributeCallback callback) {
      readPacketMulticastTxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketMulticastTxCountAttribute(
        PacketMulticastTxCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketMulticastTxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketUnicastRxCountAttribute(PacketUnicastRxCountAttributeCallback callback) {
      readPacketUnicastRxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketUnicastRxCountAttribute(
        PacketUnicastRxCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketUnicastRxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketUnicastTxCountAttribute(PacketUnicastTxCountAttributeCallback callback) {
      readPacketUnicastTxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketUnicastTxCountAttribute(
        PacketUnicastTxCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketUnicastTxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentMaxRateAttribute(CurrentMaxRateAttributeCallback callback) {
      readCurrentMaxRateAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentMaxRateAttribute(
        CurrentMaxRateAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentMaxRateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOverrunCountAttribute(OverrunCountAttributeCallback callback) {
      readOverrunCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeOverrunCountAttribute(
        OverrunCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOverrunCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readBssidAttribute(long chipClusterPtr, BssidAttributeCallback callback);

    private native void subscribeBssidAttribute(
        long chipClusterPtr, BssidAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSecurityTypeAttribute(
        long chipClusterPtr, SecurityTypeAttributeCallback callback);

    private native void subscribeSecurityTypeAttribute(
        long chipClusterPtr,
        SecurityTypeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWiFiVersionAttribute(
        long chipClusterPtr, WiFiVersionAttributeCallback callback);

    private native void subscribeWiFiVersionAttribute(
        long chipClusterPtr,
        WiFiVersionAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readChannelNumberAttribute(
        long chipClusterPtr, ChannelNumberAttributeCallback callback);

    private native void subscribeChannelNumberAttribute(
        long chipClusterPtr,
        ChannelNumberAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readRssiAttribute(long chipClusterPtr, RssiAttributeCallback callback);

    private native void subscribeRssiAttribute(
        long chipClusterPtr, RssiAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBeaconLostCountAttribute(
        long chipClusterPtr, BeaconLostCountAttributeCallback callback);

    private native void subscribeBeaconLostCountAttribute(
        long chipClusterPtr,
        BeaconLostCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBeaconRxCountAttribute(
        long chipClusterPtr, BeaconRxCountAttributeCallback callback);

    private native void subscribeBeaconRxCountAttribute(
        long chipClusterPtr,
        BeaconRxCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPacketMulticastRxCountAttribute(
        long chipClusterPtr, PacketMulticastRxCountAttributeCallback callback);

    private native void subscribePacketMulticastRxCountAttribute(
        long chipClusterPtr,
        PacketMulticastRxCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPacketMulticastTxCountAttribute(
        long chipClusterPtr, PacketMulticastTxCountAttributeCallback callback);

    private native void subscribePacketMulticastTxCountAttribute(
        long chipClusterPtr,
        PacketMulticastTxCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPacketUnicastRxCountAttribute(
        long chipClusterPtr, PacketUnicastRxCountAttributeCallback callback);

    private native void subscribePacketUnicastRxCountAttribute(
        long chipClusterPtr,
        PacketUnicastRxCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPacketUnicastTxCountAttribute(
        long chipClusterPtr, PacketUnicastTxCountAttributeCallback callback);

    private native void subscribePacketUnicastTxCountAttribute(
        long chipClusterPtr,
        PacketUnicastTxCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentMaxRateAttribute(
        long chipClusterPtr, CurrentMaxRateAttributeCallback callback);

    private native void subscribeCurrentMaxRateAttribute(
        long chipClusterPtr,
        CurrentMaxRateAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOverrunCountAttribute(
        long chipClusterPtr, OverrunCountAttributeCallback callback);

    private native void subscribeOverrunCountAttribute(
        long chipClusterPtr,
        OverrunCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class EthernetNetworkDiagnosticsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 55L;

    public EthernetNetworkDiagnosticsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void resetCounts(DefaultClusterCallback callback) {
      resetCounts(chipClusterPtr, callback, null);
    }

    public void resetCounts(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      resetCounts(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void resetCounts(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface PHYRateAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface FullDuplexAttributeCallback {
      void onSuccess(@Nullable Boolean value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CarrierDetectAttributeCallback {
      void onSuccess(@Nullable Boolean value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readPHYRateAttribute(PHYRateAttributeCallback callback) {
      readPHYRateAttribute(chipClusterPtr, callback);
    }

    public void subscribePHYRateAttribute(
        PHYRateAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePHYRateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFullDuplexAttribute(FullDuplexAttributeCallback callback) {
      readFullDuplexAttribute(chipClusterPtr, callback);
    }

    public void subscribeFullDuplexAttribute(
        FullDuplexAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFullDuplexAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketRxCountAttribute(LongAttributeCallback callback) {
      readPacketRxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketRxCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketRxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketTxCountAttribute(LongAttributeCallback callback) {
      readPacketTxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketTxCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketTxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxErrCountAttribute(LongAttributeCallback callback) {
      readTxErrCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxErrCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxErrCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCollisionCountAttribute(LongAttributeCallback callback) {
      readCollisionCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeCollisionCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCollisionCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOverrunCountAttribute(LongAttributeCallback callback) {
      readOverrunCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeOverrunCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOverrunCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCarrierDetectAttribute(CarrierDetectAttributeCallback callback) {
      readCarrierDetectAttribute(chipClusterPtr, callback);
    }

    public void subscribeCarrierDetectAttribute(
        CarrierDetectAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCarrierDetectAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTimeSinceResetAttribute(LongAttributeCallback callback) {
      readTimeSinceResetAttribute(chipClusterPtr, callback);
    }

    public void subscribeTimeSinceResetAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTimeSinceResetAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readPHYRateAttribute(
        long chipClusterPtr, PHYRateAttributeCallback callback);

    private native void subscribePHYRateAttribute(
        long chipClusterPtr, PHYRateAttributeCallback callback, int minInterval, int maxInterval);

    private native void readFullDuplexAttribute(
        long chipClusterPtr, FullDuplexAttributeCallback callback);

    private native void subscribeFullDuplexAttribute(
        long chipClusterPtr,
        FullDuplexAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPacketRxCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribePacketRxCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPacketTxCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribePacketTxCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxErrCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxErrCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCollisionCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeCollisionCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOverrunCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeOverrunCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCarrierDetectAttribute(
        long chipClusterPtr, CarrierDetectAttributeCallback callback);

    private native void subscribeCarrierDetectAttribute(
        long chipClusterPtr,
        CarrierDetectAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readTimeSinceResetAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTimeSinceResetAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BridgedDeviceBasicCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 57L;

    public BridgedDeviceBasicCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface VendorIDAttributeCallback {
      void onSuccess(Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readVendorNameAttribute(CharStringAttributeCallback callback) {
      readVendorNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readVendorIDAttribute(VendorIDAttributeCallback callback) {
      readVendorIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorIDAttribute(
        VendorIDAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductNameAttribute(CharStringAttributeCallback callback) {
      readProductNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNodeLabelAttribute(CharStringAttributeCallback callback) {
      readNodeLabelAttribute(chipClusterPtr, callback);
    }

    public void writeNodeLabelAttribute(DefaultClusterCallback callback, String value) {
      writeNodeLabelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNodeLabelAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeNodeLabelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNodeLabelAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNodeLabelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readHardwareVersionAttribute(IntegerAttributeCallback callback) {
      readHardwareVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeHardwareVersionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeHardwareVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readHardwareVersionStringAttribute(CharStringAttributeCallback callback) {
      readHardwareVersionStringAttribute(chipClusterPtr, callback);
    }

    public void subscribeHardwareVersionStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeHardwareVersionStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSoftwareVersionAttribute(LongAttributeCallback callback) {
      readSoftwareVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeSoftwareVersionAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSoftwareVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSoftwareVersionStringAttribute(CharStringAttributeCallback callback) {
      readSoftwareVersionStringAttribute(chipClusterPtr, callback);
    }

    public void subscribeSoftwareVersionStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSoftwareVersionStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readManufacturingDateAttribute(CharStringAttributeCallback callback) {
      readManufacturingDateAttribute(chipClusterPtr, callback);
    }

    public void subscribeManufacturingDateAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeManufacturingDateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPartNumberAttribute(CharStringAttributeCallback callback) {
      readPartNumberAttribute(chipClusterPtr, callback);
    }

    public void subscribePartNumberAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePartNumberAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductURLAttribute(CharStringAttributeCallback callback) {
      readProductURLAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductURLAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductURLAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductLabelAttribute(CharStringAttributeCallback callback) {
      readProductLabelAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductLabelAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductLabelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSerialNumberAttribute(CharStringAttributeCallback callback) {
      readSerialNumberAttribute(chipClusterPtr, callback);
    }

    public void subscribeSerialNumberAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSerialNumberAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readReachableAttribute(BooleanAttributeCallback callback) {
      readReachableAttribute(chipClusterPtr, callback);
    }

    public void subscribeReachableAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeReachableAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUniqueIDAttribute(CharStringAttributeCallback callback) {
      readUniqueIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeUniqueIDAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUniqueIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readVendorNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeVendorNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback);

    private native void subscribeVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback, int minInterval, int maxInterval);

    private native void readProductNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNodeLabelAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeNodeLabelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNodeLabelAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readHardwareVersionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeHardwareVersionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readHardwareVersionStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeHardwareVersionStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSoftwareVersionAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeSoftwareVersionAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSoftwareVersionStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeSoftwareVersionStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readManufacturingDateAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeManufacturingDateAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPartNumberAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribePartNumberAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductURLAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductURLAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductLabelAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductLabelAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSerialNumberAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeSerialNumberAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readReachableAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeReachableAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUniqueIDAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeUniqueIDAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class SwitchCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 59L;

    public SwitchCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readNumberOfPositionsAttribute(IntegerAttributeCallback callback) {
      readNumberOfPositionsAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfPositionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfPositionsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionAttribute(IntegerAttributeCallback callback) {
      readCurrentPositionAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentPositionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMultiPressMaxAttribute(IntegerAttributeCallback callback) {
      readMultiPressMaxAttribute(chipClusterPtr, callback);
    }

    public void subscribeMultiPressMaxAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMultiPressMaxAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readNumberOfPositionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfPositionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentPositionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentPositionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMultiPressMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMultiPressMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class AdministratorCommissioningCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 60L;

    public AdministratorCommissioningCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void openCommissioningWindow(
        DefaultClusterCallback callback,
        Integer commissioningTimeout,
        byte[] PAKEVerifier,
        Integer discriminator,
        Long iterations,
        byte[] salt,
        int timedInvokeTimeoutMs) {
      openCommissioningWindow(
          chipClusterPtr,
          callback,
          commissioningTimeout,
          PAKEVerifier,
          discriminator,
          iterations,
          salt,
          timedInvokeTimeoutMs);
    }

    public void openBasicCommissioningWindow(
        DefaultClusterCallback callback, Integer commissioningTimeout, int timedInvokeTimeoutMs) {
      openBasicCommissioningWindow(
          chipClusterPtr, callback, commissioningTimeout, timedInvokeTimeoutMs);
    }

    public void revokeCommissioning(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      revokeCommissioning(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void openCommissioningWindow(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer commissioningTimeout,
        byte[] PAKEVerifier,
        Integer discriminator,
        Long iterations,
        byte[] salt,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void openBasicCommissioningWindow(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer commissioningTimeout,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void revokeCommissioning(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface AdminFabricIndexAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AdminVendorIdAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readWindowStatusAttribute(IntegerAttributeCallback callback) {
      readWindowStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeWindowStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWindowStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAdminFabricIndexAttribute(AdminFabricIndexAttributeCallback callback) {
      readAdminFabricIndexAttribute(chipClusterPtr, callback);
    }

    public void subscribeAdminFabricIndexAttribute(
        AdminFabricIndexAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAdminFabricIndexAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAdminVendorIdAttribute(AdminVendorIdAttributeCallback callback) {
      readAdminVendorIdAttribute(chipClusterPtr, callback);
    }

    public void subscribeAdminVendorIdAttribute(
        AdminVendorIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAdminVendorIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readWindowStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeWindowStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAdminFabricIndexAttribute(
        long chipClusterPtr, AdminFabricIndexAttributeCallback callback);

    private native void subscribeAdminFabricIndexAttribute(
        long chipClusterPtr,
        AdminFabricIndexAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAdminVendorIdAttribute(
        long chipClusterPtr, AdminVendorIdAttributeCallback callback);

    private native void subscribeAdminVendorIdAttribute(
        long chipClusterPtr,
        AdminVendorIdAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OperationalCredentialsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 62L;

    public OperationalCredentialsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void attestationRequest(AttestationResponseCallback callback, byte[] attestationNonce) {
      attestationRequest(chipClusterPtr, callback, attestationNonce, null);
    }

    public void attestationRequest(
        AttestationResponseCallback callback, byte[] attestationNonce, int timedInvokeTimeoutMs) {
      attestationRequest(chipClusterPtr, callback, attestationNonce, timedInvokeTimeoutMs);
    }

    public void certificateChainRequest(
        CertificateChainResponseCallback callback, Integer certificateType) {
      certificateChainRequest(chipClusterPtr, callback, certificateType, null);
    }

    public void certificateChainRequest(
        CertificateChainResponseCallback callback,
        Integer certificateType,
        int timedInvokeTimeoutMs) {
      certificateChainRequest(chipClusterPtr, callback, certificateType, timedInvokeTimeoutMs);
    }

    public void CSRRequest(
        CSRResponseCallback callback, byte[] CSRNonce, Optional<Boolean> isForUpdateNOC) {
      CSRRequest(chipClusterPtr, callback, CSRNonce, isForUpdateNOC, null);
    }

    public void CSRRequest(
        CSRResponseCallback callback,
        byte[] CSRNonce,
        Optional<Boolean> isForUpdateNOC,
        int timedInvokeTimeoutMs) {
      CSRRequest(chipClusterPtr, callback, CSRNonce, isForUpdateNOC, timedInvokeTimeoutMs);
    }

    public void addNOC(
        NOCResponseCallback callback,
        byte[] NOCValue,
        Optional<byte[]> ICACValue,
        byte[] IPKValue,
        Long caseAdminSubject,
        Integer adminVendorId) {
      addNOC(
          chipClusterPtr,
          callback,
          NOCValue,
          ICACValue,
          IPKValue,
          caseAdminSubject,
          adminVendorId,
          null);
    }

    public void addNOC(
        NOCResponseCallback callback,
        byte[] NOCValue,
        Optional<byte[]> ICACValue,
        byte[] IPKValue,
        Long caseAdminSubject,
        Integer adminVendorId,
        int timedInvokeTimeoutMs) {
      addNOC(
          chipClusterPtr,
          callback,
          NOCValue,
          ICACValue,
          IPKValue,
          caseAdminSubject,
          adminVendorId,
          timedInvokeTimeoutMs);
    }

    public void updateNOC(
        NOCResponseCallback callback, byte[] NOCValue, Optional<byte[]> ICACValue) {
      updateNOC(chipClusterPtr, callback, NOCValue, ICACValue, null);
    }

    public void updateNOC(
        NOCResponseCallback callback,
        byte[] NOCValue,
        Optional<byte[]> ICACValue,
        int timedInvokeTimeoutMs) {
      updateNOC(chipClusterPtr, callback, NOCValue, ICACValue, timedInvokeTimeoutMs);
    }

    public void updateFabricLabel(NOCResponseCallback callback, String label) {
      updateFabricLabel(chipClusterPtr, callback, label, null);
    }

    public void updateFabricLabel(
        NOCResponseCallback callback, String label, int timedInvokeTimeoutMs) {
      updateFabricLabel(chipClusterPtr, callback, label, timedInvokeTimeoutMs);
    }

    public void removeFabric(NOCResponseCallback callback, Integer fabricIndex) {
      removeFabric(chipClusterPtr, callback, fabricIndex, null);
    }

    public void removeFabric(
        NOCResponseCallback callback, Integer fabricIndex, int timedInvokeTimeoutMs) {
      removeFabric(chipClusterPtr, callback, fabricIndex, timedInvokeTimeoutMs);
    }

    public void addTrustedRootCertificate(DefaultClusterCallback callback, byte[] rootCertificate) {
      addTrustedRootCertificate(chipClusterPtr, callback, rootCertificate, null);
    }

    public void addTrustedRootCertificate(
        DefaultClusterCallback callback, byte[] rootCertificate, int timedInvokeTimeoutMs) {
      addTrustedRootCertificate(chipClusterPtr, callback, rootCertificate, timedInvokeTimeoutMs);
    }

    private native void attestationRequest(
        long chipClusterPtr,
        AttestationResponseCallback Callback,
        byte[] attestationNonce,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void certificateChainRequest(
        long chipClusterPtr,
        CertificateChainResponseCallback Callback,
        Integer certificateType,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void CSRRequest(
        long chipClusterPtr,
        CSRResponseCallback Callback,
        byte[] CSRNonce,
        Optional<Boolean> isForUpdateNOC,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void addNOC(
        long chipClusterPtr,
        NOCResponseCallback Callback,
        byte[] NOCValue,
        Optional<byte[]> ICACValue,
        byte[] IPKValue,
        Long caseAdminSubject,
        Integer adminVendorId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void updateNOC(
        long chipClusterPtr,
        NOCResponseCallback Callback,
        byte[] NOCValue,
        Optional<byte[]> ICACValue,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void updateFabricLabel(
        long chipClusterPtr,
        NOCResponseCallback Callback,
        String label,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeFabric(
        long chipClusterPtr,
        NOCResponseCallback Callback,
        Integer fabricIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void addTrustedRootCertificate(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        byte[] rootCertificate,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface AttestationResponseCallback {
      void onSuccess(byte[] attestationElements, byte[] signature);

      void onError(Exception error);
    }

    public interface CertificateChainResponseCallback {
      void onSuccess(byte[] certificate);

      void onError(Exception error);
    }

    public interface CSRResponseCallback {
      void onSuccess(byte[] NOCSRElements, byte[] attestationSignature);

      void onError(Exception error);
    }

    public interface NOCResponseCallback {
      void onSuccess(Integer statusCode, Optional<Integer> fabricIndex, Optional<String> debugText);

      void onError(Exception error);
    }

    public interface NOCsAttributeCallback {
      void onSuccess(List<ChipStructs.OperationalCredentialsClusterNOCStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface FabricsAttributeCallback {
      void onSuccess(List<ChipStructs.OperationalCredentialsClusterFabricDescriptor> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface TrustedRootCertificatesAttributeCallback {
      void onSuccess(List<byte[]> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readNOCsAttribute(NOCsAttributeCallback callback) {
      readNOCsAttribute(chipClusterPtr, callback);
    }

    public void subscribeNOCsAttribute(
        NOCsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNOCsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFabricsAttribute(FabricsAttributeCallback callback) {
      readFabricsAttribute(chipClusterPtr, callback);
    }

    public void subscribeFabricsAttribute(
        FabricsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFabricsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedFabricsAttribute(IntegerAttributeCallback callback) {
      readSupportedFabricsAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportedFabricsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedFabricsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCommissionedFabricsAttribute(IntegerAttributeCallback callback) {
      readCommissionedFabricsAttribute(chipClusterPtr, callback);
    }

    public void subscribeCommissionedFabricsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCommissionedFabricsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTrustedRootCertificatesAttribute(
        TrustedRootCertificatesAttributeCallback callback) {
      readTrustedRootCertificatesAttribute(chipClusterPtr, callback);
    }

    public void subscribeTrustedRootCertificatesAttribute(
        TrustedRootCertificatesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTrustedRootCertificatesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentFabricIndexAttribute(IntegerAttributeCallback callback) {
      readCurrentFabricIndexAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentFabricIndexAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentFabricIndexAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readNOCsAttribute(long chipClusterPtr, NOCsAttributeCallback callback);

    private native void subscribeNOCsAttribute(
        long chipClusterPtr, NOCsAttributeCallback callback, int minInterval, int maxInterval);

    private native void readFabricsAttribute(
        long chipClusterPtr, FabricsAttributeCallback callback);

    private native void subscribeFabricsAttribute(
        long chipClusterPtr, FabricsAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSupportedFabricsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSupportedFabricsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCommissionedFabricsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCommissionedFabricsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTrustedRootCertificatesAttribute(
        long chipClusterPtr, TrustedRootCertificatesAttributeCallback callback);

    private native void subscribeTrustedRootCertificatesAttribute(
        long chipClusterPtr,
        TrustedRootCertificatesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentFabricIndexAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentFabricIndexAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class GroupKeyManagementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 63L;

    public GroupKeyManagementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void keySetWrite(
        DefaultClusterCallback callback,
        ChipStructs.GroupKeyManagementClusterGroupKeySetStruct groupKeySet) {
      keySetWrite(chipClusterPtr, callback, groupKeySet, null);
    }

    public void keySetWrite(
        DefaultClusterCallback callback,
        ChipStructs.GroupKeyManagementClusterGroupKeySetStruct groupKeySet,
        int timedInvokeTimeoutMs) {
      keySetWrite(chipClusterPtr, callback, groupKeySet, timedInvokeTimeoutMs);
    }

    public void keySetRead(KeySetReadResponseCallback callback, Integer groupKeySetID) {
      keySetRead(chipClusterPtr, callback, groupKeySetID, null);
    }

    public void keySetRead(
        KeySetReadResponseCallback callback, Integer groupKeySetID, int timedInvokeTimeoutMs) {
      keySetRead(chipClusterPtr, callback, groupKeySetID, timedInvokeTimeoutMs);
    }

    public void keySetRemove(DefaultClusterCallback callback, Integer groupKeySetID) {
      keySetRemove(chipClusterPtr, callback, groupKeySetID, null);
    }

    public void keySetRemove(
        DefaultClusterCallback callback, Integer groupKeySetID, int timedInvokeTimeoutMs) {
      keySetRemove(chipClusterPtr, callback, groupKeySetID, timedInvokeTimeoutMs);
    }

    public void keySetReadAllIndices(
        KeySetReadAllIndicesResponseCallback callback, ArrayList<Integer> groupKeySetIDs) {
      keySetReadAllIndices(chipClusterPtr, callback, groupKeySetIDs, null);
    }

    public void keySetReadAllIndices(
        KeySetReadAllIndicesResponseCallback callback,
        ArrayList<Integer> groupKeySetIDs,
        int timedInvokeTimeoutMs) {
      keySetReadAllIndices(chipClusterPtr, callback, groupKeySetIDs, timedInvokeTimeoutMs);
    }

    private native void keySetWrite(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        ChipStructs.GroupKeyManagementClusterGroupKeySetStruct groupKeySet,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void keySetRead(
        long chipClusterPtr,
        KeySetReadResponseCallback Callback,
        Integer groupKeySetID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void keySetRemove(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer groupKeySetID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void keySetReadAllIndices(
        long chipClusterPtr,
        KeySetReadAllIndicesResponseCallback Callback,
        ArrayList<Integer> groupKeySetIDs,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface KeySetReadResponseCallback {
      void onSuccess(ChipStructs.GroupKeyManagementClusterGroupKeySetStruct groupKeySet);

      void onError(Exception error);
    }

    public interface KeySetReadAllIndicesResponseCallback {
      void onSuccess(ArrayList<Integer> groupKeySetIDs);

      void onError(Exception error);
    }

    public interface GroupKeyMapAttributeCallback {
      void onSuccess(List<ChipStructs.GroupKeyManagementClusterGroupKeyMapStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GroupTableAttributeCallback {
      void onSuccess(List<ChipStructs.GroupKeyManagementClusterGroupInfoMapStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readGroupKeyMapAttribute(GroupKeyMapAttributeCallback callback) {
      readGroupKeyMapAttribute(chipClusterPtr, callback);
    }

    public void writeGroupKeyMapAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.GroupKeyManagementClusterGroupKeyMapStruct> value) {
      writeGroupKeyMapAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeGroupKeyMapAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.GroupKeyManagementClusterGroupKeyMapStruct> value,
        int timedWriteTimeoutMs) {
      writeGroupKeyMapAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeGroupKeyMapAttribute(
        GroupKeyMapAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGroupKeyMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGroupTableAttribute(GroupTableAttributeCallback callback) {
      readGroupTableAttribute(chipClusterPtr, callback);
    }

    public void subscribeGroupTableAttribute(
        GroupTableAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGroupTableAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxGroupsPerFabricAttribute(IntegerAttributeCallback callback) {
      readMaxGroupsPerFabricAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxGroupsPerFabricAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxGroupsPerFabricAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxGroupKeysPerFabricAttribute(IntegerAttributeCallback callback) {
      readMaxGroupKeysPerFabricAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxGroupKeysPerFabricAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxGroupKeysPerFabricAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readGroupKeyMapAttribute(
        long chipClusterPtr, GroupKeyMapAttributeCallback callback);

    private native void writeGroupKeyMapAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.GroupKeyManagementClusterGroupKeyMapStruct> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeGroupKeyMapAttribute(
        long chipClusterPtr,
        GroupKeyMapAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGroupTableAttribute(
        long chipClusterPtr, GroupTableAttributeCallback callback);

    private native void subscribeGroupTableAttribute(
        long chipClusterPtr,
        GroupTableAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxGroupsPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxGroupsPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxGroupKeysPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxGroupKeysPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class FixedLabelCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 64L;

    public FixedLabelCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface LabelListAttributeCallback {
      void onSuccess(List<ChipStructs.FixedLabelClusterLabelStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readLabelListAttribute(LabelListAttributeCallback callback) {
      readLabelListAttribute(chipClusterPtr, callback);
    }

    public void subscribeLabelListAttribute(
        LabelListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLabelListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readLabelListAttribute(
        long chipClusterPtr, LabelListAttributeCallback callback);

    private native void subscribeLabelListAttribute(
        long chipClusterPtr, LabelListAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class UserLabelCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 65L;

    public UserLabelCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface LabelListAttributeCallback {
      void onSuccess(List<ChipStructs.UserLabelClusterLabelStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readLabelListAttribute(LabelListAttributeCallback callback) {
      readLabelListAttribute(chipClusterPtr, callback);
    }

    public void writeLabelListAttribute(
        DefaultClusterCallback callback, ArrayList<ChipStructs.UserLabelClusterLabelStruct> value) {
      writeLabelListAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLabelListAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UserLabelClusterLabelStruct> value,
        int timedWriteTimeoutMs) {
      writeLabelListAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLabelListAttribute(
        LabelListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLabelListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readLabelListAttribute(
        long chipClusterPtr, LabelListAttributeCallback callback);

    private native void writeLabelListAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UserLabelClusterLabelStruct> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLabelListAttribute(
        long chipClusterPtr, LabelListAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BooleanStateCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 69L;

    public BooleanStateCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readStateValueAttribute(BooleanAttributeCallback callback) {
      readStateValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeStateValueAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStateValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readStateValueAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeStateValueAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ModeSelectCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 80L;

    public ModeSelectCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void changeToMode(DefaultClusterCallback callback, Integer newMode) {
      changeToMode(chipClusterPtr, callback, newMode, null);
    }

    public void changeToMode(
        DefaultClusterCallback callback, Integer newMode, int timedInvokeTimeoutMs) {
      changeToMode(chipClusterPtr, callback, newMode, timedInvokeTimeoutMs);
    }

    private native void changeToMode(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer newMode,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface StandardNamespaceAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SupportedModesAttributeCallback {
      void onSuccess(List<ChipStructs.ModeSelectClusterModeOptionStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface StartUpModeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface OnModeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readDescriptionAttribute(CharStringAttributeCallback callback) {
      readDescriptionAttribute(chipClusterPtr, callback);
    }

    public void subscribeDescriptionAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDescriptionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStandardNamespaceAttribute(StandardNamespaceAttributeCallback callback) {
      readStandardNamespaceAttribute(chipClusterPtr, callback);
    }

    public void subscribeStandardNamespaceAttribute(
        StandardNamespaceAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStandardNamespaceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedModesAttribute(SupportedModesAttributeCallback callback) {
      readSupportedModesAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportedModesAttribute(
        SupportedModesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedModesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentModeAttribute(IntegerAttributeCallback callback) {
      readCurrentModeAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartUpModeAttribute(StartUpModeAttributeCallback callback) {
      readStartUpModeAttribute(chipClusterPtr, callback);
    }

    public void writeStartUpModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeStartUpModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeStartUpModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeStartUpModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeStartUpModeAttribute(
        StartUpModeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartUpModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOnModeAttribute(OnModeAttributeCallback callback) {
      readOnModeAttribute(chipClusterPtr, callback);
    }

    public void writeOnModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOnModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOnModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOnModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOnModeAttribute(
        OnModeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readDescriptionAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeDescriptionAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readStandardNamespaceAttribute(
        long chipClusterPtr, StandardNamespaceAttributeCallback callback);

    private native void subscribeStandardNamespaceAttribute(
        long chipClusterPtr,
        StandardNamespaceAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSupportedModesAttribute(
        long chipClusterPtr, SupportedModesAttributeCallback callback);

    private native void subscribeSupportedModesAttribute(
        long chipClusterPtr,
        SupportedModesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStartUpModeAttribute(
        long chipClusterPtr, StartUpModeAttributeCallback callback);

    private native void writeStartUpModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeStartUpModeAttribute(
        long chipClusterPtr,
        StartUpModeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOnModeAttribute(long chipClusterPtr, OnModeAttributeCallback callback);

    private native void writeOnModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOnModeAttribute(
        long chipClusterPtr, OnModeAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class DoorLockCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 257L;

    public DoorLockCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void lockDoor(
        DefaultClusterCallback callback, Optional<byte[]> pinCode, int timedInvokeTimeoutMs) {
      lockDoor(chipClusterPtr, callback, pinCode, timedInvokeTimeoutMs);
    }

    public void unlockDoor(
        DefaultClusterCallback callback, Optional<byte[]> pinCode, int timedInvokeTimeoutMs) {
      unlockDoor(chipClusterPtr, callback, pinCode, timedInvokeTimeoutMs);
    }

    public void unlockWithTimeout(
        DefaultClusterCallback callback,
        Integer timeout,
        Optional<byte[]> pinCode,
        int timedInvokeTimeoutMs) {
      unlockWithTimeout(chipClusterPtr, callback, timeout, pinCode, timedInvokeTimeoutMs);
    }

    public void setWeekDaySchedule(
        DefaultClusterCallback callback,
        Integer weekDayIndex,
        Integer userIndex,
        Integer daysMask,
        Integer startHour,
        Integer startMinute,
        Integer endHour,
        Integer endMinute) {
      setWeekDaySchedule(
          chipClusterPtr,
          callback,
          weekDayIndex,
          userIndex,
          daysMask,
          startHour,
          startMinute,
          endHour,
          endMinute,
          null);
    }

    public void setWeekDaySchedule(
        DefaultClusterCallback callback,
        Integer weekDayIndex,
        Integer userIndex,
        Integer daysMask,
        Integer startHour,
        Integer startMinute,
        Integer endHour,
        Integer endMinute,
        int timedInvokeTimeoutMs) {
      setWeekDaySchedule(
          chipClusterPtr,
          callback,
          weekDayIndex,
          userIndex,
          daysMask,
          startHour,
          startMinute,
          endHour,
          endMinute,
          timedInvokeTimeoutMs);
    }

    public void getWeekDaySchedule(
        GetWeekDayScheduleResponseCallback callback, Integer weekDayIndex, Integer userIndex) {
      getWeekDaySchedule(chipClusterPtr, callback, weekDayIndex, userIndex, null);
    }

    public void getWeekDaySchedule(
        GetWeekDayScheduleResponseCallback callback,
        Integer weekDayIndex,
        Integer userIndex,
        int timedInvokeTimeoutMs) {
      getWeekDaySchedule(chipClusterPtr, callback, weekDayIndex, userIndex, timedInvokeTimeoutMs);
    }

    public void clearWeekDaySchedule(
        DefaultClusterCallback callback, Integer weekDayIndex, Integer userIndex) {
      clearWeekDaySchedule(chipClusterPtr, callback, weekDayIndex, userIndex, null);
    }

    public void clearWeekDaySchedule(
        DefaultClusterCallback callback,
        Integer weekDayIndex,
        Integer userIndex,
        int timedInvokeTimeoutMs) {
      clearWeekDaySchedule(chipClusterPtr, callback, weekDayIndex, userIndex, timedInvokeTimeoutMs);
    }

    public void setYearDaySchedule(
        DefaultClusterCallback callback,
        Integer yearDayIndex,
        Integer userIndex,
        Long localStartTime,
        Long localEndTime) {
      setYearDaySchedule(
          chipClusterPtr, callback, yearDayIndex, userIndex, localStartTime, localEndTime, null);
    }

    public void setYearDaySchedule(
        DefaultClusterCallback callback,
        Integer yearDayIndex,
        Integer userIndex,
        Long localStartTime,
        Long localEndTime,
        int timedInvokeTimeoutMs) {
      setYearDaySchedule(
          chipClusterPtr,
          callback,
          yearDayIndex,
          userIndex,
          localStartTime,
          localEndTime,
          timedInvokeTimeoutMs);
    }

    public void getYearDaySchedule(
        GetYearDayScheduleResponseCallback callback, Integer yearDayIndex, Integer userIndex) {
      getYearDaySchedule(chipClusterPtr, callback, yearDayIndex, userIndex, null);
    }

    public void getYearDaySchedule(
        GetYearDayScheduleResponseCallback callback,
        Integer yearDayIndex,
        Integer userIndex,
        int timedInvokeTimeoutMs) {
      getYearDaySchedule(chipClusterPtr, callback, yearDayIndex, userIndex, timedInvokeTimeoutMs);
    }

    public void clearYearDaySchedule(
        DefaultClusterCallback callback, Integer yearDayIndex, Integer userIndex) {
      clearYearDaySchedule(chipClusterPtr, callback, yearDayIndex, userIndex, null);
    }

    public void clearYearDaySchedule(
        DefaultClusterCallback callback,
        Integer yearDayIndex,
        Integer userIndex,
        int timedInvokeTimeoutMs) {
      clearYearDaySchedule(chipClusterPtr, callback, yearDayIndex, userIndex, timedInvokeTimeoutMs);
    }

    public void setHolidaySchedule(
        DefaultClusterCallback callback,
        Integer holidayIndex,
        Long localStartTime,
        Long localEndTime,
        Integer operatingMode) {
      setHolidaySchedule(
          chipClusterPtr,
          callback,
          holidayIndex,
          localStartTime,
          localEndTime,
          operatingMode,
          null);
    }

    public void setHolidaySchedule(
        DefaultClusterCallback callback,
        Integer holidayIndex,
        Long localStartTime,
        Long localEndTime,
        Integer operatingMode,
        int timedInvokeTimeoutMs) {
      setHolidaySchedule(
          chipClusterPtr,
          callback,
          holidayIndex,
          localStartTime,
          localEndTime,
          operatingMode,
          timedInvokeTimeoutMs);
    }

    public void getHolidaySchedule(
        GetHolidayScheduleResponseCallback callback, Integer holidayIndex) {
      getHolidaySchedule(chipClusterPtr, callback, holidayIndex, null);
    }

    public void getHolidaySchedule(
        GetHolidayScheduleResponseCallback callback,
        Integer holidayIndex,
        int timedInvokeTimeoutMs) {
      getHolidaySchedule(chipClusterPtr, callback, holidayIndex, timedInvokeTimeoutMs);
    }

    public void clearHolidaySchedule(DefaultClusterCallback callback, Integer holidayIndex) {
      clearHolidaySchedule(chipClusterPtr, callback, holidayIndex, null);
    }

    public void clearHolidaySchedule(
        DefaultClusterCallback callback, Integer holidayIndex, int timedInvokeTimeoutMs) {
      clearHolidaySchedule(chipClusterPtr, callback, holidayIndex, timedInvokeTimeoutMs);
    }

    public void setUser(
        DefaultClusterCallback callback,
        Integer operationType,
        Integer userIndex,
        @Nullable String userName,
        @Nullable Long userUniqueId,
        @Nullable Integer userStatus,
        @Nullable Integer userType,
        @Nullable Integer credentialRule,
        int timedInvokeTimeoutMs) {
      setUser(
          chipClusterPtr,
          callback,
          operationType,
          userIndex,
          userName,
          userUniqueId,
          userStatus,
          userType,
          credentialRule,
          timedInvokeTimeoutMs);
    }

    public void getUser(GetUserResponseCallback callback, Integer userIndex) {
      getUser(chipClusterPtr, callback, userIndex, null);
    }

    public void getUser(
        GetUserResponseCallback callback, Integer userIndex, int timedInvokeTimeoutMs) {
      getUser(chipClusterPtr, callback, userIndex, timedInvokeTimeoutMs);
    }

    public void clearUser(
        DefaultClusterCallback callback, Integer userIndex, int timedInvokeTimeoutMs) {
      clearUser(chipClusterPtr, callback, userIndex, timedInvokeTimeoutMs);
    }

    public void setCredential(
        SetCredentialResponseCallback callback,
        Integer operationType,
        ChipStructs.DoorLockClusterDlCredential credential,
        byte[] credentialData,
        @Nullable Integer userIndex,
        @Nullable Integer userStatus,
        @Nullable Integer userType,
        int timedInvokeTimeoutMs) {
      setCredential(
          chipClusterPtr,
          callback,
          operationType,
          credential,
          credentialData,
          userIndex,
          userStatus,
          userType,
          timedInvokeTimeoutMs);
    }

    public void getCredentialStatus(
        GetCredentialStatusResponseCallback callback,
        ChipStructs.DoorLockClusterDlCredential credential) {
      getCredentialStatus(chipClusterPtr, callback, credential, null);
    }

    public void getCredentialStatus(
        GetCredentialStatusResponseCallback callback,
        ChipStructs.DoorLockClusterDlCredential credential,
        int timedInvokeTimeoutMs) {
      getCredentialStatus(chipClusterPtr, callback, credential, timedInvokeTimeoutMs);
    }

    public void clearCredential(
        DefaultClusterCallback callback,
        @Nullable ChipStructs.DoorLockClusterDlCredential credential,
        int timedInvokeTimeoutMs) {
      clearCredential(chipClusterPtr, callback, credential, timedInvokeTimeoutMs);
    }

    private native void lockDoor(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Optional<byte[]> pinCode,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void unlockDoor(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Optional<byte[]> pinCode,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void unlockWithTimeout(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer timeout,
        Optional<byte[]> pinCode,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setWeekDaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer weekDayIndex,
        Integer userIndex,
        Integer daysMask,
        Integer startHour,
        Integer startMinute,
        Integer endHour,
        Integer endMinute,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getWeekDaySchedule(
        long chipClusterPtr,
        GetWeekDayScheduleResponseCallback Callback,
        Integer weekDayIndex,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearWeekDaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer weekDayIndex,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setYearDaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer yearDayIndex,
        Integer userIndex,
        Long localStartTime,
        Long localEndTime,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getYearDaySchedule(
        long chipClusterPtr,
        GetYearDayScheduleResponseCallback Callback,
        Integer yearDayIndex,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearYearDaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer yearDayIndex,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setHolidaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer holidayIndex,
        Long localStartTime,
        Long localEndTime,
        Integer operatingMode,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getHolidaySchedule(
        long chipClusterPtr,
        GetHolidayScheduleResponseCallback Callback,
        Integer holidayIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearHolidaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer holidayIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setUser(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer operationType,
        Integer userIndex,
        @Nullable String userName,
        @Nullable Long userUniqueId,
        @Nullable Integer userStatus,
        @Nullable Integer userType,
        @Nullable Integer credentialRule,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getUser(
        long chipClusterPtr,
        GetUserResponseCallback Callback,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearUser(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setCredential(
        long chipClusterPtr,
        SetCredentialResponseCallback Callback,
        Integer operationType,
        ChipStructs.DoorLockClusterDlCredential credential,
        byte[] credentialData,
        @Nullable Integer userIndex,
        @Nullable Integer userStatus,
        @Nullable Integer userType,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getCredentialStatus(
        long chipClusterPtr,
        GetCredentialStatusResponseCallback Callback,
        ChipStructs.DoorLockClusterDlCredential credential,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearCredential(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable ChipStructs.DoorLockClusterDlCredential credential,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GetWeekDayScheduleResponseCallback {
      void onSuccess(
          Integer weekDayIndex,
          Integer userIndex,
          Integer status,
          Optional<Integer> daysMask,
          Optional<Integer> startHour,
          Optional<Integer> startMinute,
          Optional<Integer> endHour,
          Optional<Integer> endMinute);

      void onError(Exception error);
    }

    public interface GetYearDayScheduleResponseCallback {
      void onSuccess(
          Integer yearDayIndex,
          Integer userIndex,
          Integer status,
          Optional<Long> localStartTime,
          Optional<Long> localEndTime);

      void onError(Exception error);
    }

    public interface GetHolidayScheduleResponseCallback {
      void onSuccess(
          Integer holidayIndex,
          Integer status,
          Optional<Long> localStartTime,
          Optional<Long> localEndTime,
          Optional<Integer> operatingMode);

      void onError(Exception error);
    }

    public interface GetUserResponseCallback {
      void onSuccess(
          Integer userIndex,
          @Nullable String userName,
          @Nullable Long userUniqueId,
          @Nullable Integer userStatus,
          @Nullable Integer userType,
          @Nullable Integer credentialRule,
          @Nullable ArrayList<ChipStructs.DoorLockClusterDlCredential> credentials,
          @Nullable Integer creatorFabricIndex,
          @Nullable Integer lastModifiedFabricIndex,
          @Nullable Integer nextUserIndex);

      void onError(Exception error);
    }

    public interface SetCredentialResponseCallback {
      void onSuccess(
          Integer status, @Nullable Integer userIndex, @Nullable Integer nextCredentialIndex);

      void onError(Exception error);
    }

    public interface GetCredentialStatusResponseCallback {
      void onSuccess(
          Boolean credentialExists,
          @Nullable Integer userIndex,
          @Nullable Integer creatorFabricIndex,
          @Nullable Integer lastModifiedFabricIndex,
          @Nullable Integer nextCredentialIndex);

      void onError(Exception error);
    }

    public interface LockStateAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface DoorStateAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readLockStateAttribute(LockStateAttributeCallback callback) {
      readLockStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeLockStateAttribute(
        LockStateAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLockStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLockTypeAttribute(IntegerAttributeCallback callback) {
      readLockTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeLockTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLockTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActuatorEnabledAttribute(BooleanAttributeCallback callback) {
      readActuatorEnabledAttribute(chipClusterPtr, callback);
    }

    public void subscribeActuatorEnabledAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActuatorEnabledAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDoorStateAttribute(DoorStateAttributeCallback callback) {
      readDoorStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeDoorStateAttribute(
        DoorStateAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDoorStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfTotalUsersSupportedAttribute(IntegerAttributeCallback callback) {
      readNumberOfTotalUsersSupportedAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfTotalUsersSupportedAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfTotalUsersSupportedAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfPINUsersSupportedAttribute(IntegerAttributeCallback callback) {
      readNumberOfPINUsersSupportedAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfPINUsersSupportedAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfPINUsersSupportedAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfRFIDUsersSupportedAttribute(IntegerAttributeCallback callback) {
      readNumberOfRFIDUsersSupportedAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfRFIDUsersSupportedAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfRFIDUsersSupportedAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfWeekDaySchedulesSupportedPerUserAttribute(
        IntegerAttributeCallback callback) {
      readNumberOfWeekDaySchedulesSupportedPerUserAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfWeekDaySchedulesSupportedPerUserAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfWeekDaySchedulesSupportedPerUserAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfYearDaySchedulesSupportedPerUserAttribute(
        IntegerAttributeCallback callback) {
      readNumberOfYearDaySchedulesSupportedPerUserAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfYearDaySchedulesSupportedPerUserAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfYearDaySchedulesSupportedPerUserAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfHolidaySchedulesSupportedAttribute(IntegerAttributeCallback callback) {
      readNumberOfHolidaySchedulesSupportedAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfHolidaySchedulesSupportedAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfHolidaySchedulesSupportedAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxPINCodeLengthAttribute(IntegerAttributeCallback callback) {
      readMaxPINCodeLengthAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxPINCodeLengthAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxPINCodeLengthAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinPINCodeLengthAttribute(IntegerAttributeCallback callback) {
      readMinPINCodeLengthAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinPINCodeLengthAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinPINCodeLengthAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxRFIDCodeLengthAttribute(IntegerAttributeCallback callback) {
      readMaxRFIDCodeLengthAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxRFIDCodeLengthAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxRFIDCodeLengthAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinRFIDCodeLengthAttribute(IntegerAttributeCallback callback) {
      readMinRFIDCodeLengthAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinRFIDCodeLengthAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinRFIDCodeLengthAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfCredentialsSupportedPerUserAttribute(
        IntegerAttributeCallback callback) {
      readNumberOfCredentialsSupportedPerUserAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfCredentialsSupportedPerUserAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfCredentialsSupportedPerUserAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLanguageAttribute(CharStringAttributeCallback callback) {
      readLanguageAttribute(chipClusterPtr, callback);
    }

    public void writeLanguageAttribute(DefaultClusterCallback callback, String value) {
      writeLanguageAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLanguageAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeLanguageAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLanguageAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLanguageAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAutoRelockTimeAttribute(LongAttributeCallback callback) {
      readAutoRelockTimeAttribute(chipClusterPtr, callback);
    }

    public void writeAutoRelockTimeAttribute(DefaultClusterCallback callback, Long value) {
      writeAutoRelockTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeAutoRelockTimeAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeAutoRelockTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeAutoRelockTimeAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAutoRelockTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSoundVolumeAttribute(IntegerAttributeCallback callback) {
      readSoundVolumeAttribute(chipClusterPtr, callback);
    }

    public void writeSoundVolumeAttribute(DefaultClusterCallback callback, Integer value) {
      writeSoundVolumeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeSoundVolumeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeSoundVolumeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeSoundVolumeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSoundVolumeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOperatingModeAttribute(IntegerAttributeCallback callback) {
      readOperatingModeAttribute(chipClusterPtr, callback);
    }

    public void writeOperatingModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOperatingModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOperatingModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOperatingModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOperatingModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOperatingModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedOperatingModesAttribute(IntegerAttributeCallback callback) {
      readSupportedOperatingModesAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportedOperatingModesAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedOperatingModesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnableOneTouchLockingAttribute(BooleanAttributeCallback callback) {
      readEnableOneTouchLockingAttribute(chipClusterPtr, callback);
    }

    public void writeEnableOneTouchLockingAttribute(
        DefaultClusterCallback callback, Boolean value) {
      writeEnableOneTouchLockingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeEnableOneTouchLockingAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeEnableOneTouchLockingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEnableOneTouchLockingAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnableOneTouchLockingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnablePrivacyModeButtonAttribute(BooleanAttributeCallback callback) {
      readEnablePrivacyModeButtonAttribute(chipClusterPtr, callback);
    }

    public void writeEnablePrivacyModeButtonAttribute(
        DefaultClusterCallback callback, Boolean value) {
      writeEnablePrivacyModeButtonAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeEnablePrivacyModeButtonAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeEnablePrivacyModeButtonAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEnablePrivacyModeButtonAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnablePrivacyModeButtonAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWrongCodeEntryLimitAttribute(IntegerAttributeCallback callback) {
      readWrongCodeEntryLimitAttribute(chipClusterPtr, callback);
    }

    public void writeWrongCodeEntryLimitAttribute(DefaultClusterCallback callback, Integer value) {
      writeWrongCodeEntryLimitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeWrongCodeEntryLimitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeWrongCodeEntryLimitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeWrongCodeEntryLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWrongCodeEntryLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUserCodeTemporaryDisableTimeAttribute(IntegerAttributeCallback callback) {
      readUserCodeTemporaryDisableTimeAttribute(chipClusterPtr, callback);
    }

    public void writeUserCodeTemporaryDisableTimeAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeUserCodeTemporaryDisableTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeUserCodeTemporaryDisableTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeUserCodeTemporaryDisableTimeAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeUserCodeTemporaryDisableTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUserCodeTemporaryDisableTimeAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRequirePINforRemoteOperationAttribute(BooleanAttributeCallback callback) {
      readRequirePINforRemoteOperationAttribute(chipClusterPtr, callback);
    }

    public void writeRequirePINforRemoteOperationAttribute(
        DefaultClusterCallback callback, Boolean value) {
      writeRequirePINforRemoteOperationAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRequirePINforRemoteOperationAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeRequirePINforRemoteOperationAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readLockStateAttribute(
        long chipClusterPtr, LockStateAttributeCallback callback);

    private native void subscribeLockStateAttribute(
        long chipClusterPtr, LockStateAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLockTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeLockTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActuatorEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeActuatorEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readDoorStateAttribute(
        long chipClusterPtr, DoorStateAttributeCallback callback);

    private native void subscribeDoorStateAttribute(
        long chipClusterPtr, DoorStateAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfTotalUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfTotalUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfPINUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfPINUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfRFIDUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfRFIDUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfWeekDaySchedulesSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfWeekDaySchedulesSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfYearDaySchedulesSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfYearDaySchedulesSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfHolidaySchedulesSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfHolidaySchedulesSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxPINCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxPINCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinPINCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMinPINCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxRFIDCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxRFIDCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinRFIDCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMinRFIDCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfCredentialsSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfCredentialsSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLanguageAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeLanguageAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLanguageAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAutoRelockTimeAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void writeAutoRelockTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeAutoRelockTimeAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSoundVolumeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeSoundVolumeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeSoundVolumeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOperatingModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOperatingModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOperatingModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSupportedOperatingModesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSupportedOperatingModesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEnableOneTouchLockingAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeEnableOneTouchLockingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEnableOneTouchLockingAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEnablePrivacyModeButtonAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeEnablePrivacyModeButtonAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEnablePrivacyModeButtonAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWrongCodeEntryLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeWrongCodeEntryLimitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeWrongCodeEntryLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUserCodeTemporaryDisableTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeUserCodeTemporaryDisableTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeUserCodeTemporaryDisableTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRequirePINforRemoteOperationAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeRequirePINforRemoteOperationAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class WindowCoveringCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 258L;

    public WindowCoveringCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void upOrOpen(DefaultClusterCallback callback) {
      upOrOpen(chipClusterPtr, callback, null);
    }

    public void upOrOpen(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      upOrOpen(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void downOrClose(DefaultClusterCallback callback) {
      downOrClose(chipClusterPtr, callback, null);
    }

    public void downOrClose(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      downOrClose(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void stopMotion(DefaultClusterCallback callback) {
      stopMotion(chipClusterPtr, callback, null);
    }

    public void stopMotion(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      stopMotion(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void goToLiftValue(DefaultClusterCallback callback, Integer liftValue) {
      goToLiftValue(chipClusterPtr, callback, liftValue, null);
    }

    public void goToLiftValue(
        DefaultClusterCallback callback, Integer liftValue, int timedInvokeTimeoutMs) {
      goToLiftValue(chipClusterPtr, callback, liftValue, timedInvokeTimeoutMs);
    }

    public void goToLiftPercentage(
        DefaultClusterCallback callback, Integer liftPercent100thsValue) {
      goToLiftPercentage(chipClusterPtr, callback, liftPercent100thsValue, null);
    }

    public void goToLiftPercentage(
        DefaultClusterCallback callback, Integer liftPercent100thsValue, int timedInvokeTimeoutMs) {
      goToLiftPercentage(chipClusterPtr, callback, liftPercent100thsValue, timedInvokeTimeoutMs);
    }

    public void goToTiltValue(DefaultClusterCallback callback, Integer tiltValue) {
      goToTiltValue(chipClusterPtr, callback, tiltValue, null);
    }

    public void goToTiltValue(
        DefaultClusterCallback callback, Integer tiltValue, int timedInvokeTimeoutMs) {
      goToTiltValue(chipClusterPtr, callback, tiltValue, timedInvokeTimeoutMs);
    }

    public void goToTiltPercentage(
        DefaultClusterCallback callback, Integer tiltPercent100thsValue) {
      goToTiltPercentage(chipClusterPtr, callback, tiltPercent100thsValue, null);
    }

    public void goToTiltPercentage(
        DefaultClusterCallback callback, Integer tiltPercent100thsValue, int timedInvokeTimeoutMs) {
      goToTiltPercentage(chipClusterPtr, callback, tiltPercent100thsValue, timedInvokeTimeoutMs);
    }

    private native void upOrOpen(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void downOrClose(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopMotion(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void goToLiftValue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer liftValue,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void goToLiftPercentage(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer liftPercent100thsValue,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void goToTiltValue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer tiltValue,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void goToTiltPercentage(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer tiltPercent100thsValue,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface CurrentPositionLiftAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentPositionTiltAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentPositionLiftPercentageAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentPositionTiltPercentageAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface TargetPositionLiftPercent100thsAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface TargetPositionTiltPercent100thsAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentPositionLiftPercent100thsAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentPositionTiltPercent100thsAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readTypeAttribute(IntegerAttributeCallback callback) {
      readTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPhysicalClosedLimitLiftAttribute(IntegerAttributeCallback callback) {
      readPhysicalClosedLimitLiftAttribute(chipClusterPtr, callback);
    }

    public void subscribePhysicalClosedLimitLiftAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePhysicalClosedLimitLiftAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPhysicalClosedLimitTiltAttribute(IntegerAttributeCallback callback) {
      readPhysicalClosedLimitTiltAttribute(chipClusterPtr, callback);
    }

    public void subscribePhysicalClosedLimitTiltAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePhysicalClosedLimitTiltAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionLiftAttribute(CurrentPositionLiftAttributeCallback callback) {
      readCurrentPositionLiftAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionLiftAttribute(
        CurrentPositionLiftAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentPositionLiftAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionTiltAttribute(CurrentPositionTiltAttributeCallback callback) {
      readCurrentPositionTiltAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionTiltAttribute(
        CurrentPositionTiltAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentPositionTiltAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfActuationsLiftAttribute(IntegerAttributeCallback callback) {
      readNumberOfActuationsLiftAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfActuationsLiftAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfActuationsLiftAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfActuationsTiltAttribute(IntegerAttributeCallback callback) {
      readNumberOfActuationsTiltAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfActuationsTiltAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfActuationsTiltAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readConfigStatusAttribute(IntegerAttributeCallback callback) {
      readConfigStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeConfigStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeConfigStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionLiftPercentageAttribute(
        CurrentPositionLiftPercentageAttributeCallback callback) {
      readCurrentPositionLiftPercentageAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionLiftPercentageAttribute(
        CurrentPositionLiftPercentageAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentPositionLiftPercentageAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionTiltPercentageAttribute(
        CurrentPositionTiltPercentageAttributeCallback callback) {
      readCurrentPositionTiltPercentageAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionTiltPercentageAttribute(
        CurrentPositionTiltPercentageAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentPositionTiltPercentageAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOperationalStatusAttribute(IntegerAttributeCallback callback) {
      readOperationalStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeOperationalStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOperationalStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTargetPositionLiftPercent100thsAttribute(
        TargetPositionLiftPercent100thsAttributeCallback callback) {
      readTargetPositionLiftPercent100thsAttribute(chipClusterPtr, callback);
    }

    public void subscribeTargetPositionLiftPercent100thsAttribute(
        TargetPositionLiftPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval) {
      subscribeTargetPositionLiftPercent100thsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTargetPositionTiltPercent100thsAttribute(
        TargetPositionTiltPercent100thsAttributeCallback callback) {
      readTargetPositionTiltPercent100thsAttribute(chipClusterPtr, callback);
    }

    public void subscribeTargetPositionTiltPercent100thsAttribute(
        TargetPositionTiltPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval) {
      subscribeTargetPositionTiltPercent100thsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEndProductTypeAttribute(IntegerAttributeCallback callback) {
      readEndProductTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeEndProductTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEndProductTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionLiftPercent100thsAttribute(
        CurrentPositionLiftPercent100thsAttributeCallback callback) {
      readCurrentPositionLiftPercent100thsAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionLiftPercent100thsAttribute(
        CurrentPositionLiftPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval) {
      subscribeCurrentPositionLiftPercent100thsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionTiltPercent100thsAttribute(
        CurrentPositionTiltPercent100thsAttributeCallback callback) {
      readCurrentPositionTiltPercent100thsAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionTiltPercent100thsAttribute(
        CurrentPositionTiltPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval) {
      subscribeCurrentPositionTiltPercent100thsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInstalledOpenLimitLiftAttribute(IntegerAttributeCallback callback) {
      readInstalledOpenLimitLiftAttribute(chipClusterPtr, callback);
    }

    public void subscribeInstalledOpenLimitLiftAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInstalledOpenLimitLiftAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInstalledClosedLimitLiftAttribute(IntegerAttributeCallback callback) {
      readInstalledClosedLimitLiftAttribute(chipClusterPtr, callback);
    }

    public void subscribeInstalledClosedLimitLiftAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInstalledClosedLimitLiftAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInstalledOpenLimitTiltAttribute(IntegerAttributeCallback callback) {
      readInstalledOpenLimitTiltAttribute(chipClusterPtr, callback);
    }

    public void subscribeInstalledOpenLimitTiltAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInstalledOpenLimitTiltAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInstalledClosedLimitTiltAttribute(IntegerAttributeCallback callback) {
      readInstalledClosedLimitTiltAttribute(chipClusterPtr, callback);
    }

    public void subscribeInstalledClosedLimitTiltAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInstalledClosedLimitTiltAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readModeAttribute(IntegerAttributeCallback callback) {
      readModeAttribute(chipClusterPtr, callback);
    }

    public void writeModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSafetyStatusAttribute(IntegerAttributeCallback callback) {
      readSafetyStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeSafetyStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSafetyStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readTypeAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPhysicalClosedLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePhysicalClosedLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPhysicalClosedLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePhysicalClosedLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentPositionLiftAttribute(
        long chipClusterPtr, CurrentPositionLiftAttributeCallback callback);

    private native void subscribeCurrentPositionLiftAttribute(
        long chipClusterPtr,
        CurrentPositionLiftAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentPositionTiltAttribute(
        long chipClusterPtr, CurrentPositionTiltAttributeCallback callback);

    private native void subscribeCurrentPositionTiltAttribute(
        long chipClusterPtr,
        CurrentPositionTiltAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNumberOfActuationsLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfActuationsLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfActuationsTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfActuationsTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readConfigStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeConfigStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentPositionLiftPercentageAttribute(
        long chipClusterPtr, CurrentPositionLiftPercentageAttributeCallback callback);

    private native void subscribeCurrentPositionLiftPercentageAttribute(
        long chipClusterPtr,
        CurrentPositionLiftPercentageAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentPositionTiltPercentageAttribute(
        long chipClusterPtr, CurrentPositionTiltPercentageAttributeCallback callback);

    private native void subscribeCurrentPositionTiltPercentageAttribute(
        long chipClusterPtr,
        CurrentPositionTiltPercentageAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOperationalStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeOperationalStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTargetPositionLiftPercent100thsAttribute(
        long chipClusterPtr, TargetPositionLiftPercent100thsAttributeCallback callback);

    private native void subscribeTargetPositionLiftPercent100thsAttribute(
        long chipClusterPtr,
        TargetPositionLiftPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readTargetPositionTiltPercent100thsAttribute(
        long chipClusterPtr, TargetPositionTiltPercent100thsAttributeCallback callback);

    private native void subscribeTargetPositionTiltPercent100thsAttribute(
        long chipClusterPtr,
        TargetPositionTiltPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readEndProductTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeEndProductTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentPositionLiftPercent100thsAttribute(
        long chipClusterPtr, CurrentPositionLiftPercent100thsAttributeCallback callback);

    private native void subscribeCurrentPositionLiftPercent100thsAttribute(
        long chipClusterPtr,
        CurrentPositionLiftPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentPositionTiltPercent100thsAttribute(
        long chipClusterPtr, CurrentPositionTiltPercent100thsAttributeCallback callback);

    private native void subscribeCurrentPositionTiltPercent100thsAttribute(
        long chipClusterPtr,
        CurrentPositionTiltPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readInstalledOpenLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeInstalledOpenLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInstalledClosedLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeInstalledClosedLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInstalledOpenLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeInstalledOpenLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInstalledClosedLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeInstalledClosedLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readModeAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSafetyStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSafetyStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BarrierControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 259L;

    public BarrierControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void barrierControlGoToPercent(DefaultClusterCallback callback, Integer percentOpen) {
      barrierControlGoToPercent(chipClusterPtr, callback, percentOpen, null);
    }

    public void barrierControlGoToPercent(
        DefaultClusterCallback callback, Integer percentOpen, int timedInvokeTimeoutMs) {
      barrierControlGoToPercent(chipClusterPtr, callback, percentOpen, timedInvokeTimeoutMs);
    }

    public void barrierControlStop(DefaultClusterCallback callback) {
      barrierControlStop(chipClusterPtr, callback, null);
    }

    public void barrierControlStop(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      barrierControlStop(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void barrierControlGoToPercent(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer percentOpen,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void barrierControlStop(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readBarrierMovingStateAttribute(IntegerAttributeCallback callback) {
      readBarrierMovingStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeBarrierMovingStateAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBarrierMovingStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBarrierSafetyStatusAttribute(IntegerAttributeCallback callback) {
      readBarrierSafetyStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeBarrierSafetyStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBarrierSafetyStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBarrierCapabilitiesAttribute(IntegerAttributeCallback callback) {
      readBarrierCapabilitiesAttribute(chipClusterPtr, callback);
    }

    public void subscribeBarrierCapabilitiesAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBarrierCapabilitiesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBarrierPositionAttribute(IntegerAttributeCallback callback) {
      readBarrierPositionAttribute(chipClusterPtr, callback);
    }

    public void subscribeBarrierPositionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBarrierPositionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readBarrierMovingStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBarrierMovingStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBarrierSafetyStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBarrierSafetyStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBarrierCapabilitiesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBarrierCapabilitiesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBarrierPositionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBarrierPositionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class PumpConfigurationAndControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 512L;

    public PumpConfigurationAndControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MaxPressureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxSpeedAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxFlowAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinConstPressureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxConstPressureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinCompPressureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxCompPressureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinConstSpeedAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxConstSpeedAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinConstFlowAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxConstFlowAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinConstTempAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxConstTempAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CapacityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SpeedAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LifetimeRunningHoursAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PowerAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LifetimeEnergyConsumedAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMaxPressureAttribute(MaxPressureAttributeCallback callback) {
      readMaxPressureAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxPressureAttribute(
        MaxPressureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxPressureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxSpeedAttribute(MaxSpeedAttributeCallback callback) {
      readMaxSpeedAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxSpeedAttribute(
        MaxSpeedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxSpeedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxFlowAttribute(MaxFlowAttributeCallback callback) {
      readMaxFlowAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxFlowAttribute(
        MaxFlowAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxFlowAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinConstPressureAttribute(MinConstPressureAttributeCallback callback) {
      readMinConstPressureAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinConstPressureAttribute(
        MinConstPressureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinConstPressureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxConstPressureAttribute(MaxConstPressureAttributeCallback callback) {
      readMaxConstPressureAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxConstPressureAttribute(
        MaxConstPressureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxConstPressureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinCompPressureAttribute(MinCompPressureAttributeCallback callback) {
      readMinCompPressureAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinCompPressureAttribute(
        MinCompPressureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinCompPressureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxCompPressureAttribute(MaxCompPressureAttributeCallback callback) {
      readMaxCompPressureAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxCompPressureAttribute(
        MaxCompPressureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxCompPressureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinConstSpeedAttribute(MinConstSpeedAttributeCallback callback) {
      readMinConstSpeedAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinConstSpeedAttribute(
        MinConstSpeedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinConstSpeedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxConstSpeedAttribute(MaxConstSpeedAttributeCallback callback) {
      readMaxConstSpeedAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxConstSpeedAttribute(
        MaxConstSpeedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxConstSpeedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinConstFlowAttribute(MinConstFlowAttributeCallback callback) {
      readMinConstFlowAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinConstFlowAttribute(
        MinConstFlowAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinConstFlowAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxConstFlowAttribute(MaxConstFlowAttributeCallback callback) {
      readMaxConstFlowAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxConstFlowAttribute(
        MaxConstFlowAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxConstFlowAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinConstTempAttribute(MinConstTempAttributeCallback callback) {
      readMinConstTempAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinConstTempAttribute(
        MinConstTempAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinConstTempAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxConstTempAttribute(MaxConstTempAttributeCallback callback) {
      readMaxConstTempAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxConstTempAttribute(
        MaxConstTempAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxConstTempAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPumpStatusAttribute(IntegerAttributeCallback callback) {
      readPumpStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribePumpStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePumpStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEffectiveOperationModeAttribute(IntegerAttributeCallback callback) {
      readEffectiveOperationModeAttribute(chipClusterPtr, callback);
    }

    public void subscribeEffectiveOperationModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEffectiveOperationModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEffectiveControlModeAttribute(IntegerAttributeCallback callback) {
      readEffectiveControlModeAttribute(chipClusterPtr, callback);
    }

    public void subscribeEffectiveControlModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEffectiveControlModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCapacityAttribute(CapacityAttributeCallback callback) {
      readCapacityAttribute(chipClusterPtr, callback);
    }

    public void subscribeCapacityAttribute(
        CapacityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCapacityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSpeedAttribute(SpeedAttributeCallback callback) {
      readSpeedAttribute(chipClusterPtr, callback);
    }

    public void subscribeSpeedAttribute(
        SpeedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSpeedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLifetimeRunningHoursAttribute(LifetimeRunningHoursAttributeCallback callback) {
      readLifetimeRunningHoursAttribute(chipClusterPtr, callback);
    }

    public void writeLifetimeRunningHoursAttribute(DefaultClusterCallback callback, Long value) {
      writeLifetimeRunningHoursAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLifetimeRunningHoursAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeLifetimeRunningHoursAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLifetimeRunningHoursAttribute(
        LifetimeRunningHoursAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLifetimeRunningHoursAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPowerAttribute(PowerAttributeCallback callback) {
      readPowerAttribute(chipClusterPtr, callback);
    }

    public void subscribePowerAttribute(
        PowerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePowerAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLifetimeEnergyConsumedAttribute(
        LifetimeEnergyConsumedAttributeCallback callback) {
      readLifetimeEnergyConsumedAttribute(chipClusterPtr, callback);
    }

    public void writeLifetimeEnergyConsumedAttribute(DefaultClusterCallback callback, Long value) {
      writeLifetimeEnergyConsumedAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLifetimeEnergyConsumedAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeLifetimeEnergyConsumedAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLifetimeEnergyConsumedAttribute(
        LifetimeEnergyConsumedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLifetimeEnergyConsumedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOperationModeAttribute(IntegerAttributeCallback callback) {
      readOperationModeAttribute(chipClusterPtr, callback);
    }

    public void writeOperationModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOperationModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOperationModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOperationModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOperationModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOperationModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readControlModeAttribute(IntegerAttributeCallback callback) {
      readControlModeAttribute(chipClusterPtr, callback);
    }

    public void writeControlModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeControlModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeControlModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeControlModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeControlModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeControlModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMaxPressureAttribute(
        long chipClusterPtr, MaxPressureAttributeCallback callback);

    private native void subscribeMaxPressureAttribute(
        long chipClusterPtr,
        MaxPressureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxSpeedAttribute(
        long chipClusterPtr, MaxSpeedAttributeCallback callback);

    private native void subscribeMaxSpeedAttribute(
        long chipClusterPtr, MaxSpeedAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxFlowAttribute(
        long chipClusterPtr, MaxFlowAttributeCallback callback);

    private native void subscribeMaxFlowAttribute(
        long chipClusterPtr, MaxFlowAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinConstPressureAttribute(
        long chipClusterPtr, MinConstPressureAttributeCallback callback);

    private native void subscribeMinConstPressureAttribute(
        long chipClusterPtr,
        MinConstPressureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxConstPressureAttribute(
        long chipClusterPtr, MaxConstPressureAttributeCallback callback);

    private native void subscribeMaxConstPressureAttribute(
        long chipClusterPtr,
        MaxConstPressureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinCompPressureAttribute(
        long chipClusterPtr, MinCompPressureAttributeCallback callback);

    private native void subscribeMinCompPressureAttribute(
        long chipClusterPtr,
        MinCompPressureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxCompPressureAttribute(
        long chipClusterPtr, MaxCompPressureAttributeCallback callback);

    private native void subscribeMaxCompPressureAttribute(
        long chipClusterPtr,
        MaxCompPressureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinConstSpeedAttribute(
        long chipClusterPtr, MinConstSpeedAttributeCallback callback);

    private native void subscribeMinConstSpeedAttribute(
        long chipClusterPtr,
        MinConstSpeedAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxConstSpeedAttribute(
        long chipClusterPtr, MaxConstSpeedAttributeCallback callback);

    private native void subscribeMaxConstSpeedAttribute(
        long chipClusterPtr,
        MaxConstSpeedAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinConstFlowAttribute(
        long chipClusterPtr, MinConstFlowAttributeCallback callback);

    private native void subscribeMinConstFlowAttribute(
        long chipClusterPtr,
        MinConstFlowAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxConstFlowAttribute(
        long chipClusterPtr, MaxConstFlowAttributeCallback callback);

    private native void subscribeMaxConstFlowAttribute(
        long chipClusterPtr,
        MaxConstFlowAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinConstTempAttribute(
        long chipClusterPtr, MinConstTempAttributeCallback callback);

    private native void subscribeMinConstTempAttribute(
        long chipClusterPtr,
        MinConstTempAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxConstTempAttribute(
        long chipClusterPtr, MaxConstTempAttributeCallback callback);

    private native void subscribeMaxConstTempAttribute(
        long chipClusterPtr,
        MaxConstTempAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPumpStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePumpStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEffectiveOperationModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeEffectiveOperationModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEffectiveControlModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeEffectiveControlModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCapacityAttribute(
        long chipClusterPtr, CapacityAttributeCallback callback);

    private native void subscribeCapacityAttribute(
        long chipClusterPtr, CapacityAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSpeedAttribute(long chipClusterPtr, SpeedAttributeCallback callback);

    private native void subscribeSpeedAttribute(
        long chipClusterPtr, SpeedAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLifetimeRunningHoursAttribute(
        long chipClusterPtr, LifetimeRunningHoursAttributeCallback callback);

    private native void writeLifetimeRunningHoursAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLifetimeRunningHoursAttribute(
        long chipClusterPtr,
        LifetimeRunningHoursAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPowerAttribute(long chipClusterPtr, PowerAttributeCallback callback);

    private native void subscribePowerAttribute(
        long chipClusterPtr, PowerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLifetimeEnergyConsumedAttribute(
        long chipClusterPtr, LifetimeEnergyConsumedAttributeCallback callback);

    private native void writeLifetimeEnergyConsumedAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLifetimeEnergyConsumedAttribute(
        long chipClusterPtr,
        LifetimeEnergyConsumedAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOperationModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOperationModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOperationModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readControlModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeControlModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeControlModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ThermostatCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 513L;

    public ThermostatCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void setpointRaiseLower(DefaultClusterCallback callback, Integer mode, Integer amount) {
      setpointRaiseLower(chipClusterPtr, callback, mode, amount, null);
    }

    public void setpointRaiseLower(
        DefaultClusterCallback callback, Integer mode, Integer amount, int timedInvokeTimeoutMs) {
      setpointRaiseLower(chipClusterPtr, callback, mode, amount, timedInvokeTimeoutMs);
    }

    public void setWeeklySchedule(
        DefaultClusterCallback callback,
        Integer numberOfTransitionsForSequence,
        Integer dayOfWeekForSequence,
        Integer modeForSequence,
        ArrayList<ChipStructs.ThermostatClusterThermostatScheduleTransition> transitions) {
      setWeeklySchedule(
          chipClusterPtr,
          callback,
          numberOfTransitionsForSequence,
          dayOfWeekForSequence,
          modeForSequence,
          transitions,
          null);
    }

    public void setWeeklySchedule(
        DefaultClusterCallback callback,
        Integer numberOfTransitionsForSequence,
        Integer dayOfWeekForSequence,
        Integer modeForSequence,
        ArrayList<ChipStructs.ThermostatClusterThermostatScheduleTransition> transitions,
        int timedInvokeTimeoutMs) {
      setWeeklySchedule(
          chipClusterPtr,
          callback,
          numberOfTransitionsForSequence,
          dayOfWeekForSequence,
          modeForSequence,
          transitions,
          timedInvokeTimeoutMs);
    }

    public void getWeeklySchedule(
        GetWeeklyScheduleResponseCallback callback, Integer daysToReturn, Integer modeToReturn) {
      getWeeklySchedule(chipClusterPtr, callback, daysToReturn, modeToReturn, null);
    }

    public void getWeeklySchedule(
        GetWeeklyScheduleResponseCallback callback,
        Integer daysToReturn,
        Integer modeToReturn,
        int timedInvokeTimeoutMs) {
      getWeeklySchedule(chipClusterPtr, callback, daysToReturn, modeToReturn, timedInvokeTimeoutMs);
    }

    public void clearWeeklySchedule(DefaultClusterCallback callback) {
      clearWeeklySchedule(chipClusterPtr, callback, null);
    }

    public void clearWeeklySchedule(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      clearWeeklySchedule(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void setpointRaiseLower(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer mode,
        Integer amount,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setWeeklySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer numberOfTransitionsForSequence,
        Integer dayOfWeekForSequence,
        Integer modeForSequence,
        ArrayList<ChipStructs.ThermostatClusterThermostatScheduleTransition> transitions,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getWeeklySchedule(
        long chipClusterPtr,
        GetWeeklyScheduleResponseCallback Callback,
        Integer daysToReturn,
        Integer modeToReturn,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearWeeklySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GetWeeklyScheduleResponseCallback {
      void onSuccess(
          Integer numberOfTransitionsForSequence,
          Integer dayOfWeekForSequence,
          Integer modeForSequence,
          ArrayList<ChipStructs.ThermostatClusterThermostatScheduleTransition> transitions);

      void onError(Exception error);
    }

    public interface LocalTemperatureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readLocalTemperatureAttribute(LocalTemperatureAttributeCallback callback) {
      readLocalTemperatureAttribute(chipClusterPtr, callback);
    }

    public void subscribeLocalTemperatureAttribute(
        LocalTemperatureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLocalTemperatureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAbsMinHeatSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readAbsMinHeatSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void subscribeAbsMinHeatSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAbsMinHeatSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAbsMaxHeatSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readAbsMaxHeatSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void subscribeAbsMaxHeatSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAbsMaxHeatSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAbsMinCoolSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readAbsMinCoolSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void subscribeAbsMinCoolSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAbsMinCoolSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAbsMaxCoolSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readAbsMaxCoolSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void subscribeAbsMaxCoolSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAbsMaxCoolSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOccupiedCoolingSetpointAttribute(IntegerAttributeCallback callback) {
      readOccupiedCoolingSetpointAttribute(chipClusterPtr, callback);
    }

    public void writeOccupiedCoolingSetpointAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeOccupiedCoolingSetpointAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOccupiedCoolingSetpointAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOccupiedCoolingSetpointAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOccupiedCoolingSetpointAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOccupiedCoolingSetpointAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOccupiedHeatingSetpointAttribute(IntegerAttributeCallback callback) {
      readOccupiedHeatingSetpointAttribute(chipClusterPtr, callback);
    }

    public void writeOccupiedHeatingSetpointAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeOccupiedHeatingSetpointAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOccupiedHeatingSetpointAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOccupiedHeatingSetpointAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOccupiedHeatingSetpointAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOccupiedHeatingSetpointAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinHeatSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readMinHeatSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void writeMinHeatSetpointLimitAttribute(DefaultClusterCallback callback, Integer value) {
      writeMinHeatSetpointLimitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMinHeatSetpointLimitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMinHeatSetpointLimitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMinHeatSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinHeatSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxHeatSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readMaxHeatSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void writeMaxHeatSetpointLimitAttribute(DefaultClusterCallback callback, Integer value) {
      writeMaxHeatSetpointLimitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMaxHeatSetpointLimitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMaxHeatSetpointLimitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMaxHeatSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxHeatSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinCoolSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readMinCoolSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void writeMinCoolSetpointLimitAttribute(DefaultClusterCallback callback, Integer value) {
      writeMinCoolSetpointLimitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMinCoolSetpointLimitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMinCoolSetpointLimitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMinCoolSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinCoolSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxCoolSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readMaxCoolSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void writeMaxCoolSetpointLimitAttribute(DefaultClusterCallback callback, Integer value) {
      writeMaxCoolSetpointLimitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMaxCoolSetpointLimitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMaxCoolSetpointLimitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMaxCoolSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxCoolSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinSetpointDeadBandAttribute(IntegerAttributeCallback callback) {
      readMinSetpointDeadBandAttribute(chipClusterPtr, callback);
    }

    public void writeMinSetpointDeadBandAttribute(DefaultClusterCallback callback, Integer value) {
      writeMinSetpointDeadBandAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMinSetpointDeadBandAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMinSetpointDeadBandAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMinSetpointDeadBandAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinSetpointDeadBandAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readControlSequenceOfOperationAttribute(IntegerAttributeCallback callback) {
      readControlSequenceOfOperationAttribute(chipClusterPtr, callback);
    }

    public void writeControlSequenceOfOperationAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeControlSequenceOfOperationAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeControlSequenceOfOperationAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeControlSequenceOfOperationAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeControlSequenceOfOperationAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeControlSequenceOfOperationAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSystemModeAttribute(IntegerAttributeCallback callback) {
      readSystemModeAttribute(chipClusterPtr, callback);
    }

    public void writeSystemModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeSystemModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeSystemModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeSystemModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeSystemModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSystemModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartOfWeekAttribute(IntegerAttributeCallback callback) {
      readStartOfWeekAttribute(chipClusterPtr, callback);
    }

    public void subscribeStartOfWeekAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartOfWeekAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfWeeklyTransitionsAttribute(IntegerAttributeCallback callback) {
      readNumberOfWeeklyTransitionsAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfWeeklyTransitionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfWeeklyTransitionsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfDailyTransitionsAttribute(IntegerAttributeCallback callback) {
      readNumberOfDailyTransitionsAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfDailyTransitionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfDailyTransitionsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readLocalTemperatureAttribute(
        long chipClusterPtr, LocalTemperatureAttributeCallback callback);

    private native void subscribeLocalTemperatureAttribute(
        long chipClusterPtr,
        LocalTemperatureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAbsMinHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAbsMinHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAbsMaxHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAbsMaxHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAbsMinCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAbsMinCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAbsMaxCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAbsMaxCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOccupiedCoolingSetpointAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOccupiedCoolingSetpointAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOccupiedCoolingSetpointAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOccupiedHeatingSetpointAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOccupiedHeatingSetpointAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOccupiedHeatingSetpointAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMinHeatSetpointLimitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMinHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMaxHeatSetpointLimitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMaxHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMinCoolSetpointLimitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMinCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMaxCoolSetpointLimitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMaxCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinSetpointDeadBandAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMinSetpointDeadBandAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMinSetpointDeadBandAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readControlSequenceOfOperationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeControlSequenceOfOperationAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeControlSequenceOfOperationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSystemModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeSystemModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeSystemModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStartOfWeekAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeStartOfWeekAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfWeeklyTransitionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfWeeklyTransitionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfDailyTransitionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfDailyTransitionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class FanControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 514L;

    public FanControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface PercentSettingAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SpeedSettingAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readFanModeAttribute(IntegerAttributeCallback callback) {
      readFanModeAttribute(chipClusterPtr, callback);
    }

    public void writeFanModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeFanModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeFanModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeFanModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeFanModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFanModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFanModeSequenceAttribute(IntegerAttributeCallback callback) {
      readFanModeSequenceAttribute(chipClusterPtr, callback);
    }

    public void writeFanModeSequenceAttribute(DefaultClusterCallback callback, Integer value) {
      writeFanModeSequenceAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeFanModeSequenceAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeFanModeSequenceAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeFanModeSequenceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFanModeSequenceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPercentSettingAttribute(PercentSettingAttributeCallback callback) {
      readPercentSettingAttribute(chipClusterPtr, callback);
    }

    public void writePercentSettingAttribute(DefaultClusterCallback callback, Integer value) {
      writePercentSettingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writePercentSettingAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writePercentSettingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribePercentSettingAttribute(
        PercentSettingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePercentSettingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPercentCurrentAttribute(IntegerAttributeCallback callback) {
      readPercentCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribePercentCurrentAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePercentCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSpeedMaxAttribute(IntegerAttributeCallback callback) {
      readSpeedMaxAttribute(chipClusterPtr, callback);
    }

    public void subscribeSpeedMaxAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSpeedMaxAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSpeedSettingAttribute(SpeedSettingAttributeCallback callback) {
      readSpeedSettingAttribute(chipClusterPtr, callback);
    }

    public void writeSpeedSettingAttribute(DefaultClusterCallback callback, Integer value) {
      writeSpeedSettingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeSpeedSettingAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeSpeedSettingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeSpeedSettingAttribute(
        SpeedSettingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSpeedSettingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSpeedCurrentAttribute(IntegerAttributeCallback callback) {
      readSpeedCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribeSpeedCurrentAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSpeedCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRockSupportAttribute(IntegerAttributeCallback callback) {
      readRockSupportAttribute(chipClusterPtr, callback);
    }

    public void subscribeRockSupportAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRockSupportAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRockSettingAttribute(IntegerAttributeCallback callback) {
      readRockSettingAttribute(chipClusterPtr, callback);
    }

    public void writeRockSettingAttribute(DefaultClusterCallback callback, Integer value) {
      writeRockSettingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRockSettingAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeRockSettingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeRockSettingAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRockSettingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWindSupportAttribute(IntegerAttributeCallback callback) {
      readWindSupportAttribute(chipClusterPtr, callback);
    }

    public void subscribeWindSupportAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWindSupportAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWindSettingAttribute(IntegerAttributeCallback callback) {
      readWindSettingAttribute(chipClusterPtr, callback);
    }

    public void writeWindSettingAttribute(DefaultClusterCallback callback, Integer value) {
      writeWindSettingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeWindSettingAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeWindSettingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeWindSettingAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWindSettingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readFanModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeFanModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeFanModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readFanModeSequenceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeFanModeSequenceAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeFanModeSequenceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPercentSettingAttribute(
        long chipClusterPtr, PercentSettingAttributeCallback callback);

    private native void writePercentSettingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribePercentSettingAttribute(
        long chipClusterPtr,
        PercentSettingAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPercentCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePercentCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSpeedMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSpeedMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSpeedSettingAttribute(
        long chipClusterPtr, SpeedSettingAttributeCallback callback);

    private native void writeSpeedSettingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeSpeedSettingAttribute(
        long chipClusterPtr,
        SpeedSettingAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSpeedCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSpeedCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRockSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRockSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRockSettingAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeRockSettingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeRockSettingAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWindSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeWindSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWindSettingAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeWindSettingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeWindSettingAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ThermostatUserInterfaceConfigurationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 516L;

    public ThermostatUserInterfaceConfigurationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readTemperatureDisplayModeAttribute(IntegerAttributeCallback callback) {
      readTemperatureDisplayModeAttribute(chipClusterPtr, callback);
    }

    public void writeTemperatureDisplayModeAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeTemperatureDisplayModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeTemperatureDisplayModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeTemperatureDisplayModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeTemperatureDisplayModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTemperatureDisplayModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readKeypadLockoutAttribute(IntegerAttributeCallback callback) {
      readKeypadLockoutAttribute(chipClusterPtr, callback);
    }

    public void writeKeypadLockoutAttribute(DefaultClusterCallback callback, Integer value) {
      writeKeypadLockoutAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeKeypadLockoutAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeKeypadLockoutAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeKeypadLockoutAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeKeypadLockoutAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readScheduleProgrammingVisibilityAttribute(IntegerAttributeCallback callback) {
      readScheduleProgrammingVisibilityAttribute(chipClusterPtr, callback);
    }

    public void writeScheduleProgrammingVisibilityAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeScheduleProgrammingVisibilityAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeScheduleProgrammingVisibilityAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeScheduleProgrammingVisibilityAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeScheduleProgrammingVisibilityAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeScheduleProgrammingVisibilityAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readTemperatureDisplayModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeTemperatureDisplayModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeTemperatureDisplayModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readKeypadLockoutAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeKeypadLockoutAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeKeypadLockoutAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readScheduleProgrammingVisibilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeScheduleProgrammingVisibilityAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeScheduleProgrammingVisibilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ColorControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 768L;

    public ColorControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void moveToHue(
        DefaultClusterCallback callback,
        Integer hue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToHue(
          chipClusterPtr,
          callback,
          hue,
          direction,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void moveToHue(
        DefaultClusterCallback callback,
        Integer hue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToHue(
          chipClusterPtr,
          callback,
          hue,
          direction,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveHue(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride) {
      moveHue(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
    }

    public void moveHue(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveHue(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stepHue(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      stepHue(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void stepHue(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stepHue(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveToSaturation(
        DefaultClusterCallback callback,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToSaturation(
          chipClusterPtr, callback, saturation, transitionTime, optionsMask, optionsOverride, null);
    }

    public void moveToSaturation(
        DefaultClusterCallback callback,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToSaturation(
          chipClusterPtr,
          callback,
          saturation,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveSaturation(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride) {
      moveSaturation(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
    }

    public void moveSaturation(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveSaturation(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stepSaturation(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      stepSaturation(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void stepSaturation(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stepSaturation(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveToHueAndSaturation(
        DefaultClusterCallback callback,
        Integer hue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToHueAndSaturation(
          chipClusterPtr,
          callback,
          hue,
          saturation,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void moveToHueAndSaturation(
        DefaultClusterCallback callback,
        Integer hue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToHueAndSaturation(
          chipClusterPtr,
          callback,
          hue,
          saturation,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveToColor(
        DefaultClusterCallback callback,
        Integer colorX,
        Integer colorY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToColor(
          chipClusterPtr,
          callback,
          colorX,
          colorY,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void moveToColor(
        DefaultClusterCallback callback,
        Integer colorX,
        Integer colorY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToColor(
          chipClusterPtr,
          callback,
          colorX,
          colorY,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveColor(
        DefaultClusterCallback callback,
        Integer rateX,
        Integer rateY,
        Integer optionsMask,
        Integer optionsOverride) {
      moveColor(chipClusterPtr, callback, rateX, rateY, optionsMask, optionsOverride, null);
    }

    public void moveColor(
        DefaultClusterCallback callback,
        Integer rateX,
        Integer rateY,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveColor(
          chipClusterPtr,
          callback,
          rateX,
          rateY,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stepColor(
        DefaultClusterCallback callback,
        Integer stepX,
        Integer stepY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      stepColor(
          chipClusterPtr,
          callback,
          stepX,
          stepY,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void stepColor(
        DefaultClusterCallback callback,
        Integer stepX,
        Integer stepY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stepColor(
          chipClusterPtr,
          callback,
          stepX,
          stepY,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveToColorTemperature(
        DefaultClusterCallback callback,
        Integer colorTemperature,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToColorTemperature(
          chipClusterPtr,
          callback,
          colorTemperature,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void moveToColorTemperature(
        DefaultClusterCallback callback,
        Integer colorTemperature,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToColorTemperature(
          chipClusterPtr,
          callback,
          colorTemperature,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void enhancedMoveToHue(
        DefaultClusterCallback callback,
        Integer enhancedHue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      enhancedMoveToHue(
          chipClusterPtr,
          callback,
          enhancedHue,
          direction,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void enhancedMoveToHue(
        DefaultClusterCallback callback,
        Integer enhancedHue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      enhancedMoveToHue(
          chipClusterPtr,
          callback,
          enhancedHue,
          direction,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void enhancedMoveHue(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride) {
      enhancedMoveHue(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
    }

    public void enhancedMoveHue(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      enhancedMoveHue(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void enhancedStepHue(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      enhancedStepHue(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void enhancedStepHue(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      enhancedStepHue(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void enhancedMoveToHueAndSaturation(
        DefaultClusterCallback callback,
        Integer enhancedHue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      enhancedMoveToHueAndSaturation(
          chipClusterPtr,
          callback,
          enhancedHue,
          saturation,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void enhancedMoveToHueAndSaturation(
        DefaultClusterCallback callback,
        Integer enhancedHue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      enhancedMoveToHueAndSaturation(
          chipClusterPtr,
          callback,
          enhancedHue,
          saturation,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void colorLoopSet(
        DefaultClusterCallback callback,
        Integer updateFlags,
        Integer action,
        Integer direction,
        Integer time,
        Integer startHue,
        Integer optionsMask,
        Integer optionsOverride) {
      colorLoopSet(
          chipClusterPtr,
          callback,
          updateFlags,
          action,
          direction,
          time,
          startHue,
          optionsMask,
          optionsOverride,
          null);
    }

    public void colorLoopSet(
        DefaultClusterCallback callback,
        Integer updateFlags,
        Integer action,
        Integer direction,
        Integer time,
        Integer startHue,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      colorLoopSet(
          chipClusterPtr,
          callback,
          updateFlags,
          action,
          direction,
          time,
          startHue,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stopMoveStep(
        DefaultClusterCallback callback, Integer optionsMask, Integer optionsOverride) {
      stopMoveStep(chipClusterPtr, callback, optionsMask, optionsOverride, null);
    }

    public void stopMoveStep(
        DefaultClusterCallback callback,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stopMoveStep(chipClusterPtr, callback, optionsMask, optionsOverride, timedInvokeTimeoutMs);
    }

    public void moveColorTemperature(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride) {
      moveColorTemperature(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          colorTemperatureMinimumMireds,
          colorTemperatureMaximumMireds,
          optionsMask,
          optionsOverride,
          null);
    }

    public void moveColorTemperature(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveColorTemperature(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          colorTemperatureMinimumMireds,
          colorTemperatureMaximumMireds,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stepColorTemperature(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride) {
      stepColorTemperature(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          colorTemperatureMinimumMireds,
          colorTemperatureMaximumMireds,
          optionsMask,
          optionsOverride,
          null);
    }

    public void stepColorTemperature(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stepColorTemperature(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          colorTemperatureMinimumMireds,
          colorTemperatureMaximumMireds,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    private native void moveToHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer hue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stepHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveToSaturation(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveSaturation(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stepSaturation(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveToHueAndSaturation(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer hue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveToColor(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer colorX,
        Integer colorY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveColor(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer rateX,
        Integer rateY,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stepColor(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepX,
        Integer stepY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveToColorTemperature(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer colorTemperature,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enhancedMoveToHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer enhancedHue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enhancedMoveHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enhancedStepHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enhancedMoveToHueAndSaturation(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer enhancedHue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void colorLoopSet(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer updateFlags,
        Integer action,
        Integer direction,
        Integer time,
        Integer startHue,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopMoveStep(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveColorTemperature(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        Integer rate,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stepColorTemperature(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface NumberOfPrimariesAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary1IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary2IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary3IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary4IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary5IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary6IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ColorPointRIntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ColorPointGIntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ColorPointBIntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readCurrentHueAttribute(IntegerAttributeCallback callback) {
      readCurrentHueAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentHueAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentHueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentSaturationAttribute(IntegerAttributeCallback callback) {
      readCurrentSaturationAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentSaturationAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentSaturationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRemainingTimeAttribute(IntegerAttributeCallback callback) {
      readRemainingTimeAttribute(chipClusterPtr, callback);
    }

    public void subscribeRemainingTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRemainingTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentXAttribute(IntegerAttributeCallback callback) {
      readCurrentXAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentXAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentXAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentYAttribute(IntegerAttributeCallback callback) {
      readCurrentYAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentYAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentYAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDriftCompensationAttribute(IntegerAttributeCallback callback) {
      readDriftCompensationAttribute(chipClusterPtr, callback);
    }

    public void subscribeDriftCompensationAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDriftCompensationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCompensationTextAttribute(CharStringAttributeCallback callback) {
      readCompensationTextAttribute(chipClusterPtr, callback);
    }

    public void subscribeCompensationTextAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCompensationTextAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorTemperatureAttribute(IntegerAttributeCallback callback) {
      readColorTemperatureAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorTemperatureAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorTemperatureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorModeAttribute(IntegerAttributeCallback callback) {
      readColorModeAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOptionsAttribute(IntegerAttributeCallback callback) {
      readOptionsAttribute(chipClusterPtr, callback);
    }

    public void writeOptionsAttribute(DefaultClusterCallback callback, Integer value) {
      writeOptionsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOptionsAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOptionsAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOptionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOptionsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfPrimariesAttribute(NumberOfPrimariesAttributeCallback callback) {
      readNumberOfPrimariesAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfPrimariesAttribute(
        NumberOfPrimariesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfPrimariesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary1XAttribute(IntegerAttributeCallback callback) {
      readPrimary1XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary1XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary1XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary1YAttribute(IntegerAttributeCallback callback) {
      readPrimary1YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary1YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary1YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary1IntensityAttribute(Primary1IntensityAttributeCallback callback) {
      readPrimary1IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary1IntensityAttribute(
        Primary1IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary1IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary2XAttribute(IntegerAttributeCallback callback) {
      readPrimary2XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary2XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary2XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary2YAttribute(IntegerAttributeCallback callback) {
      readPrimary2YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary2YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary2YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary2IntensityAttribute(Primary2IntensityAttributeCallback callback) {
      readPrimary2IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary2IntensityAttribute(
        Primary2IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary2IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary3XAttribute(IntegerAttributeCallback callback) {
      readPrimary3XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary3XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary3XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary3YAttribute(IntegerAttributeCallback callback) {
      readPrimary3YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary3YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary3YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary3IntensityAttribute(Primary3IntensityAttributeCallback callback) {
      readPrimary3IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary3IntensityAttribute(
        Primary3IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary3IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary4XAttribute(IntegerAttributeCallback callback) {
      readPrimary4XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary4XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary4XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary4YAttribute(IntegerAttributeCallback callback) {
      readPrimary4YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary4YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary4YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary4IntensityAttribute(Primary4IntensityAttributeCallback callback) {
      readPrimary4IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary4IntensityAttribute(
        Primary4IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary4IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary5XAttribute(IntegerAttributeCallback callback) {
      readPrimary5XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary5XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary5XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary5YAttribute(IntegerAttributeCallback callback) {
      readPrimary5YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary5YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary5YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary5IntensityAttribute(Primary5IntensityAttributeCallback callback) {
      readPrimary5IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary5IntensityAttribute(
        Primary5IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary5IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary6XAttribute(IntegerAttributeCallback callback) {
      readPrimary6XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary6XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary6XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary6YAttribute(IntegerAttributeCallback callback) {
      readPrimary6YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary6YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary6YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary6IntensityAttribute(Primary6IntensityAttributeCallback callback) {
      readPrimary6IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary6IntensityAttribute(
        Primary6IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary6IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWhitePointXAttribute(IntegerAttributeCallback callback) {
      readWhitePointXAttribute(chipClusterPtr, callback);
    }

    public void writeWhitePointXAttribute(DefaultClusterCallback callback, Integer value) {
      writeWhitePointXAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeWhitePointXAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeWhitePointXAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeWhitePointXAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWhitePointXAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWhitePointYAttribute(IntegerAttributeCallback callback) {
      readWhitePointYAttribute(chipClusterPtr, callback);
    }

    public void writeWhitePointYAttribute(DefaultClusterCallback callback, Integer value) {
      writeWhitePointYAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeWhitePointYAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeWhitePointYAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeWhitePointYAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWhitePointYAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointRXAttribute(IntegerAttributeCallback callback) {
      readColorPointRXAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointRXAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointRXAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointRXAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointRXAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointRXAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointRXAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointRYAttribute(IntegerAttributeCallback callback) {
      readColorPointRYAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointRYAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointRYAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointRYAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointRYAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointRYAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointRYAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointRIntensityAttribute(ColorPointRIntensityAttributeCallback callback) {
      readColorPointRIntensityAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointRIntensityAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointRIntensityAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointRIntensityAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointRIntensityAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointRIntensityAttribute(
        ColorPointRIntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointRIntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointGXAttribute(IntegerAttributeCallback callback) {
      readColorPointGXAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointGXAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointGXAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointGXAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointGXAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointGXAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointGXAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointGYAttribute(IntegerAttributeCallback callback) {
      readColorPointGYAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointGYAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointGYAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointGYAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointGYAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointGYAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointGYAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointGIntensityAttribute(ColorPointGIntensityAttributeCallback callback) {
      readColorPointGIntensityAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointGIntensityAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointGIntensityAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointGIntensityAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointGIntensityAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointGIntensityAttribute(
        ColorPointGIntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointGIntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointBXAttribute(IntegerAttributeCallback callback) {
      readColorPointBXAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointBXAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointBXAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointBXAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointBXAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointBXAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointBXAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointBYAttribute(IntegerAttributeCallback callback) {
      readColorPointBYAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointBYAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointBYAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointBYAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointBYAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointBYAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointBYAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointBIntensityAttribute(ColorPointBIntensityAttributeCallback callback) {
      readColorPointBIntensityAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointBIntensityAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointBIntensityAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointBIntensityAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointBIntensityAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointBIntensityAttribute(
        ColorPointBIntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointBIntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnhancedCurrentHueAttribute(IntegerAttributeCallback callback) {
      readEnhancedCurrentHueAttribute(chipClusterPtr, callback);
    }

    public void subscribeEnhancedCurrentHueAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnhancedCurrentHueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnhancedColorModeAttribute(IntegerAttributeCallback callback) {
      readEnhancedColorModeAttribute(chipClusterPtr, callback);
    }

    public void subscribeEnhancedColorModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnhancedColorModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorLoopActiveAttribute(IntegerAttributeCallback callback) {
      readColorLoopActiveAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorLoopActiveAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorLoopActiveAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorLoopDirectionAttribute(IntegerAttributeCallback callback) {
      readColorLoopDirectionAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorLoopDirectionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorLoopDirectionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorLoopTimeAttribute(IntegerAttributeCallback callback) {
      readColorLoopTimeAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorLoopTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorLoopTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorLoopStartEnhancedHueAttribute(IntegerAttributeCallback callback) {
      readColorLoopStartEnhancedHueAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorLoopStartEnhancedHueAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorLoopStartEnhancedHueAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorLoopStoredEnhancedHueAttribute(IntegerAttributeCallback callback) {
      readColorLoopStoredEnhancedHueAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorLoopStoredEnhancedHueAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorLoopStoredEnhancedHueAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorCapabilitiesAttribute(IntegerAttributeCallback callback) {
      readColorCapabilitiesAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorCapabilitiesAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorCapabilitiesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorTempPhysicalMinMiredsAttribute(IntegerAttributeCallback callback) {
      readColorTempPhysicalMinMiredsAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorTempPhysicalMinMiredsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorTempPhysicalMinMiredsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorTempPhysicalMaxMiredsAttribute(IntegerAttributeCallback callback) {
      readColorTempPhysicalMaxMiredsAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorTempPhysicalMaxMiredsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorTempPhysicalMaxMiredsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCoupleColorTempToLevelMinMiredsAttribute(IntegerAttributeCallback callback) {
      readCoupleColorTempToLevelMinMiredsAttribute(chipClusterPtr, callback);
    }

    public void subscribeCoupleColorTempToLevelMinMiredsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCoupleColorTempToLevelMinMiredsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartUpColorTemperatureMiredsAttribute(IntegerAttributeCallback callback) {
      readStartUpColorTemperatureMiredsAttribute(chipClusterPtr, callback);
    }

    public void writeStartUpColorTemperatureMiredsAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeStartUpColorTemperatureMiredsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeStartUpColorTemperatureMiredsAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeStartUpColorTemperatureMiredsAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeStartUpColorTemperatureMiredsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartUpColorTemperatureMiredsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readCurrentHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentSaturationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentSaturationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRemainingTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRemainingTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readDriftCompensationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeDriftCompensationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCompensationTextAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeCompensationTextAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readColorTemperatureAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorTemperatureAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOptionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOptionsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOptionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfPrimariesAttribute(
        long chipClusterPtr, NumberOfPrimariesAttributeCallback callback);

    private native void subscribeNumberOfPrimariesAttribute(
        long chipClusterPtr,
        NumberOfPrimariesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary1XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary1XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary1YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary1YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary1IntensityAttribute(
        long chipClusterPtr, Primary1IntensityAttributeCallback callback);

    private native void subscribePrimary1IntensityAttribute(
        long chipClusterPtr,
        Primary1IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary2XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary2XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary2YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary2YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary2IntensityAttribute(
        long chipClusterPtr, Primary2IntensityAttributeCallback callback);

    private native void subscribePrimary2IntensityAttribute(
        long chipClusterPtr,
        Primary2IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary3XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary3XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary3YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary3YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary3IntensityAttribute(
        long chipClusterPtr, Primary3IntensityAttributeCallback callback);

    private native void subscribePrimary3IntensityAttribute(
        long chipClusterPtr,
        Primary3IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary4XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary4XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary4YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary4YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary4IntensityAttribute(
        long chipClusterPtr, Primary4IntensityAttributeCallback callback);

    private native void subscribePrimary4IntensityAttribute(
        long chipClusterPtr,
        Primary4IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary5XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary5XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary5YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary5YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary5IntensityAttribute(
        long chipClusterPtr, Primary5IntensityAttributeCallback callback);

    private native void subscribePrimary5IntensityAttribute(
        long chipClusterPtr,
        Primary5IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary6XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary6XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary6YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary6YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary6IntensityAttribute(
        long chipClusterPtr, Primary6IntensityAttributeCallback callback);

    private native void subscribePrimary6IntensityAttribute(
        long chipClusterPtr,
        Primary6IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWhitePointXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeWhitePointXAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeWhitePointXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWhitePointYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeWhitePointYAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeWhitePointYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointRXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointRXAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointRXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointRYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointRYAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointRYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointRIntensityAttribute(
        long chipClusterPtr, ColorPointRIntensityAttributeCallback callback);

    private native void writeColorPointRIntensityAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointRIntensityAttribute(
        long chipClusterPtr,
        ColorPointRIntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readColorPointGXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointGXAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointGXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointGYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointGYAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointGYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointGIntensityAttribute(
        long chipClusterPtr, ColorPointGIntensityAttributeCallback callback);

    private native void writeColorPointGIntensityAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointGIntensityAttribute(
        long chipClusterPtr,
        ColorPointGIntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readColorPointBXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointBXAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointBXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointBYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointBYAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointBYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointBIntensityAttribute(
        long chipClusterPtr, ColorPointBIntensityAttributeCallback callback);

    private native void writeColorPointBIntensityAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointBIntensityAttribute(
        long chipClusterPtr,
        ColorPointBIntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readEnhancedCurrentHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeEnhancedCurrentHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEnhancedColorModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeEnhancedColorModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorLoopActiveAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorLoopActiveAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorLoopDirectionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorLoopDirectionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorLoopTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorLoopTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorLoopStartEnhancedHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorLoopStartEnhancedHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorLoopStoredEnhancedHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorLoopStoredEnhancedHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorCapabilitiesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorCapabilitiesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorTempPhysicalMinMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorTempPhysicalMinMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorTempPhysicalMaxMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorTempPhysicalMaxMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCoupleColorTempToLevelMinMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCoupleColorTempToLevelMinMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStartUpColorTemperatureMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeStartUpColorTemperatureMiredsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeStartUpColorTemperatureMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BallastConfigurationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 769L;

    public BallastConfigurationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface IntrinsicBalanceFactorAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BallastFactorAdjustmentAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LampRatedHoursAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LampBurnHoursAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LampBurnHoursTripPointAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readPhysicalMinLevelAttribute(IntegerAttributeCallback callback) {
      readPhysicalMinLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribePhysicalMinLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePhysicalMinLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPhysicalMaxLevelAttribute(IntegerAttributeCallback callback) {
      readPhysicalMaxLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribePhysicalMaxLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePhysicalMaxLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBallastStatusAttribute(IntegerAttributeCallback callback) {
      readBallastStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeBallastStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBallastStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinLevelAttribute(IntegerAttributeCallback callback) {
      readMinLevelAttribute(chipClusterPtr, callback);
    }

    public void writeMinLevelAttribute(DefaultClusterCallback callback, Integer value) {
      writeMinLevelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMinLevelAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMinLevelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMinLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxLevelAttribute(IntegerAttributeCallback callback) {
      readMaxLevelAttribute(chipClusterPtr, callback);
    }

    public void writeMaxLevelAttribute(DefaultClusterCallback callback, Integer value) {
      writeMaxLevelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMaxLevelAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMaxLevelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMaxLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readIntrinsicBalanceFactorAttribute(
        IntrinsicBalanceFactorAttributeCallback callback) {
      readIntrinsicBalanceFactorAttribute(chipClusterPtr, callback);
    }

    public void writeIntrinsicBalanceFactorAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeIntrinsicBalanceFactorAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeIntrinsicBalanceFactorAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeIntrinsicBalanceFactorAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeIntrinsicBalanceFactorAttribute(
        IntrinsicBalanceFactorAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeIntrinsicBalanceFactorAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBallastFactorAdjustmentAttribute(
        BallastFactorAdjustmentAttributeCallback callback) {
      readBallastFactorAdjustmentAttribute(chipClusterPtr, callback);
    }

    public void writeBallastFactorAdjustmentAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeBallastFactorAdjustmentAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeBallastFactorAdjustmentAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeBallastFactorAdjustmentAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBallastFactorAdjustmentAttribute(
        BallastFactorAdjustmentAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBallastFactorAdjustmentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampQuantityAttribute(IntegerAttributeCallback callback) {
      readLampQuantityAttribute(chipClusterPtr, callback);
    }

    public void subscribeLampQuantityAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampQuantityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampTypeAttribute(CharStringAttributeCallback callback) {
      readLampTypeAttribute(chipClusterPtr, callback);
    }

    public void writeLampTypeAttribute(DefaultClusterCallback callback, String value) {
      writeLampTypeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampTypeAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeLampTypeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampTypeAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampManufacturerAttribute(CharStringAttributeCallback callback) {
      readLampManufacturerAttribute(chipClusterPtr, callback);
    }

    public void writeLampManufacturerAttribute(DefaultClusterCallback callback, String value) {
      writeLampManufacturerAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampManufacturerAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeLampManufacturerAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampManufacturerAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampManufacturerAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampRatedHoursAttribute(LampRatedHoursAttributeCallback callback) {
      readLampRatedHoursAttribute(chipClusterPtr, callback);
    }

    public void writeLampRatedHoursAttribute(DefaultClusterCallback callback, Long value) {
      writeLampRatedHoursAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampRatedHoursAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeLampRatedHoursAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampRatedHoursAttribute(
        LampRatedHoursAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampRatedHoursAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampBurnHoursAttribute(LampBurnHoursAttributeCallback callback) {
      readLampBurnHoursAttribute(chipClusterPtr, callback);
    }

    public void writeLampBurnHoursAttribute(DefaultClusterCallback callback, Long value) {
      writeLampBurnHoursAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampBurnHoursAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeLampBurnHoursAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampBurnHoursAttribute(
        LampBurnHoursAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampBurnHoursAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampAlarmModeAttribute(IntegerAttributeCallback callback) {
      readLampAlarmModeAttribute(chipClusterPtr, callback);
    }

    public void writeLampAlarmModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeLampAlarmModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampAlarmModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeLampAlarmModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampAlarmModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampAlarmModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampBurnHoursTripPointAttribute(
        LampBurnHoursTripPointAttributeCallback callback) {
      readLampBurnHoursTripPointAttribute(chipClusterPtr, callback);
    }

    public void writeLampBurnHoursTripPointAttribute(DefaultClusterCallback callback, Long value) {
      writeLampBurnHoursTripPointAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampBurnHoursTripPointAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeLampBurnHoursTripPointAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampBurnHoursTripPointAttribute(
        LampBurnHoursTripPointAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampBurnHoursTripPointAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readPhysicalMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePhysicalMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPhysicalMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePhysicalMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBallastStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBallastStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMinLevelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMaxLevelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readIntrinsicBalanceFactorAttribute(
        long chipClusterPtr, IntrinsicBalanceFactorAttributeCallback callback);

    private native void writeIntrinsicBalanceFactorAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeIntrinsicBalanceFactorAttribute(
        long chipClusterPtr,
        IntrinsicBalanceFactorAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBallastFactorAdjustmentAttribute(
        long chipClusterPtr, BallastFactorAdjustmentAttributeCallback callback);

    private native void writeBallastFactorAdjustmentAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBallastFactorAdjustmentAttribute(
        long chipClusterPtr,
        BallastFactorAdjustmentAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLampQuantityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeLampQuantityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLampTypeAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeLampTypeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampTypeAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLampManufacturerAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeLampManufacturerAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampManufacturerAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLampRatedHoursAttribute(
        long chipClusterPtr, LampRatedHoursAttributeCallback callback);

    private native void writeLampRatedHoursAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampRatedHoursAttribute(
        long chipClusterPtr,
        LampRatedHoursAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLampBurnHoursAttribute(
        long chipClusterPtr, LampBurnHoursAttributeCallback callback);

    private native void writeLampBurnHoursAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampBurnHoursAttribute(
        long chipClusterPtr,
        LampBurnHoursAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLampAlarmModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeLampAlarmModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampAlarmModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLampBurnHoursTripPointAttribute(
        long chipClusterPtr, LampBurnHoursTripPointAttributeCallback callback);

    private native void writeLampBurnHoursTripPointAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampBurnHoursTripPointAttribute(
        long chipClusterPtr,
        LampBurnHoursTripPointAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class IlluminanceMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1024L;

    public IlluminanceMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LightSensorTypeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasuredValueAttribute(MeasuredValueAttributeCallback callback) {
      readMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasuredValueAttribute(
        MeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinMeasuredValueAttribute(MinMeasuredValueAttributeCallback callback) {
      readMinMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinMeasuredValueAttribute(
        MinMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxMeasuredValueAttribute(MaxMeasuredValueAttributeCallback callback) {
      readMaxMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxMeasuredValueAttribute(
        MaxMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readToleranceAttribute(IntegerAttributeCallback callback) {
      readToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLightSensorTypeAttribute(LightSensorTypeAttributeCallback callback) {
      readLightSensorTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeLightSensorTypeAttribute(
        LightSensorTypeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLightSensorTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasuredValueAttribute(
        long chipClusterPtr, MeasuredValueAttributeCallback callback);

    private native void subscribeMeasuredValueAttribute(
        long chipClusterPtr,
        MeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinMeasuredValueAttribute(
        long chipClusterPtr, MinMeasuredValueAttributeCallback callback);

    private native void subscribeMinMeasuredValueAttribute(
        long chipClusterPtr,
        MinMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxMeasuredValueAttribute(
        long chipClusterPtr, MaxMeasuredValueAttributeCallback callback);

    private native void subscribeMaxMeasuredValueAttribute(
        long chipClusterPtr,
        MaxMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLightSensorTypeAttribute(
        long chipClusterPtr, LightSensorTypeAttributeCallback callback);

    private native void subscribeLightSensorTypeAttribute(
        long chipClusterPtr,
        LightSensorTypeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class TemperatureMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1026L;

    public TemperatureMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasuredValueAttribute(MeasuredValueAttributeCallback callback) {
      readMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasuredValueAttribute(
        MeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinMeasuredValueAttribute(MinMeasuredValueAttributeCallback callback) {
      readMinMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinMeasuredValueAttribute(
        MinMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxMeasuredValueAttribute(MaxMeasuredValueAttributeCallback callback) {
      readMaxMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxMeasuredValueAttribute(
        MaxMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readToleranceAttribute(IntegerAttributeCallback callback) {
      readToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasuredValueAttribute(
        long chipClusterPtr, MeasuredValueAttributeCallback callback);

    private native void subscribeMeasuredValueAttribute(
        long chipClusterPtr,
        MeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinMeasuredValueAttribute(
        long chipClusterPtr, MinMeasuredValueAttributeCallback callback);

    private native void subscribeMinMeasuredValueAttribute(
        long chipClusterPtr,
        MinMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxMeasuredValueAttribute(
        long chipClusterPtr, MaxMeasuredValueAttributeCallback callback);

    private native void subscribeMaxMeasuredValueAttribute(
        long chipClusterPtr,
        MaxMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class PressureMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1027L;

    public PressureMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ScaledValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinScaledValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxScaledValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasuredValueAttribute(MeasuredValueAttributeCallback callback) {
      readMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasuredValueAttribute(
        MeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinMeasuredValueAttribute(MinMeasuredValueAttributeCallback callback) {
      readMinMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinMeasuredValueAttribute(
        MinMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxMeasuredValueAttribute(MaxMeasuredValueAttributeCallback callback) {
      readMaxMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxMeasuredValueAttribute(
        MaxMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readToleranceAttribute(IntegerAttributeCallback callback) {
      readToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readScaledValueAttribute(ScaledValueAttributeCallback callback) {
      readScaledValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeScaledValueAttribute(
        ScaledValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeScaledValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinScaledValueAttribute(MinScaledValueAttributeCallback callback) {
      readMinScaledValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinScaledValueAttribute(
        MinScaledValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinScaledValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxScaledValueAttribute(MaxScaledValueAttributeCallback callback) {
      readMaxScaledValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxScaledValueAttribute(
        MaxScaledValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxScaledValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readScaledToleranceAttribute(IntegerAttributeCallback callback) {
      readScaledToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeScaledToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeScaledToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readScaleAttribute(IntegerAttributeCallback callback) {
      readScaleAttribute(chipClusterPtr, callback);
    }

    public void subscribeScaleAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeScaleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasuredValueAttribute(
        long chipClusterPtr, MeasuredValueAttributeCallback callback);

    private native void subscribeMeasuredValueAttribute(
        long chipClusterPtr,
        MeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinMeasuredValueAttribute(
        long chipClusterPtr, MinMeasuredValueAttributeCallback callback);

    private native void subscribeMinMeasuredValueAttribute(
        long chipClusterPtr,
        MinMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxMeasuredValueAttribute(
        long chipClusterPtr, MaxMeasuredValueAttributeCallback callback);

    private native void subscribeMaxMeasuredValueAttribute(
        long chipClusterPtr,
        MaxMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readScaledValueAttribute(
        long chipClusterPtr, ScaledValueAttributeCallback callback);

    private native void subscribeScaledValueAttribute(
        long chipClusterPtr,
        ScaledValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinScaledValueAttribute(
        long chipClusterPtr, MinScaledValueAttributeCallback callback);

    private native void subscribeMinScaledValueAttribute(
        long chipClusterPtr,
        MinScaledValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxScaledValueAttribute(
        long chipClusterPtr, MaxScaledValueAttributeCallback callback);

    private native void subscribeMaxScaledValueAttribute(
        long chipClusterPtr,
        MaxScaledValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readScaledToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeScaledToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readScaleAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeScaleAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class FlowMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1028L;

    public FlowMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasuredValueAttribute(MeasuredValueAttributeCallback callback) {
      readMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasuredValueAttribute(
        MeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinMeasuredValueAttribute(MinMeasuredValueAttributeCallback callback) {
      readMinMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinMeasuredValueAttribute(
        MinMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxMeasuredValueAttribute(MaxMeasuredValueAttributeCallback callback) {
      readMaxMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxMeasuredValueAttribute(
        MaxMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readToleranceAttribute(IntegerAttributeCallback callback) {
      readToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasuredValueAttribute(
        long chipClusterPtr, MeasuredValueAttributeCallback callback);

    private native void subscribeMeasuredValueAttribute(
        long chipClusterPtr,
        MeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinMeasuredValueAttribute(
        long chipClusterPtr, MinMeasuredValueAttributeCallback callback);

    private native void subscribeMinMeasuredValueAttribute(
        long chipClusterPtr,
        MinMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxMeasuredValueAttribute(
        long chipClusterPtr, MaxMeasuredValueAttributeCallback callback);

    private native void subscribeMaxMeasuredValueAttribute(
        long chipClusterPtr,
        MaxMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class RelativeHumidityMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1029L;

    public RelativeHumidityMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasuredValueAttribute(MeasuredValueAttributeCallback callback) {
      readMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasuredValueAttribute(
        MeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinMeasuredValueAttribute(MinMeasuredValueAttributeCallback callback) {
      readMinMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinMeasuredValueAttribute(
        MinMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxMeasuredValueAttribute(MaxMeasuredValueAttributeCallback callback) {
      readMaxMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxMeasuredValueAttribute(
        MaxMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readToleranceAttribute(IntegerAttributeCallback callback) {
      readToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasuredValueAttribute(
        long chipClusterPtr, MeasuredValueAttributeCallback callback);

    private native void subscribeMeasuredValueAttribute(
        long chipClusterPtr,
        MeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinMeasuredValueAttribute(
        long chipClusterPtr, MinMeasuredValueAttributeCallback callback);

    private native void subscribeMinMeasuredValueAttribute(
        long chipClusterPtr,
        MinMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxMeasuredValueAttribute(
        long chipClusterPtr, MaxMeasuredValueAttributeCallback callback);

    private native void subscribeMaxMeasuredValueAttribute(
        long chipClusterPtr,
        MaxMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OccupancySensingCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1030L;

    public OccupancySensingCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readOccupancyAttribute(IntegerAttributeCallback callback) {
      readOccupancyAttribute(chipClusterPtr, callback);
    }

    public void subscribeOccupancyAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOccupancyAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOccupancySensorTypeAttribute(IntegerAttributeCallback callback) {
      readOccupancySensorTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeOccupancySensorTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOccupancySensorTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOccupancySensorTypeBitmapAttribute(IntegerAttributeCallback callback) {
      readOccupancySensorTypeBitmapAttribute(chipClusterPtr, callback);
    }

    public void subscribeOccupancySensorTypeBitmapAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOccupancySensorTypeBitmapAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readOccupancyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeOccupancyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOccupancySensorTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeOccupancySensorTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOccupancySensorTypeBitmapAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeOccupancySensorTypeBitmapAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class WakeOnLanCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1283L;

    public WakeOnLanCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMACAddressAttribute(CharStringAttributeCallback callback) {
      readMACAddressAttribute(chipClusterPtr, callback);
    }

    public void subscribeMACAddressAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMACAddressAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMACAddressAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeMACAddressAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ChannelCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1284L;

    public ChannelCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void changeChannel(ChangeChannelResponseCallback callback, String match) {
      changeChannel(chipClusterPtr, callback, match, null);
    }

    public void changeChannel(
        ChangeChannelResponseCallback callback, String match, int timedInvokeTimeoutMs) {
      changeChannel(chipClusterPtr, callback, match, timedInvokeTimeoutMs);
    }

    public void changeChannelByNumber(
        DefaultClusterCallback callback, Integer majorNumber, Integer minorNumber) {
      changeChannelByNumber(chipClusterPtr, callback, majorNumber, minorNumber, null);
    }

    public void changeChannelByNumber(
        DefaultClusterCallback callback,
        Integer majorNumber,
        Integer minorNumber,
        int timedInvokeTimeoutMs) {
      changeChannelByNumber(
          chipClusterPtr, callback, majorNumber, minorNumber, timedInvokeTimeoutMs);
    }

    public void skipChannel(DefaultClusterCallback callback, Integer count) {
      skipChannel(chipClusterPtr, callback, count, null);
    }

    public void skipChannel(
        DefaultClusterCallback callback, Integer count, int timedInvokeTimeoutMs) {
      skipChannel(chipClusterPtr, callback, count, timedInvokeTimeoutMs);
    }

    private native void changeChannel(
        long chipClusterPtr,
        ChangeChannelResponseCallback Callback,
        String match,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void changeChannelByNumber(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer majorNumber,
        Integer minorNumber,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void skipChannel(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer count,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ChangeChannelResponseCallback {
      void onSuccess(Integer status, Optional<String> data);

      void onError(Exception error);
    }

    public interface ChannelListAttributeCallback {
      void onSuccess(List<ChipStructs.ChannelClusterChannelInfo> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readChannelListAttribute(ChannelListAttributeCallback callback) {
      readChannelListAttribute(chipClusterPtr, callback);
    }

    public void subscribeChannelListAttribute(
        ChannelListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeChannelListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readChannelListAttribute(
        long chipClusterPtr, ChannelListAttributeCallback callback);

    private native void subscribeChannelListAttribute(
        long chipClusterPtr,
        ChannelListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class TargetNavigatorCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1285L;

    public TargetNavigatorCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void navigateTarget(
        NavigateTargetResponseCallback callback, Integer target, Optional<String> data) {
      navigateTarget(chipClusterPtr, callback, target, data, null);
    }

    public void navigateTarget(
        NavigateTargetResponseCallback callback,
        Integer target,
        Optional<String> data,
        int timedInvokeTimeoutMs) {
      navigateTarget(chipClusterPtr, callback, target, data, timedInvokeTimeoutMs);
    }

    private native void navigateTarget(
        long chipClusterPtr,
        NavigateTargetResponseCallback Callback,
        Integer target,
        Optional<String> data,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface NavigateTargetResponseCallback {
      void onSuccess(Integer status, Optional<String> data);

      void onError(Exception error);
    }

    public interface TargetListAttributeCallback {
      void onSuccess(List<ChipStructs.TargetNavigatorClusterTargetInfo> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readTargetListAttribute(TargetListAttributeCallback callback) {
      readTargetListAttribute(chipClusterPtr, callback);
    }

    public void subscribeTargetListAttribute(
        TargetListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTargetListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentTargetAttribute(IntegerAttributeCallback callback) {
      readCurrentTargetAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentTargetAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentTargetAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readTargetListAttribute(
        long chipClusterPtr, TargetListAttributeCallback callback);

    private native void subscribeTargetListAttribute(
        long chipClusterPtr,
        TargetListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentTargetAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentTargetAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class MediaPlaybackCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1286L;

    public MediaPlaybackCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void play(PlaybackResponseCallback callback) {
      play(chipClusterPtr, callback, null);
    }

    public void play(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      play(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void pause(PlaybackResponseCallback callback) {
      pause(chipClusterPtr, callback, null);
    }

    public void pause(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      pause(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void stopPlayback(PlaybackResponseCallback callback) {
      stopPlayback(chipClusterPtr, callback, null);
    }

    public void stopPlayback(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      stopPlayback(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void startOver(PlaybackResponseCallback callback) {
      startOver(chipClusterPtr, callback, null);
    }

    public void startOver(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      startOver(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void previous(PlaybackResponseCallback callback) {
      previous(chipClusterPtr, callback, null);
    }

    public void previous(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      previous(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void next(PlaybackResponseCallback callback) {
      next(chipClusterPtr, callback, null);
    }

    public void next(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      next(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void rewind(PlaybackResponseCallback callback) {
      rewind(chipClusterPtr, callback, null);
    }

    public void rewind(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      rewind(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void fastForward(PlaybackResponseCallback callback) {
      fastForward(chipClusterPtr, callback, null);
    }

    public void fastForward(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      fastForward(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void skipForward(PlaybackResponseCallback callback, Long deltaPositionMilliseconds) {
      skipForward(chipClusterPtr, callback, deltaPositionMilliseconds, null);
    }

    public void skipForward(
        PlaybackResponseCallback callback,
        Long deltaPositionMilliseconds,
        int timedInvokeTimeoutMs) {
      skipForward(chipClusterPtr, callback, deltaPositionMilliseconds, timedInvokeTimeoutMs);
    }

    public void skipBackward(PlaybackResponseCallback callback, Long deltaPositionMilliseconds) {
      skipBackward(chipClusterPtr, callback, deltaPositionMilliseconds, null);
    }

    public void skipBackward(
        PlaybackResponseCallback callback,
        Long deltaPositionMilliseconds,
        int timedInvokeTimeoutMs) {
      skipBackward(chipClusterPtr, callback, deltaPositionMilliseconds, timedInvokeTimeoutMs);
    }

    public void seek(PlaybackResponseCallback callback, Long position) {
      seek(chipClusterPtr, callback, position, null);
    }

    public void seek(PlaybackResponseCallback callback, Long position, int timedInvokeTimeoutMs) {
      seek(chipClusterPtr, callback, position, timedInvokeTimeoutMs);
    }

    private native void play(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void pause(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopPlayback(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void startOver(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void previous(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void next(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void rewind(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void fastForward(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void skipForward(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        Long deltaPositionMilliseconds,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void skipBackward(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        Long deltaPositionMilliseconds,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void seek(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        Long position,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface PlaybackResponseCallback {
      void onSuccess(Integer status, Optional<String> data);

      void onError(Exception error);
    }

    public interface StartTimeAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface DurationAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SeekRangeEndAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SeekRangeStartAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readCurrentStateAttribute(IntegerAttributeCallback callback) {
      readCurrentStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentStateAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartTimeAttribute(StartTimeAttributeCallback callback) {
      readStartTimeAttribute(chipClusterPtr, callback);
    }

    public void subscribeStartTimeAttribute(
        StartTimeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDurationAttribute(DurationAttributeCallback callback) {
      readDurationAttribute(chipClusterPtr, callback);
    }

    public void subscribeDurationAttribute(
        DurationAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDurationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPlaybackSpeedAttribute(FloatAttributeCallback callback) {
      readPlaybackSpeedAttribute(chipClusterPtr, callback);
    }

    public void subscribePlaybackSpeedAttribute(
        FloatAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePlaybackSpeedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSeekRangeEndAttribute(SeekRangeEndAttributeCallback callback) {
      readSeekRangeEndAttribute(chipClusterPtr, callback);
    }

    public void subscribeSeekRangeEndAttribute(
        SeekRangeEndAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSeekRangeEndAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSeekRangeStartAttribute(SeekRangeStartAttributeCallback callback) {
      readSeekRangeStartAttribute(chipClusterPtr, callback);
    }

    public void subscribeSeekRangeStartAttribute(
        SeekRangeStartAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSeekRangeStartAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readCurrentStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStartTimeAttribute(
        long chipClusterPtr, StartTimeAttributeCallback callback);

    private native void subscribeStartTimeAttribute(
        long chipClusterPtr, StartTimeAttributeCallback callback, int minInterval, int maxInterval);

    private native void readDurationAttribute(
        long chipClusterPtr, DurationAttributeCallback callback);

    private native void subscribeDurationAttribute(
        long chipClusterPtr, DurationAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPlaybackSpeedAttribute(
        long chipClusterPtr, FloatAttributeCallback callback);

    private native void subscribePlaybackSpeedAttribute(
        long chipClusterPtr, FloatAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSeekRangeEndAttribute(
        long chipClusterPtr, SeekRangeEndAttributeCallback callback);

    private native void subscribeSeekRangeEndAttribute(
        long chipClusterPtr,
        SeekRangeEndAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSeekRangeStartAttribute(
        long chipClusterPtr, SeekRangeStartAttributeCallback callback);

    private native void subscribeSeekRangeStartAttribute(
        long chipClusterPtr,
        SeekRangeStartAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class MediaInputCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1287L;

    public MediaInputCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void selectInput(DefaultClusterCallback callback, Integer index) {
      selectInput(chipClusterPtr, callback, index, null);
    }

    public void selectInput(
        DefaultClusterCallback callback, Integer index, int timedInvokeTimeoutMs) {
      selectInput(chipClusterPtr, callback, index, timedInvokeTimeoutMs);
    }

    public void showInputStatus(DefaultClusterCallback callback) {
      showInputStatus(chipClusterPtr, callback, null);
    }

    public void showInputStatus(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      showInputStatus(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void hideInputStatus(DefaultClusterCallback callback) {
      hideInputStatus(chipClusterPtr, callback, null);
    }

    public void hideInputStatus(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      hideInputStatus(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void renameInput(DefaultClusterCallback callback, Integer index, String name) {
      renameInput(chipClusterPtr, callback, index, name, null);
    }

    public void renameInput(
        DefaultClusterCallback callback, Integer index, String name, int timedInvokeTimeoutMs) {
      renameInput(chipClusterPtr, callback, index, name, timedInvokeTimeoutMs);
    }

    private native void selectInput(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer index,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void showInputStatus(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void hideInputStatus(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void renameInput(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer index,
        String name,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface InputListAttributeCallback {
      void onSuccess(List<ChipStructs.MediaInputClusterInputInfo> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readInputListAttribute(InputListAttributeCallback callback) {
      readInputListAttribute(chipClusterPtr, callback);
    }

    public void subscribeInputListAttribute(
        InputListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInputListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentInputAttribute(IntegerAttributeCallback callback) {
      readCurrentInputAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentInputAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentInputAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readInputListAttribute(
        long chipClusterPtr, InputListAttributeCallback callback);

    private native void subscribeInputListAttribute(
        long chipClusterPtr, InputListAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentInputAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentInputAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class LowPowerCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1288L;

    public LowPowerCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void sleep(DefaultClusterCallback callback) {
      sleep(chipClusterPtr, callback, null);
    }

    public void sleep(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      sleep(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void sleep(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class KeypadInputCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1289L;

    public KeypadInputCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void sendKey(SendKeyResponseCallback callback, Integer keyCode) {
      sendKey(chipClusterPtr, callback, keyCode, null);
    }

    public void sendKey(
        SendKeyResponseCallback callback, Integer keyCode, int timedInvokeTimeoutMs) {
      sendKey(chipClusterPtr, callback, keyCode, timedInvokeTimeoutMs);
    }

    private native void sendKey(
        long chipClusterPtr,
        SendKeyResponseCallback Callback,
        Integer keyCode,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface SendKeyResponseCallback {
      void onSuccess(Integer status);

      void onError(Exception error);
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ContentLauncherCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1290L;

    public ContentLauncherCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void launchContent(
        LaunchResponseCallback callback,
        ChipStructs.ContentLauncherClusterContentSearch search,
        Boolean autoPlay,
        Optional<String> data) {
      launchContent(chipClusterPtr, callback, search, autoPlay, data, null);
    }

    public void launchContent(
        LaunchResponseCallback callback,
        ChipStructs.ContentLauncherClusterContentSearch search,
        Boolean autoPlay,
        Optional<String> data,
        int timedInvokeTimeoutMs) {
      launchContent(chipClusterPtr, callback, search, autoPlay, data, timedInvokeTimeoutMs);
    }

    public void launchURL(
        LaunchResponseCallback callback,
        String contentURL,
        Optional<String> displayString,
        Optional<ChipStructs.ContentLauncherClusterBrandingInformation> brandingInformation) {
      launchURL(chipClusterPtr, callback, contentURL, displayString, brandingInformation, null);
    }

    public void launchURL(
        LaunchResponseCallback callback,
        String contentURL,
        Optional<String> displayString,
        Optional<ChipStructs.ContentLauncherClusterBrandingInformation> brandingInformation,
        int timedInvokeTimeoutMs) {
      launchURL(
          chipClusterPtr,
          callback,
          contentURL,
          displayString,
          brandingInformation,
          timedInvokeTimeoutMs);
    }

    private native void launchContent(
        long chipClusterPtr,
        LaunchResponseCallback Callback,
        ChipStructs.ContentLauncherClusterContentSearch search,
        Boolean autoPlay,
        Optional<String> data,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void launchURL(
        long chipClusterPtr,
        LaunchResponseCallback Callback,
        String contentURL,
        Optional<String> displayString,
        Optional<ChipStructs.ContentLauncherClusterBrandingInformation> brandingInformation,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface LaunchResponseCallback {
      void onSuccess(Integer status, Optional<String> data);

      void onError(Exception error);
    }

    public interface AcceptHeaderAttributeCallback {
      void onSuccess(List<String> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readAcceptHeaderAttribute(AcceptHeaderAttributeCallback callback) {
      readAcceptHeaderAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptHeaderAttribute(
        AcceptHeaderAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptHeaderAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedStreamingProtocolsAttribute(LongAttributeCallback callback) {
      readSupportedStreamingProtocolsAttribute(chipClusterPtr, callback);
    }

    public void writeSupportedStreamingProtocolsAttribute(
        DefaultClusterCallback callback, Long value) {
      writeSupportedStreamingProtocolsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeSupportedStreamingProtocolsAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeSupportedStreamingProtocolsAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeSupportedStreamingProtocolsAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedStreamingProtocolsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readAcceptHeaderAttribute(
        long chipClusterPtr, AcceptHeaderAttributeCallback callback);

    private native void subscribeAcceptHeaderAttribute(
        long chipClusterPtr,
        AcceptHeaderAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSupportedStreamingProtocolsAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void writeSupportedStreamingProtocolsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeSupportedStreamingProtocolsAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class AudioOutputCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1291L;

    public AudioOutputCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void selectOutput(DefaultClusterCallback callback, Integer index) {
      selectOutput(chipClusterPtr, callback, index, null);
    }

    public void selectOutput(
        DefaultClusterCallback callback, Integer index, int timedInvokeTimeoutMs) {
      selectOutput(chipClusterPtr, callback, index, timedInvokeTimeoutMs);
    }

    public void renameOutput(DefaultClusterCallback callback, Integer index, String name) {
      renameOutput(chipClusterPtr, callback, index, name, null);
    }

    public void renameOutput(
        DefaultClusterCallback callback, Integer index, String name, int timedInvokeTimeoutMs) {
      renameOutput(chipClusterPtr, callback, index, name, timedInvokeTimeoutMs);
    }

    private native void selectOutput(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer index,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void renameOutput(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer index,
        String name,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface OutputListAttributeCallback {
      void onSuccess(List<ChipStructs.AudioOutputClusterOutputInfo> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readOutputListAttribute(OutputListAttributeCallback callback) {
      readOutputListAttribute(chipClusterPtr, callback);
    }

    public void subscribeOutputListAttribute(
        OutputListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOutputListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentOutputAttribute(IntegerAttributeCallback callback) {
      readCurrentOutputAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentOutputAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentOutputAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readOutputListAttribute(
        long chipClusterPtr, OutputListAttributeCallback callback);

    private native void subscribeOutputListAttribute(
        long chipClusterPtr,
        OutputListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentOutputAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentOutputAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ApplicationLauncherCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1292L;

    public ApplicationLauncherCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void launchApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        Optional<byte[]> data) {
      launchApp(chipClusterPtr, callback, application, data, null);
    }

    public void launchApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        Optional<byte[]> data,
        int timedInvokeTimeoutMs) {
      launchApp(chipClusterPtr, callback, application, data, timedInvokeTimeoutMs);
    }

    public void stopApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application) {
      stopApp(chipClusterPtr, callback, application, null);
    }

    public void stopApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        int timedInvokeTimeoutMs) {
      stopApp(chipClusterPtr, callback, application, timedInvokeTimeoutMs);
    }

    public void hideApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application) {
      hideApp(chipClusterPtr, callback, application, null);
    }

    public void hideApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        int timedInvokeTimeoutMs) {
      hideApp(chipClusterPtr, callback, application, timedInvokeTimeoutMs);
    }

    private native void launchApp(
        long chipClusterPtr,
        LauncherResponseCallback Callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        Optional<byte[]> data,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopApp(
        long chipClusterPtr,
        LauncherResponseCallback Callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void hideApp(
        long chipClusterPtr,
        LauncherResponseCallback Callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface LauncherResponseCallback {
      void onSuccess(Integer status, byte[] data);

      void onError(Exception error);
    }

    public interface CatalogListAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readCatalogListAttribute(CatalogListAttributeCallback callback) {
      readCatalogListAttribute(chipClusterPtr, callback);
    }

    public void subscribeCatalogListAttribute(
        CatalogListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCatalogListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readCatalogListAttribute(
        long chipClusterPtr, CatalogListAttributeCallback callback);

    private native void subscribeCatalogListAttribute(
        long chipClusterPtr,
        CatalogListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ApplicationBasicCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1293L;

    public ApplicationBasicCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface VendorIDAttributeCallback {
      void onSuccess(Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AllowedVendorListAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readVendorNameAttribute(CharStringAttributeCallback callback) {
      readVendorNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readVendorIDAttribute(VendorIDAttributeCallback callback) {
      readVendorIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorIDAttribute(
        VendorIDAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readApplicationNameAttribute(CharStringAttributeCallback callback) {
      readApplicationNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeApplicationNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeApplicationNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductIDAttribute(IntegerAttributeCallback callback) {
      readProductIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductIDAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStatusAttribute(IntegerAttributeCallback callback) {
      readStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readApplicationVersionAttribute(CharStringAttributeCallback callback) {
      readApplicationVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeApplicationVersionAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeApplicationVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAllowedVendorListAttribute(AllowedVendorListAttributeCallback callback) {
      readAllowedVendorListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAllowedVendorListAttribute(
        AllowedVendorListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAllowedVendorListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readVendorNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeVendorNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback);

    private native void subscribeVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback, int minInterval, int maxInterval);

    private native void readApplicationNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeApplicationNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductIDAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeProductIDAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStatusAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readApplicationVersionAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeApplicationVersionAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAllowedVendorListAttribute(
        long chipClusterPtr, AllowedVendorListAttributeCallback callback);

    private native void subscribeAllowedVendorListAttribute(
        long chipClusterPtr,
        AllowedVendorListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class AccountLoginCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1294L;

    public AccountLoginCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void getSetupPIN(
        GetSetupPINResponseCallback callback,
        String tempAccountIdentifier,
        int timedInvokeTimeoutMs) {
      getSetupPIN(chipClusterPtr, callback, tempAccountIdentifier, timedInvokeTimeoutMs);
    }

    public void login(
        DefaultClusterCallback callback,
        String tempAccountIdentifier,
        String setupPIN,
        int timedInvokeTimeoutMs) {
      login(chipClusterPtr, callback, tempAccountIdentifier, setupPIN, timedInvokeTimeoutMs);
    }

    public void logout(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      logout(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void getSetupPIN(
        long chipClusterPtr,
        GetSetupPINResponseCallback Callback,
        String tempAccountIdentifier,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void login(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        String tempAccountIdentifier,
        String setupPIN,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void logout(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GetSetupPINResponseCallback {
      void onSuccess(String setupPIN);

      void onError(Exception error);
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ElectricalMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 2820L;

    public ElectricalMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasurementTypeAttribute(LongAttributeCallback callback) {
      readMeasurementTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasurementTypeAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasurementTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTotalActivePowerAttribute(LongAttributeCallback callback) {
      readTotalActivePowerAttribute(chipClusterPtr, callback);
    }

    public void subscribeTotalActivePowerAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTotalActivePowerAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsVoltageAttribute(IntegerAttributeCallback callback) {
      readRmsVoltageAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsVoltageAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsVoltageAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsVoltageMinAttribute(IntegerAttributeCallback callback) {
      readRmsVoltageMinAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsVoltageMinAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsVoltageMinAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsVoltageMaxAttribute(IntegerAttributeCallback callback) {
      readRmsVoltageMaxAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsVoltageMaxAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsVoltageMaxAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsCurrentAttribute(IntegerAttributeCallback callback) {
      readRmsCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsCurrentAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsCurrentMinAttribute(IntegerAttributeCallback callback) {
      readRmsCurrentMinAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsCurrentMinAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsCurrentMinAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsCurrentMaxAttribute(IntegerAttributeCallback callback) {
      readRmsCurrentMaxAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsCurrentMaxAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsCurrentMaxAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActivePowerAttribute(IntegerAttributeCallback callback) {
      readActivePowerAttribute(chipClusterPtr, callback);
    }

    public void subscribeActivePowerAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActivePowerAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActivePowerMinAttribute(IntegerAttributeCallback callback) {
      readActivePowerMinAttribute(chipClusterPtr, callback);
    }

    public void subscribeActivePowerMinAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActivePowerMinAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActivePowerMaxAttribute(IntegerAttributeCallback callback) {
      readActivePowerMaxAttribute(chipClusterPtr, callback);
    }

    public void subscribeActivePowerMaxAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActivePowerMaxAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasurementTypeAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeMeasurementTypeAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTotalActivePowerAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTotalActivePowerAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsVoltageAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsVoltageAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsVoltageMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsVoltageMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsVoltageMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsVoltageMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsCurrentMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsCurrentMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsCurrentMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsCurrentMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActivePowerAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeActivePowerAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActivePowerMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeActivePowerMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActivePowerMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeActivePowerMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class TestClusterCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 4294048773L;

    public TestClusterCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void test(DefaultClusterCallback callback) {
      test(chipClusterPtr, callback, null);
    }

    public void test(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      test(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void testNotHandled(DefaultClusterCallback callback) {
      testNotHandled(chipClusterPtr, callback, null);
    }

    public void testNotHandled(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      testNotHandled(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void testSpecific(TestSpecificResponseCallback callback) {
      testSpecific(chipClusterPtr, callback, null);
    }

    public void testSpecific(TestSpecificResponseCallback callback, int timedInvokeTimeoutMs) {

      testSpecific(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void testUnknownCommand(DefaultClusterCallback callback) {
      testUnknownCommand(chipClusterPtr, callback, null);
    }

    public void testUnknownCommand(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      testUnknownCommand(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void testAddArguments(
        TestAddArgumentsResponseCallback callback, Integer arg1, Integer arg2) {
      testAddArguments(chipClusterPtr, callback, arg1, arg2, null);
    }

    public void testAddArguments(
        TestAddArgumentsResponseCallback callback,
        Integer arg1,
        Integer arg2,
        int timedInvokeTimeoutMs) {
      testAddArguments(chipClusterPtr, callback, arg1, arg2, timedInvokeTimeoutMs);
    }

    public void testStructArgumentRequest(
        BooleanResponseCallback callback, ChipStructs.TestClusterClusterSimpleStruct arg1) {
      testStructArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testStructArgumentRequest(
        BooleanResponseCallback callback,
        ChipStructs.TestClusterClusterSimpleStruct arg1,
        int timedInvokeTimeoutMs) {
      testStructArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testNestedStructArgumentRequest(
        BooleanResponseCallback callback, ChipStructs.TestClusterClusterNestedStruct arg1) {
      testNestedStructArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testNestedStructArgumentRequest(
        BooleanResponseCallback callback,
        ChipStructs.TestClusterClusterNestedStruct arg1,
        int timedInvokeTimeoutMs) {
      testNestedStructArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testListStructArgumentRequest(
        BooleanResponseCallback callback,
        ArrayList<ChipStructs.TestClusterClusterSimpleStruct> arg1) {
      testListStructArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testListStructArgumentRequest(
        BooleanResponseCallback callback,
        ArrayList<ChipStructs.TestClusterClusterSimpleStruct> arg1,
        int timedInvokeTimeoutMs) {
      testListStructArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testListInt8UArgumentRequest(
        BooleanResponseCallback callback, ArrayList<Integer> arg1) {
      testListInt8UArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testListInt8UArgumentRequest(
        BooleanResponseCallback callback, ArrayList<Integer> arg1, int timedInvokeTimeoutMs) {
      testListInt8UArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testNestedStructListArgumentRequest(
        BooleanResponseCallback callback, ChipStructs.TestClusterClusterNestedStructList arg1) {
      testNestedStructListArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testNestedStructListArgumentRequest(
        BooleanResponseCallback callback,
        ChipStructs.TestClusterClusterNestedStructList arg1,
        int timedInvokeTimeoutMs) {
      testNestedStructListArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testListNestedStructListArgumentRequest(
        BooleanResponseCallback callback,
        ArrayList<ChipStructs.TestClusterClusterNestedStructList> arg1) {
      testListNestedStructListArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testListNestedStructListArgumentRequest(
        BooleanResponseCallback callback,
        ArrayList<ChipStructs.TestClusterClusterNestedStructList> arg1,
        int timedInvokeTimeoutMs) {
      testListNestedStructListArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testListInt8UReverseRequest(
        TestListInt8UReverseResponseCallback callback, ArrayList<Integer> arg1) {
      testListInt8UReverseRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testListInt8UReverseRequest(
        TestListInt8UReverseResponseCallback callback,
        ArrayList<Integer> arg1,
        int timedInvokeTimeoutMs) {
      testListInt8UReverseRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testEnumsRequest(TestEnumsResponseCallback callback, Integer arg1, Integer arg2) {
      testEnumsRequest(chipClusterPtr, callback, arg1, arg2, null);
    }

    public void testEnumsRequest(
        TestEnumsResponseCallback callback, Integer arg1, Integer arg2, int timedInvokeTimeoutMs) {
      testEnumsRequest(chipClusterPtr, callback, arg1, arg2, timedInvokeTimeoutMs);
    }

    public void testNullableOptionalRequest(
        TestNullableOptionalResponseCallback callback, @Nullable Optional<Integer> arg1) {
      testNullableOptionalRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testNullableOptionalRequest(
        TestNullableOptionalResponseCallback callback,
        @Nullable Optional<Integer> arg1,
        int timedInvokeTimeoutMs) {
      testNullableOptionalRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void simpleStructEchoRequest(
        SimpleStructResponseCallback callback, ChipStructs.TestClusterClusterSimpleStruct arg1) {
      simpleStructEchoRequest(chipClusterPtr, callback, arg1, null);
    }

    public void simpleStructEchoRequest(
        SimpleStructResponseCallback callback,
        ChipStructs.TestClusterClusterSimpleStruct arg1,
        int timedInvokeTimeoutMs) {
      simpleStructEchoRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void timedInvokeRequest(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      timedInvokeRequest(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void testSimpleOptionalArgumentRequest(
        DefaultClusterCallback callback, Optional<Boolean> arg1) {
      testSimpleOptionalArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testSimpleOptionalArgumentRequest(
        DefaultClusterCallback callback, Optional<Boolean> arg1, int timedInvokeTimeoutMs) {
      testSimpleOptionalArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testEmitTestEventRequest(
        TestEmitTestEventResponseCallback callback, Integer arg1, Integer arg2, Boolean arg3) {
      testEmitTestEventRequest(chipClusterPtr, callback, arg1, arg2, arg3, null);
    }

    public void testEmitTestEventRequest(
        TestEmitTestEventResponseCallback callback,
        Integer arg1,
        Integer arg2,
        Boolean arg3,
        int timedInvokeTimeoutMs) {
      testEmitTestEventRequest(chipClusterPtr, callback, arg1, arg2, arg3, timedInvokeTimeoutMs);
    }

    private native void test(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testNotHandled(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testSpecific(
        long chipClusterPtr,
        TestSpecificResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testUnknownCommand(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testAddArguments(
        long chipClusterPtr,
        TestAddArgumentsResponseCallback Callback,
        Integer arg1,
        Integer arg2,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testStructArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ChipStructs.TestClusterClusterSimpleStruct arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testNestedStructArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ChipStructs.TestClusterClusterNestedStruct arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testListStructArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ArrayList<ChipStructs.TestClusterClusterSimpleStruct> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testListInt8UArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ArrayList<Integer> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testNestedStructListArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ChipStructs.TestClusterClusterNestedStructList arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testListNestedStructListArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ArrayList<ChipStructs.TestClusterClusterNestedStructList> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testListInt8UReverseRequest(
        long chipClusterPtr,
        TestListInt8UReverseResponseCallback Callback,
        ArrayList<Integer> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testEnumsRequest(
        long chipClusterPtr,
        TestEnumsResponseCallback Callback,
        Integer arg1,
        Integer arg2,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testNullableOptionalRequest(
        long chipClusterPtr,
        TestNullableOptionalResponseCallback Callback,
        @Nullable Optional<Integer> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void simpleStructEchoRequest(
        long chipClusterPtr,
        SimpleStructResponseCallback Callback,
        ChipStructs.TestClusterClusterSimpleStruct arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void timedInvokeRequest(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testSimpleOptionalArgumentRequest(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Optional<Boolean> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testEmitTestEventRequest(
        long chipClusterPtr,
        TestEmitTestEventResponseCallback Callback,
        Integer arg1,
        Integer arg2,
        Boolean arg3,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface TestSpecificResponseCallback {
      void onSuccess(Integer returnValue);

      void onError(Exception error);
    }

    public interface TestAddArgumentsResponseCallback {
      void onSuccess(Integer returnValue);

      void onError(Exception error);
    }

    public interface TestListInt8UReverseResponseCallback {
      void onSuccess(ArrayList<Integer> arg1);

      void onError(Exception error);
    }

    public interface TestEnumsResponseCallback {
      void onSuccess(Integer arg1, Integer arg2);

      void onError(Exception error);
    }

    public interface TestNullableOptionalResponseCallback {
      void onSuccess(
          Boolean wasPresent,
          Optional<Boolean> wasNull,
          Optional<Integer> value,
          @Nullable Optional<Integer> originalValue);

      void onError(Exception error);
    }

    public interface BooleanResponseCallback {
      void onSuccess(Boolean value);

      void onError(Exception error);
    }

    public interface SimpleStructResponseCallback {
      void onSuccess(ChipStructs.TestClusterClusterSimpleStruct arg1);

      void onError(Exception error);
    }

    public interface TestEmitTestEventResponseCallback {
      void onSuccess(Long value);

      void onError(Exception error);
    }

    public interface ListInt8uAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ListOctetStringAttributeCallback {
      void onSuccess(List<byte[]> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ListStructOctetStringAttributeCallback {
      void onSuccess(List<ChipStructs.TestClusterClusterTestListStructOctet> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface VendorIdAttributeCallback {
      void onSuccess(Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ListNullablesAndOptionalsStructAttributeCallback {
      void onSuccess(List<ChipStructs.TestClusterClusterNullablesAndOptionalsStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ListLongOctetStringAttributeCallback {
      void onSuccess(List<byte[]> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ListFabricScopedAttributeCallback {
      void onSuccess(List<ChipStructs.TestClusterClusterTestFabricScoped> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableBooleanAttributeCallback {
      void onSuccess(@Nullable Boolean value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableBitmap8AttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableBitmap16AttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableBitmap32AttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableBitmap64AttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt8uAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt16uAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt24uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt32uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt40uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt48uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt56uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt64uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt8sAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt16sAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt24sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt32sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt40sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt48sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt56sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt64sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableEnum8AttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableEnum16AttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableFloatSingleAttributeCallback {
      void onSuccess(@Nullable Float value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableFloatDoubleAttributeCallback {
      void onSuccess(@Nullable Double value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableOctetStringAttributeCallback {
      void onSuccess(@Nullable byte[] value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableCharStringAttributeCallback {
      void onSuccess(@Nullable String value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableEnumAttrAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableRangeRestrictedInt8uAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableRangeRestrictedInt8sAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableRangeRestrictedInt16uAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableRangeRestrictedInt16sAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readBooleanAttribute(BooleanAttributeCallback callback) {
      readBooleanAttribute(chipClusterPtr, callback);
    }

    public void writeBooleanAttribute(DefaultClusterCallback callback, Boolean value) {
      writeBooleanAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeBooleanAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeBooleanAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBooleanAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBooleanAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBitmap8Attribute(IntegerAttributeCallback callback) {
      readBitmap8Attribute(chipClusterPtr, callback);
    }

    public void writeBitmap8Attribute(DefaultClusterCallback callback, Integer value) {
      writeBitmap8Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeBitmap8Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeBitmap8Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBitmap8Attribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBitmap8Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBitmap16Attribute(IntegerAttributeCallback callback) {
      readBitmap16Attribute(chipClusterPtr, callback);
    }

    public void writeBitmap16Attribute(DefaultClusterCallback callback, Integer value) {
      writeBitmap16Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeBitmap16Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeBitmap16Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBitmap16Attribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBitmap16Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBitmap32Attribute(LongAttributeCallback callback) {
      readBitmap32Attribute(chipClusterPtr, callback);
    }

    public void writeBitmap32Attribute(DefaultClusterCallback callback, Long value) {
      writeBitmap32Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeBitmap32Attribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeBitmap32Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBitmap32Attribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBitmap32Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBitmap64Attribute(LongAttributeCallback callback) {
      readBitmap64Attribute(chipClusterPtr, callback);
    }

    public void writeBitmap64Attribute(DefaultClusterCallback callback, Long value) {
      writeBitmap64Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeBitmap64Attribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeBitmap64Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBitmap64Attribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBitmap64Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt8uAttribute(IntegerAttributeCallback callback) {
      readInt8uAttribute(chipClusterPtr, callback);
    }

    public void writeInt8uAttribute(DefaultClusterCallback callback, Integer value) {
      writeInt8uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt8uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeInt8uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt8uAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt8uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt16uAttribute(IntegerAttributeCallback callback) {
      readInt16uAttribute(chipClusterPtr, callback);
    }

    public void writeInt16uAttribute(DefaultClusterCallback callback, Integer value) {
      writeInt16uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt16uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeInt16uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt16uAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt16uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt24uAttribute(LongAttributeCallback callback) {
      readInt24uAttribute(chipClusterPtr, callback);
    }

    public void writeInt24uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt24uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt24uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt24uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt24uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt24uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt32uAttribute(LongAttributeCallback callback) {
      readInt32uAttribute(chipClusterPtr, callback);
    }

    public void writeInt32uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt32uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt32uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt32uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt32uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt32uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt40uAttribute(LongAttributeCallback callback) {
      readInt40uAttribute(chipClusterPtr, callback);
    }

    public void writeInt40uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt40uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt40uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt40uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt40uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt40uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt48uAttribute(LongAttributeCallback callback) {
      readInt48uAttribute(chipClusterPtr, callback);
    }

    public void writeInt48uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt48uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt48uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt48uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt48uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt48uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt56uAttribute(LongAttributeCallback callback) {
      readInt56uAttribute(chipClusterPtr, callback);
    }

    public void writeInt56uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt56uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt56uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt56uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt56uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt56uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt64uAttribute(LongAttributeCallback callback) {
      readInt64uAttribute(chipClusterPtr, callback);
    }

    public void writeInt64uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt64uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt64uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt64uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt64uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt64uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt8sAttribute(IntegerAttributeCallback callback) {
      readInt8sAttribute(chipClusterPtr, callback);
    }

    public void writeInt8sAttribute(DefaultClusterCallback callback, Integer value) {
      writeInt8sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt8sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeInt8sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt8sAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt8sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt16sAttribute(IntegerAttributeCallback callback) {
      readInt16sAttribute(chipClusterPtr, callback);
    }

    public void writeInt16sAttribute(DefaultClusterCallback callback, Integer value) {
      writeInt16sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt16sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeInt16sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt16sAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt16sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt24sAttribute(LongAttributeCallback callback) {
      readInt24sAttribute(chipClusterPtr, callback);
    }

    public void writeInt24sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt24sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt24sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt24sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt24sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt24sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt32sAttribute(LongAttributeCallback callback) {
      readInt32sAttribute(chipClusterPtr, callback);
    }

    public void writeInt32sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt32sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt32sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt32sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt32sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt32sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt40sAttribute(LongAttributeCallback callback) {
      readInt40sAttribute(chipClusterPtr, callback);
    }

    public void writeInt40sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt40sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt40sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt40sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt40sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt40sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt48sAttribute(LongAttributeCallback callback) {
      readInt48sAttribute(chipClusterPtr, callback);
    }

    public void writeInt48sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt48sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt48sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt48sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt48sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt48sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt56sAttribute(LongAttributeCallback callback) {
      readInt56sAttribute(chipClusterPtr, callback);
    }

    public void writeInt56sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt56sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt56sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt56sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt56sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt56sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt64sAttribute(LongAttributeCallback callback) {
      readInt64sAttribute(chipClusterPtr, callback);
    }

    public void writeInt64sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt64sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt64sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt64sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt64sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt64sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnum8Attribute(IntegerAttributeCallback callback) {
      readEnum8Attribute(chipClusterPtr, callback);
    }

    public void writeEnum8Attribute(DefaultClusterCallback callback, Integer value) {
      writeEnum8Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeEnum8Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeEnum8Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEnum8Attribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnum8Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnum16Attribute(IntegerAttributeCallback callback) {
      readEnum16Attribute(chipClusterPtr, callback);
    }

    public void writeEnum16Attribute(DefaultClusterCallback callback, Integer value) {
      writeEnum16Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeEnum16Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeEnum16Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEnum16Attribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnum16Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFloatSingleAttribute(FloatAttributeCallback callback) {
      readFloatSingleAttribute(chipClusterPtr, callback);
    }

    public void writeFloatSingleAttribute(DefaultClusterCallback callback, Float value) {
      writeFloatSingleAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeFloatSingleAttribute(
        DefaultClusterCallback callback, Float value, int timedWriteTimeoutMs) {
      writeFloatSingleAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeFloatSingleAttribute(
        FloatAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFloatSingleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFloatDoubleAttribute(DoubleAttributeCallback callback) {
      readFloatDoubleAttribute(chipClusterPtr, callback);
    }

    public void writeFloatDoubleAttribute(DefaultClusterCallback callback, Double value) {
      writeFloatDoubleAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeFloatDoubleAttribute(
        DefaultClusterCallback callback, Double value, int timedWriteTimeoutMs) {
      writeFloatDoubleAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeFloatDoubleAttribute(
        DoubleAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFloatDoubleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOctetStringAttribute(OctetStringAttributeCallback callback) {
      readOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeOctetStringAttribute(DefaultClusterCallback callback, byte[] value) {
      writeOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOctetStringAttribute(
        DefaultClusterCallback callback, byte[] value, int timedWriteTimeoutMs) {
      writeOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOctetStringAttribute(
        OctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListInt8uAttribute(ListInt8uAttributeCallback callback) {
      readListInt8uAttribute(chipClusterPtr, callback);
    }

    public void writeListInt8uAttribute(DefaultClusterCallback callback, ArrayList<Integer> value) {
      writeListInt8uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListInt8uAttribute(
        DefaultClusterCallback callback, ArrayList<Integer> value, int timedWriteTimeoutMs) {
      writeListInt8uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListInt8uAttribute(
        ListInt8uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeListInt8uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListOctetStringAttribute(ListOctetStringAttributeCallback callback) {
      readListOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeListOctetStringAttribute(
        DefaultClusterCallback callback, ArrayList<byte[]> value) {
      writeListOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListOctetStringAttribute(
        DefaultClusterCallback callback, ArrayList<byte[]> value, int timedWriteTimeoutMs) {
      writeListOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListOctetStringAttribute(
        ListOctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeListOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListStructOctetStringAttribute(
        ListStructOctetStringAttributeCallback callback) {
      readListStructOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeListStructOctetStringAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.TestClusterClusterTestListStructOctet> value) {
      writeListStructOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListStructOctetStringAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.TestClusterClusterTestListStructOctet> value,
        int timedWriteTimeoutMs) {
      writeListStructOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListStructOctetStringAttribute(
        ListStructOctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeListStructOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLongOctetStringAttribute(OctetStringAttributeCallback callback) {
      readLongOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeLongOctetStringAttribute(DefaultClusterCallback callback, byte[] value) {
      writeLongOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLongOctetStringAttribute(
        DefaultClusterCallback callback, byte[] value, int timedWriteTimeoutMs) {
      writeLongOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLongOctetStringAttribute(
        OctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLongOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCharStringAttribute(CharStringAttributeCallback callback) {
      readCharStringAttribute(chipClusterPtr, callback);
    }

    public void writeCharStringAttribute(DefaultClusterCallback callback, String value) {
      writeCharStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeCharStringAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeCharStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeCharStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCharStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLongCharStringAttribute(CharStringAttributeCallback callback) {
      readLongCharStringAttribute(chipClusterPtr, callback);
    }

    public void writeLongCharStringAttribute(DefaultClusterCallback callback, String value) {
      writeLongCharStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLongCharStringAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeLongCharStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLongCharStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLongCharStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEpochUsAttribute(LongAttributeCallback callback) {
      readEpochUsAttribute(chipClusterPtr, callback);
    }

    public void writeEpochUsAttribute(DefaultClusterCallback callback, Long value) {
      writeEpochUsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeEpochUsAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeEpochUsAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEpochUsAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEpochUsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEpochSAttribute(LongAttributeCallback callback) {
      readEpochSAttribute(chipClusterPtr, callback);
    }

    public void writeEpochSAttribute(DefaultClusterCallback callback, Long value) {
      writeEpochSAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeEpochSAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeEpochSAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEpochSAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEpochSAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readVendorIdAttribute(VendorIdAttributeCallback callback) {
      readVendorIdAttribute(chipClusterPtr, callback);
    }

    public void writeVendorIdAttribute(DefaultClusterCallback callback, Integer value) {
      writeVendorIdAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeVendorIdAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeVendorIdAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeVendorIdAttribute(
        VendorIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListNullablesAndOptionalsStructAttribute(
        ListNullablesAndOptionalsStructAttributeCallback callback) {
      readListNullablesAndOptionalsStructAttribute(chipClusterPtr, callback);
    }

    public void writeListNullablesAndOptionalsStructAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.TestClusterClusterNullablesAndOptionalsStruct> value) {
      writeListNullablesAndOptionalsStructAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListNullablesAndOptionalsStructAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.TestClusterClusterNullablesAndOptionalsStruct> value,
        int timedWriteTimeoutMs) {
      writeListNullablesAndOptionalsStructAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListNullablesAndOptionalsStructAttribute(
        ListNullablesAndOptionalsStructAttributeCallback callback,
        int minInterval,
        int maxInterval) {
      subscribeListNullablesAndOptionalsStructAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnumAttrAttribute(IntegerAttributeCallback callback) {
      readEnumAttrAttribute(chipClusterPtr, callback);
    }

    public void writeEnumAttrAttribute(DefaultClusterCallback callback, Integer value) {
      writeEnumAttrAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeEnumAttrAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeEnumAttrAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEnumAttrAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnumAttrAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRangeRestrictedInt8uAttribute(IntegerAttributeCallback callback) {
      readRangeRestrictedInt8uAttribute(chipClusterPtr, callback);
    }

    public void writeRangeRestrictedInt8uAttribute(DefaultClusterCallback callback, Integer value) {
      writeRangeRestrictedInt8uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRangeRestrictedInt8uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeRangeRestrictedInt8uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeRangeRestrictedInt8uAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRangeRestrictedInt8uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRangeRestrictedInt8sAttribute(IntegerAttributeCallback callback) {
      readRangeRestrictedInt8sAttribute(chipClusterPtr, callback);
    }

    public void writeRangeRestrictedInt8sAttribute(DefaultClusterCallback callback, Integer value) {
      writeRangeRestrictedInt8sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRangeRestrictedInt8sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeRangeRestrictedInt8sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeRangeRestrictedInt8sAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRangeRestrictedInt8sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRangeRestrictedInt16uAttribute(IntegerAttributeCallback callback) {
      readRangeRestrictedInt16uAttribute(chipClusterPtr, callback);
    }

    public void writeRangeRestrictedInt16uAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeRangeRestrictedInt16uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRangeRestrictedInt16uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeRangeRestrictedInt16uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeRangeRestrictedInt16uAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRangeRestrictedInt16uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRangeRestrictedInt16sAttribute(IntegerAttributeCallback callback) {
      readRangeRestrictedInt16sAttribute(chipClusterPtr, callback);
    }

    public void writeRangeRestrictedInt16sAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeRangeRestrictedInt16sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRangeRestrictedInt16sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeRangeRestrictedInt16sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeRangeRestrictedInt16sAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRangeRestrictedInt16sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListLongOctetStringAttribute(ListLongOctetStringAttributeCallback callback) {
      readListLongOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeListLongOctetStringAttribute(
        DefaultClusterCallback callback, ArrayList<byte[]> value) {
      writeListLongOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListLongOctetStringAttribute(
        DefaultClusterCallback callback, ArrayList<byte[]> value, int timedWriteTimeoutMs) {
      writeListLongOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListLongOctetStringAttribute(
        ListLongOctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeListLongOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListFabricScopedAttribute(ListFabricScopedAttributeCallback callback) {
      readListFabricScopedAttribute(chipClusterPtr, callback);
    }

    public void writeListFabricScopedAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.TestClusterClusterTestFabricScoped> value) {
      writeListFabricScopedAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListFabricScopedAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.TestClusterClusterTestFabricScoped> value,
        int timedWriteTimeoutMs) {
      writeListFabricScopedAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListFabricScopedAttribute(
        ListFabricScopedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeListFabricScopedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTimedWriteBooleanAttribute(BooleanAttributeCallback callback) {
      readTimedWriteBooleanAttribute(chipClusterPtr, callback);
    }

    public void writeTimedWriteBooleanAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeTimedWriteBooleanAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeTimedWriteBooleanAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTimedWriteBooleanAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneralErrorBooleanAttribute(BooleanAttributeCallback callback) {
      readGeneralErrorBooleanAttribute(chipClusterPtr, callback);
    }

    public void writeGeneralErrorBooleanAttribute(DefaultClusterCallback callback, Boolean value) {
      writeGeneralErrorBooleanAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeGeneralErrorBooleanAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeGeneralErrorBooleanAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeGeneralErrorBooleanAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneralErrorBooleanAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterErrorBooleanAttribute(BooleanAttributeCallback callback) {
      readClusterErrorBooleanAttribute(chipClusterPtr, callback);
    }

    public void writeClusterErrorBooleanAttribute(DefaultClusterCallback callback, Boolean value) {
      writeClusterErrorBooleanAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeClusterErrorBooleanAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeClusterErrorBooleanAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeClusterErrorBooleanAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterErrorBooleanAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUnsupportedAttribute(BooleanAttributeCallback callback) {
      readUnsupportedAttribute(chipClusterPtr, callback);
    }

    public void writeUnsupportedAttribute(DefaultClusterCallback callback, Boolean value) {
      writeUnsupportedAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeUnsupportedAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeUnsupportedAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeUnsupportedAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUnsupportedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableBooleanAttribute(NullableBooleanAttributeCallback callback) {
      readNullableBooleanAttribute(chipClusterPtr, callback);
    }

    public void writeNullableBooleanAttribute(DefaultClusterCallback callback, Boolean value) {
      writeNullableBooleanAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableBooleanAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeNullableBooleanAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableBooleanAttribute(
        NullableBooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableBooleanAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableBitmap8Attribute(NullableBitmap8AttributeCallback callback) {
      readNullableBitmap8Attribute(chipClusterPtr, callback);
    }

    public void writeNullableBitmap8Attribute(DefaultClusterCallback callback, Integer value) {
      writeNullableBitmap8Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableBitmap8Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableBitmap8Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableBitmap8Attribute(
        NullableBitmap8AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableBitmap8Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableBitmap16Attribute(NullableBitmap16AttributeCallback callback) {
      readNullableBitmap16Attribute(chipClusterPtr, callback);
    }

    public void writeNullableBitmap16Attribute(DefaultClusterCallback callback, Integer value) {
      writeNullableBitmap16Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableBitmap16Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableBitmap16Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableBitmap16Attribute(
        NullableBitmap16AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableBitmap16Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableBitmap32Attribute(NullableBitmap32AttributeCallback callback) {
      readNullableBitmap32Attribute(chipClusterPtr, callback);
    }

    public void writeNullableBitmap32Attribute(DefaultClusterCallback callback, Long value) {
      writeNullableBitmap32Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableBitmap32Attribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableBitmap32Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableBitmap32Attribute(
        NullableBitmap32AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableBitmap32Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableBitmap64Attribute(NullableBitmap64AttributeCallback callback) {
      readNullableBitmap64Attribute(chipClusterPtr, callback);
    }

    public void writeNullableBitmap64Attribute(DefaultClusterCallback callback, Long value) {
      writeNullableBitmap64Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableBitmap64Attribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableBitmap64Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableBitmap64Attribute(
        NullableBitmap64AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableBitmap64Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt8uAttribute(NullableInt8uAttributeCallback callback) {
      readNullableInt8uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt8uAttribute(DefaultClusterCallback callback, Integer value) {
      writeNullableInt8uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt8uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableInt8uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt8uAttribute(
        NullableInt8uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt8uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt16uAttribute(NullableInt16uAttributeCallback callback) {
      readNullableInt16uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt16uAttribute(DefaultClusterCallback callback, Integer value) {
      writeNullableInt16uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt16uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableInt16uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt16uAttribute(
        NullableInt16uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt16uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt24uAttribute(NullableInt24uAttributeCallback callback) {
      readNullableInt24uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt24uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt24uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt24uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt24uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt24uAttribute(
        NullableInt24uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt24uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt32uAttribute(NullableInt32uAttributeCallback callback) {
      readNullableInt32uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt32uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt32uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt32uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt32uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt32uAttribute(
        NullableInt32uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt32uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt40uAttribute(NullableInt40uAttributeCallback callback) {
      readNullableInt40uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt40uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt40uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt40uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt40uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt40uAttribute(
        NullableInt40uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt40uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt48uAttribute(NullableInt48uAttributeCallback callback) {
      readNullableInt48uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt48uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt48uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt48uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt48uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt48uAttribute(
        NullableInt48uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt48uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt56uAttribute(NullableInt56uAttributeCallback callback) {
      readNullableInt56uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt56uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt56uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt56uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt56uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt56uAttribute(
        NullableInt56uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt56uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt64uAttribute(NullableInt64uAttributeCallback callback) {
      readNullableInt64uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt64uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt64uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt64uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt64uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt64uAttribute(
        NullableInt64uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt64uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt8sAttribute(NullableInt8sAttributeCallback callback) {
      readNullableInt8sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt8sAttribute(DefaultClusterCallback callback, Integer value) {
      writeNullableInt8sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt8sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableInt8sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt8sAttribute(
        NullableInt8sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt8sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt16sAttribute(NullableInt16sAttributeCallback callback) {
      readNullableInt16sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt16sAttribute(DefaultClusterCallback callback, Integer value) {
      writeNullableInt16sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt16sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableInt16sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt16sAttribute(
        NullableInt16sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt16sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt24sAttribute(NullableInt24sAttributeCallback callback) {
      readNullableInt24sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt24sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt24sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt24sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt24sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt24sAttribute(
        NullableInt24sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt24sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt32sAttribute(NullableInt32sAttributeCallback callback) {
      readNullableInt32sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt32sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt32sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt32sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt32sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt32sAttribute(
        NullableInt32sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt32sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt40sAttribute(NullableInt40sAttributeCallback callback) {
      readNullableInt40sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt40sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt40sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt40sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt40sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt40sAttribute(
        NullableInt40sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt40sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt48sAttribute(NullableInt48sAttributeCallback callback) {
      readNullableInt48sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt48sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt48sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt48sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt48sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt48sAttribute(
        NullableInt48sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt48sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt56sAttribute(NullableInt56sAttributeCallback callback) {
      readNullableInt56sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt56sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt56sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt56sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt56sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt56sAttribute(
        NullableInt56sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt56sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt64sAttribute(NullableInt64sAttributeCallback callback) {
      readNullableInt64sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt64sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt64sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt64sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt64sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt64sAttribute(
        NullableInt64sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt64sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableEnum8Attribute(NullableEnum8AttributeCallback callback) {
      readNullableEnum8Attribute(chipClusterPtr, callback);
    }

    public void writeNullableEnum8Attribute(DefaultClusterCallback callback, Integer value) {
      writeNullableEnum8Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableEnum8Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableEnum8Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableEnum8Attribute(
        NullableEnum8AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableEnum8Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableEnum16Attribute(NullableEnum16AttributeCallback callback) {
      readNullableEnum16Attribute(chipClusterPtr, callback);
    }

    public void writeNullableEnum16Attribute(DefaultClusterCallback callback, Integer value) {
      writeNullableEnum16Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableEnum16Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableEnum16Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableEnum16Attribute(
        NullableEnum16AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableEnum16Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableFloatSingleAttribute(NullableFloatSingleAttributeCallback callback) {
      readNullableFloatSingleAttribute(chipClusterPtr, callback);
    }

    public void writeNullableFloatSingleAttribute(DefaultClusterCallback callback, Float value) {
      writeNullableFloatSingleAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableFloatSingleAttribute(
        DefaultClusterCallback callback, Float value, int timedWriteTimeoutMs) {
      writeNullableFloatSingleAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableFloatSingleAttribute(
        NullableFloatSingleAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableFloatSingleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableFloatDoubleAttribute(NullableFloatDoubleAttributeCallback callback) {
      readNullableFloatDoubleAttribute(chipClusterPtr, callback);
    }

    public void writeNullableFloatDoubleAttribute(DefaultClusterCallback callback, Double value) {
      writeNullableFloatDoubleAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableFloatDoubleAttribute(
        DefaultClusterCallback callback, Double value, int timedWriteTimeoutMs) {
      writeNullableFloatDoubleAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableFloatDoubleAttribute(
        NullableFloatDoubleAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableFloatDoubleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableOctetStringAttribute(NullableOctetStringAttributeCallback callback) {
      readNullableOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeNullableOctetStringAttribute(DefaultClusterCallback callback, byte[] value) {
      writeNullableOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableOctetStringAttribute(
        DefaultClusterCallback callback, byte[] value, int timedWriteTimeoutMs) {
      writeNullableOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableOctetStringAttribute(
        NullableOctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableCharStringAttribute(NullableCharStringAttributeCallback callback) {
      readNullableCharStringAttribute(chipClusterPtr, callback);
    }

    public void writeNullableCharStringAttribute(DefaultClusterCallback callback, String value) {
      writeNullableCharStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableCharStringAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeNullableCharStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableCharStringAttribute(
        NullableCharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableCharStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableEnumAttrAttribute(NullableEnumAttrAttributeCallback callback) {
      readNullableEnumAttrAttribute(chipClusterPtr, callback);
    }

    public void writeNullableEnumAttrAttribute(DefaultClusterCallback callback, Integer value) {
      writeNullableEnumAttrAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableEnumAttrAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableEnumAttrAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableEnumAttrAttribute(
        NullableEnumAttrAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableEnumAttrAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableRangeRestrictedInt8uAttribute(
        NullableRangeRestrictedInt8uAttributeCallback callback) {
      readNullableRangeRestrictedInt8uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableRangeRestrictedInt8uAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeNullableRangeRestrictedInt8uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableRangeRestrictedInt8uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableRangeRestrictedInt8uAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableRangeRestrictedInt8uAttribute(
        NullableRangeRestrictedInt8uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableRangeRestrictedInt8uAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableRangeRestrictedInt8sAttribute(
        NullableRangeRestrictedInt8sAttributeCallback callback) {
      readNullableRangeRestrictedInt8sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableRangeRestrictedInt8sAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeNullableRangeRestrictedInt8sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableRangeRestrictedInt8sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableRangeRestrictedInt8sAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableRangeRestrictedInt8sAttribute(
        NullableRangeRestrictedInt8sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableRangeRestrictedInt8sAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableRangeRestrictedInt16uAttribute(
        NullableRangeRestrictedInt16uAttributeCallback callback) {
      readNullableRangeRestrictedInt16uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableRangeRestrictedInt16uAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeNullableRangeRestrictedInt16uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableRangeRestrictedInt16uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableRangeRestrictedInt16uAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableRangeRestrictedInt16uAttribute(
        NullableRangeRestrictedInt16uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableRangeRestrictedInt16uAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableRangeRestrictedInt16sAttribute(
        NullableRangeRestrictedInt16sAttributeCallback callback) {
      readNullableRangeRestrictedInt16sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableRangeRestrictedInt16sAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeNullableRangeRestrictedInt16sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableRangeRestrictedInt16sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableRangeRestrictedInt16sAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableRangeRestrictedInt16sAttribute(
        NullableRangeRestrictedInt16sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableRangeRestrictedInt16sAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeBooleanAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBitmap8Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeBitmap8Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBitmap8Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBitmap16Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeBitmap16Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBitmap16Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBitmap32Attribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeBitmap32Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBitmap32Attribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBitmap64Attribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeBitmap64Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBitmap64Attribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt8uAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeInt8uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt8uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt16uAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeInt16uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt16uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt24uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt24uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt24uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt32uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt32uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt32uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt40uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt40uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt40uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt48uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt48uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt48uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt56uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt56uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt56uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt64uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt64uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt64uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt8sAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeInt8sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt8sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt16sAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeInt16sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt16sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt24sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt24sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt24sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt32sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt32sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt32sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt40sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt40sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt40sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt48sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt48sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt48sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt56sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt56sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt56sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt64sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt64sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt64sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEnum8Attribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeEnum8Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEnum8Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEnum16Attribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeEnum16Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEnum16Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readFloatSingleAttribute(
        long chipClusterPtr, FloatAttributeCallback callback);

    private native void writeFloatSingleAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Float value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeFloatSingleAttribute(
        long chipClusterPtr, FloatAttributeCallback callback, int minInterval, int maxInterval);

    private native void readFloatDoubleAttribute(
        long chipClusterPtr, DoubleAttributeCallback callback);

    private native void writeFloatDoubleAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Double value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeFloatDoubleAttribute(
        long chipClusterPtr, DoubleAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOctetStringAttribute(
        long chipClusterPtr, OctetStringAttributeCallback callback);

    private native void writeOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        byte[] value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOctetStringAttribute(
        long chipClusterPtr,
        OctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readListInt8uAttribute(
        long chipClusterPtr, ListInt8uAttributeCallback callback);

    private native void writeListInt8uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<Integer> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListInt8uAttribute(
        long chipClusterPtr, ListInt8uAttributeCallback callback, int minInterval, int maxInterval);

    private native void readListOctetStringAttribute(
        long chipClusterPtr, ListOctetStringAttributeCallback callback);

    private native void writeListOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<byte[]> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListOctetStringAttribute(
        long chipClusterPtr,
        ListOctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readListStructOctetStringAttribute(
        long chipClusterPtr, ListStructOctetStringAttributeCallback callback);

    private native void writeListStructOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.TestClusterClusterTestListStructOctet> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListStructOctetStringAttribute(
        long chipClusterPtr,
        ListStructOctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLongOctetStringAttribute(
        long chipClusterPtr, OctetStringAttributeCallback callback);

    private native void writeLongOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        byte[] value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLongOctetStringAttribute(
        long chipClusterPtr,
        OctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCharStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeCharStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeCharStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLongCharStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeLongCharStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLongCharStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readEpochUsAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeEpochUsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEpochUsAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEpochSAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeEpochSAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEpochSAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readVendorIdAttribute(
        long chipClusterPtr, VendorIdAttributeCallback callback);

    private native void writeVendorIdAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeVendorIdAttribute(
        long chipClusterPtr, VendorIdAttributeCallback callback, int minInterval, int maxInterval);

    private native void readListNullablesAndOptionalsStructAttribute(
        long chipClusterPtr, ListNullablesAndOptionalsStructAttributeCallback callback);

    private native void writeListNullablesAndOptionalsStructAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.TestClusterClusterNullablesAndOptionalsStruct> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListNullablesAndOptionalsStructAttribute(
        long chipClusterPtr,
        ListNullablesAndOptionalsStructAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readEnumAttrAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeEnumAttrAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEnumAttrAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRangeRestrictedInt8uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeRangeRestrictedInt8uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeRangeRestrictedInt8uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRangeRestrictedInt8sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeRangeRestrictedInt8sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeRangeRestrictedInt8sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRangeRestrictedInt16uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeRangeRestrictedInt16uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeRangeRestrictedInt16uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRangeRestrictedInt16sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeRangeRestrictedInt16sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeRangeRestrictedInt16sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readListLongOctetStringAttribute(
        long chipClusterPtr, ListLongOctetStringAttributeCallback callback);

    private native void writeListLongOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<byte[]> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListLongOctetStringAttribute(
        long chipClusterPtr,
        ListLongOctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readListFabricScopedAttribute(
        long chipClusterPtr, ListFabricScopedAttributeCallback callback);

    private native void writeListFabricScopedAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.TestClusterClusterTestFabricScoped> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListFabricScopedAttribute(
        long chipClusterPtr,
        ListFabricScopedAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readTimedWriteBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeTimedWriteBooleanAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeTimedWriteBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneralErrorBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeGeneralErrorBooleanAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeGeneralErrorBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterErrorBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeClusterErrorBooleanAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeClusterErrorBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUnsupportedAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeUnsupportedAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeUnsupportedAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNullableBooleanAttribute(
        long chipClusterPtr, NullableBooleanAttributeCallback callback);

    private native void writeNullableBooleanAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableBooleanAttribute(
        long chipClusterPtr,
        NullableBooleanAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableBitmap8Attribute(
        long chipClusterPtr, NullableBitmap8AttributeCallback callback);

    private native void writeNullableBitmap8Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableBitmap8Attribute(
        long chipClusterPtr,
        NullableBitmap8AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableBitmap16Attribute(
        long chipClusterPtr, NullableBitmap16AttributeCallback callback);

    private native void writeNullableBitmap16Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableBitmap16Attribute(
        long chipClusterPtr,
        NullableBitmap16AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableBitmap32Attribute(
        long chipClusterPtr, NullableBitmap32AttributeCallback callback);

    private native void writeNullableBitmap32Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableBitmap32Attribute(
        long chipClusterPtr,
        NullableBitmap32AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableBitmap64Attribute(
        long chipClusterPtr, NullableBitmap64AttributeCallback callback);

    private native void writeNullableBitmap64Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableBitmap64Attribute(
        long chipClusterPtr,
        NullableBitmap64AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt8uAttribute(
        long chipClusterPtr, NullableInt8uAttributeCallback callback);

    private native void writeNullableInt8uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt8uAttribute(
        long chipClusterPtr,
        NullableInt8uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt16uAttribute(
        long chipClusterPtr, NullableInt16uAttributeCallback callback);

    private native void writeNullableInt16uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt16uAttribute(
        long chipClusterPtr,
        NullableInt16uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt24uAttribute(
        long chipClusterPtr, NullableInt24uAttributeCallback callback);

    private native void writeNullableInt24uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt24uAttribute(
        long chipClusterPtr,
        NullableInt24uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt32uAttribute(
        long chipClusterPtr, NullableInt32uAttributeCallback callback);

    private native void writeNullableInt32uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt32uAttribute(
        long chipClusterPtr,
        NullableInt32uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt40uAttribute(
        long chipClusterPtr, NullableInt40uAttributeCallback callback);

    private native void writeNullableInt40uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt40uAttribute(
        long chipClusterPtr,
        NullableInt40uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt48uAttribute(
        long chipClusterPtr, NullableInt48uAttributeCallback callback);

    private native void writeNullableInt48uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt48uAttribute(
        long chipClusterPtr,
        NullableInt48uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt56uAttribute(
        long chipClusterPtr, NullableInt56uAttributeCallback callback);

    private native void writeNullableInt56uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt56uAttribute(
        long chipClusterPtr,
        NullableInt56uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt64uAttribute(
        long chipClusterPtr, NullableInt64uAttributeCallback callback);

    private native void writeNullableInt64uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt64uAttribute(
        long chipClusterPtr,
        NullableInt64uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt8sAttribute(
        long chipClusterPtr, NullableInt8sAttributeCallback callback);

    private native void writeNullableInt8sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt8sAttribute(
        long chipClusterPtr,
        NullableInt8sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt16sAttribute(
        long chipClusterPtr, NullableInt16sAttributeCallback callback);

    private native void writeNullableInt16sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt16sAttribute(
        long chipClusterPtr,
        NullableInt16sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt24sAttribute(
        long chipClusterPtr, NullableInt24sAttributeCallback callback);

    private native void writeNullableInt24sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt24sAttribute(
        long chipClusterPtr,
        NullableInt24sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt32sAttribute(
        long chipClusterPtr, NullableInt32sAttributeCallback callback);

    private native void writeNullableInt32sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt32sAttribute(
        long chipClusterPtr,
        NullableInt32sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt40sAttribute(
        long chipClusterPtr, NullableInt40sAttributeCallback callback);

    private native void writeNullableInt40sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt40sAttribute(
        long chipClusterPtr,
        NullableInt40sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt48sAttribute(
        long chipClusterPtr, NullableInt48sAttributeCallback callback);

    private native void writeNullableInt48sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt48sAttribute(
        long chipClusterPtr,
        NullableInt48sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt56sAttribute(
        long chipClusterPtr, NullableInt56sAttributeCallback callback);

    private native void writeNullableInt56sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt56sAttribute(
        long chipClusterPtr,
        NullableInt56sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt64sAttribute(
        long chipClusterPtr, NullableInt64sAttributeCallback callback);

    private native void writeNullableInt64sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt64sAttribute(
        long chipClusterPtr,
        NullableInt64sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableEnum8Attribute(
        long chipClusterPtr, NullableEnum8AttributeCallback callback);

    private native void writeNullableEnum8Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableEnum8Attribute(
        long chipClusterPtr,
        NullableEnum8AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableEnum16Attribute(
        long chipClusterPtr, NullableEnum16AttributeCallback callback);

    private native void writeNullableEnum16Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableEnum16Attribute(
        long chipClusterPtr,
        NullableEnum16AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableFloatSingleAttribute(
        long chipClusterPtr, NullableFloatSingleAttributeCallback callback);

    private native void writeNullableFloatSingleAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Float value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableFloatSingleAttribute(
        long chipClusterPtr,
        NullableFloatSingleAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableFloatDoubleAttribute(
        long chipClusterPtr, NullableFloatDoubleAttributeCallback callback);

    private native void writeNullableFloatDoubleAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Double value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableFloatDoubleAttribute(
        long chipClusterPtr,
        NullableFloatDoubleAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableOctetStringAttribute(
        long chipClusterPtr, NullableOctetStringAttributeCallback callback);

    private native void writeNullableOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        byte[] value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableOctetStringAttribute(
        long chipClusterPtr,
        NullableOctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableCharStringAttribute(
        long chipClusterPtr, NullableCharStringAttributeCallback callback);

    private native void writeNullableCharStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableCharStringAttribute(
        long chipClusterPtr,
        NullableCharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableEnumAttrAttribute(
        long chipClusterPtr, NullableEnumAttrAttributeCallback callback);

    private native void writeNullableEnumAttrAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableEnumAttrAttribute(
        long chipClusterPtr,
        NullableEnumAttrAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableRangeRestrictedInt8uAttribute(
        long chipClusterPtr, NullableRangeRestrictedInt8uAttributeCallback callback);

    private native void writeNullableRangeRestrictedInt8uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableRangeRestrictedInt8uAttribute(
        long chipClusterPtr,
        NullableRangeRestrictedInt8uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableRangeRestrictedInt8sAttribute(
        long chipClusterPtr, NullableRangeRestrictedInt8sAttributeCallback callback);

    private native void writeNullableRangeRestrictedInt8sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableRangeRestrictedInt8sAttribute(
        long chipClusterPtr,
        NullableRangeRestrictedInt8sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableRangeRestrictedInt16uAttribute(
        long chipClusterPtr, NullableRangeRestrictedInt16uAttributeCallback callback);

    private native void writeNullableRangeRestrictedInt16uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableRangeRestrictedInt16uAttribute(
        long chipClusterPtr,
        NullableRangeRestrictedInt16uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableRangeRestrictedInt16sAttribute(
        long chipClusterPtr, NullableRangeRestrictedInt16sAttributeCallback callback);

    private native void writeNullableRangeRestrictedInt16sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableRangeRestrictedInt16sAttribute(
        long chipClusterPtr,
        NullableRangeRestrictedInt16sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }
}
