/*
 *
 *    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

#pragma once

#include <app-common/zap-generated/callbacks/PluginCallbacks.h>

#define MATTER_PLUGINS_INIT                                                                                                        \
    MatterIdentifyPluginServerInitCallback();                                                                                      \
    MatterGroupsPluginServerInitCallback();                                                                                        \
    MatterScenesPluginServerInitCallback();                                                                                        \
    MatterOnOffPluginClientInitCallback();                                                                                         \
    MatterOnOffPluginServerInitCallback();                                                                                         \
    MatterLevelControlPluginClientInitCallback();                                                                                  \
    MatterLevelControlPluginServerInitCallback();                                                                                  \
    MatterBinaryInputBasicPluginServerInitCallback();                                                                              \
    MatterDescriptorPluginClientInitCallback();                                                                                    \
    MatterDescriptorPluginServerInitCallback();                                                                                    \
    MatterBindingPluginServerInitCallback();                                                                                       \
    MatterAccessControlPluginServerInitCallback();                                                                                 \
    MatterBasicPluginServerInitCallback();                                                                                         \
    MatterOtaSoftwareUpdateProviderPluginServerInitCallback();                                                                     \
    MatterLocalizationConfigurationPluginServerInitCallback();                                                                     \
    MatterTimeFormatLocalizationPluginServerInitCallback();                                                                        \
    MatterUnitLocalizationPluginServerInitCallback();                                                                              \
    MatterGeneralCommissioningPluginServerInitCallback();                                                                          \
    MatterNetworkCommissioningPluginServerInitCallback();                                                                          \
    MatterDiagnosticLogsPluginServerInitCallback();                                                                                \
    MatterGeneralDiagnosticsPluginServerInitCallback();                                                                            \
    MatterSoftwareDiagnosticsPluginServerInitCallback();                                                                           \
    MatterThreadNetworkDiagnosticsPluginServerInitCallback();                                                                      \
    MatterWiFiNetworkDiagnosticsPluginServerInitCallback();                                                                        \
    MatterEthernetNetworkDiagnosticsPluginServerInitCallback();                                                                    \
    MatterSwitchPluginServerInitCallback();                                                                                        \
    MatterAdministratorCommissioningPluginServerInitCallback();                                                                    \
    MatterOperationalCredentialsPluginServerInitCallback();                                                                        \
    MatterGroupKeyManagementPluginServerInitCallback();                                                                            \
    MatterFixedLabelPluginServerInitCallback();                                                                                    \
    MatterUserLabelPluginServerInitCallback();                                                                                     \
    MatterBarrierControlPluginServerInitCallback();                                                                                \
    MatterWakeOnLanPluginServerInitCallback();                                                                                     \
    MatterChannelPluginClientInitCallback();                                                                                       \
    MatterTargetNavigatorPluginClientInitCallback();                                                                               \
    MatterMediaPlaybackPluginClientInitCallback();                                                                                 \
    MatterMediaInputPluginClientInitCallback();                                                                                    \
    MatterKeypadInputPluginClientInitCallback();                                                                                   \
    MatterContentLauncherPluginClientInitCallback();                                                                               \
    MatterAudioOutputPluginClientInitCallback();                                                                                   \
    MatterApplicationLauncherPluginClientInitCallback();                                                                           \
    MatterApplicationBasicPluginClientInitCallback();                                                                              \
    MatterAccountLoginPluginClientInitCallback();
