// This IDL was generated automatically by ZAP.
// It is for view/code review purposes only.

{{#zcl_structs}}
{{#if has_more_than_one_cluster}}
{{>idl_structure_definition extraIndent=0}}

{{/if}}
{{/zcl_structs}}
{{#all_user_clusters~}}
{{#if (is_client side)~}}
{{>idl_cluster_definition generateClientCluster=1}}
{{else~}}
{{>idl_cluster_definition generateClientCluster=0}}
{{/if}}
{{/all_user_clusters}}
{{#user_endpoints}}
endpoint {{endpointId}} {
  {{#if deviceIdentifier}}
  device type {{chip_friendly_endpoint_type_name}} = {{deviceIdentifier}}, version {{endpointVersion}};
  {{/if~}}

  {{#user_clusters}}
    {{#if enabled}}
      {{#unless (isServer side)}}
  binding cluster {{asUpperCamelCase name}};
      {{/unless}}
    {{/if}}
  {{/user_clusters}}
  {{#user_clusters}}
    {{#if enabled}}
      {{#if (isServer side)}}

  server cluster {{asUpperCamelCase name}} {
    {{#user_cluster_events}}
      {{#if included}}
    emits event {{name}};
      {{/if}}
    {{/user_cluster_events}} 
    {{#user_cluster_attributes}}
       {{#if included}}
        {{~#if (is_str_equal storageOption "NVM")}}
    persist  {{!align~}}
        {{~else if (is_str_equal storageOption "External")}}
    callback {{!align~}}
        {{~else}}
    ram      {{!align~}}
        {{~/if~}}
        attribute {{asLowerCamelCase name}}
        {{~#if defaultValue~}} 
          {{!need space}} default = {{#if (isString type)}}"{{defaultValue}}"{{else}}{{defaultValue}}{{/if}}
        {{~/if~}}
        ;
      {{/if}}
    {{/user_cluster_attributes}}
  }
      {{/if}}
    {{/if}}
  {{/user_clusters}}
}
{{/user_endpoints}}


