Skip to content

Commit

Permalink
restyling and some build changes that were missed
Browse files Browse the repository at this point in the history
  • Loading branch information
chirag-silabs committed Nov 24, 2022
1 parent 28a3d83 commit 0e012b2
Show file tree
Hide file tree
Showing 18 changed files with 112 additions and 109 deletions.
2 changes: 1 addition & 1 deletion examples/lighting-app/silabs/efr32/src/LightingManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ void LightingManager::AutoTurnOffTimerEventHandler(AppEvent * aEvent)

light->mAutoTurnOffTimerArmed = false;

SILABS_LOG("Auto Turn Off has been triggered!");
SILABS_LOG("Auto Turn Off has been triggered!");

light->InitiateAction(actor, OFF_ACTION);
}
Expand Down
58 changes: 29 additions & 29 deletions examples/lock-app/efr32/src/LockManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,15 @@ CHIP_ERROR LockManager::Init(chip::app::DataModel::Nullable<chip::app::Clusters:
if (LockParams.numberOfUsers > kMaxUsers)
{
SILABS_LOG("Max number of users is greater than %d, the maximum amount of users currently supported on this platform",
kMaxUsers);
kMaxUsers);
return APP_ERROR_ALLOCATION_FAILED;
}

if (LockParams.numberOfCredentialsPerUser > kMaxCredentialsPerUser)
{
SILABS_LOG("Max number of credentials per user is greater than %d, the maximum amount of users currently supported on this "
"platform",
kMaxCredentialsPerUser);
"platform",
kMaxCredentialsPerUser);
return APP_ERROR_ALLOCATION_FAILED;
}

Expand Down Expand Up @@ -132,33 +132,33 @@ bool LockManager::ReadConfigValues()
{
size_t outLen;
SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_LockUser, reinterpret_cast<uint8_t *>(&mLockUsers),
sizeof(EmberAfPluginDoorLockUserInfo) * ArraySize(mLockUsers), outLen);
sizeof(EmberAfPluginDoorLockUserInfo) * ArraySize(mLockUsers), outLen);

SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_Credential, reinterpret_cast<uint8_t *>(&mLockCredentials),
sizeof(EmberAfPluginDoorLockCredentialInfo) * ArraySize(mLockCredentials), outLen);
sizeof(EmberAfPluginDoorLockCredentialInfo) * ArraySize(mLockCredentials), outLen);

SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_LockUserName, reinterpret_cast<uint8_t *>(mUserNames),
sizeof(mUserNames), outLen);
sizeof(mUserNames), outLen);

SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_CredentialData, reinterpret_cast<uint8_t *>(mCredentialData),
sizeof(mCredentialData), outLen);
sizeof(mCredentialData), outLen);

SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_UserCredentials, reinterpret_cast<uint8_t *>(mCredentials),
sizeof(DlCredential) * LockParams.numberOfUsers * LockParams.numberOfCredentialsPerUser,
outLen);
sizeof(DlCredential) * LockParams.numberOfUsers * LockParams.numberOfCredentialsPerUser,
outLen);

SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_WeekDaySchedules, reinterpret_cast<uint8_t *>(mWeekdaySchedule),
sizeof(EmberAfPluginDoorLockWeekDaySchedule) * LockParams.numberOfWeekdaySchedulesPerUser *
LockParams.numberOfUsers,
outLen);
sizeof(EmberAfPluginDoorLockWeekDaySchedule) * LockParams.numberOfWeekdaySchedulesPerUser *
LockParams.numberOfUsers,
outLen);

SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_YearDaySchedules, reinterpret_cast<uint8_t *>(mYeardaySchedule),
sizeof(EmberAfPluginDoorLockYearDaySchedule) * LockParams.numberOfYeardaySchedulesPerUser *
LockParams.numberOfUsers,
outLen);
sizeof(EmberAfPluginDoorLockYearDaySchedule) * LockParams.numberOfYeardaySchedulesPerUser *
LockParams.numberOfUsers,
outLen);

SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_HolidaySchedules, reinterpret_cast<uint8_t *>(&(mHolidaySchedule)),
sizeof(EmberAfPluginDoorLockHolidaySchedule) * LockParams.numberOfHolidaySchedules, outLen);
sizeof(EmberAfPluginDoorLockHolidaySchedule) * LockParams.numberOfHolidaySchedules, outLen);

return true;
}
Expand Down Expand Up @@ -387,13 +387,13 @@ bool LockManager::SetUser(chip::EndpointId endpointId, uint16_t userIndex, chip:

// Save user information in NVM flash
SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_LockUser, reinterpret_cast<const uint8_t *>(&mLockUsers),
sizeof(EmberAfPluginDoorLockUserInfo) * LockParams.numberOfUsers);
sizeof(EmberAfPluginDoorLockUserInfo) * LockParams.numberOfUsers);

SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_UserCredentials, reinterpret_cast<const uint8_t *>(mCredentials),
sizeof(DlCredential) * LockParams.numberOfUsers * LockParams.numberOfCredentialsPerUser);
sizeof(DlCredential) * LockParams.numberOfUsers * LockParams.numberOfCredentialsPerUser);

SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_LockUserName, reinterpret_cast<const uint8_t *>(mUserNames),
sizeof(mUserNames));
sizeof(mUserNames));

ChipLogProgress(Zcl, "Successfully set the user [mEndpointId=%d,index=%d]", endpointId, userIndex);

Expand Down Expand Up @@ -474,10 +474,10 @@ bool LockManager::SetCredential(chip::EndpointId endpointId, uint16_t credential

// Save credential information in NVM flash
SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_Credential, reinterpret_cast<const uint8_t *>(&mLockCredentials),
sizeof(EmberAfPluginDoorLockCredentialInfo) * LockParams.numberOfCredentialsPerUser);
sizeof(EmberAfPluginDoorLockCredentialInfo) * LockParams.numberOfCredentialsPerUser);

SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_CredentialData, reinterpret_cast<const uint8_t *>(&mCredentialData),
sizeof(mCredentialData));
sizeof(mCredentialData));

ChipLogProgress(Zcl, "Successfully set the credential [credentialType=%u]", to_underlying(credentialType));

Expand Down Expand Up @@ -532,9 +532,9 @@ DlStatus LockManager::SetWeekdaySchedule(chip::EndpointId endpointId, uint8_t we
scheduleInStorage.status = status;

// Save schedule information in NVM flash
SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_WeekDaySchedules, reinterpret_cast<const uint8_t *>(mWeekdaySchedule),
sizeof(EmberAfPluginDoorLockWeekDaySchedule) * LockParams.numberOfWeekdaySchedulesPerUser *
LockParams.numberOfUsers);
SILABSConfig::WriteConfigValueBin(
SILABSConfig::kConfigKey_WeekDaySchedules, reinterpret_cast<const uint8_t *>(mWeekdaySchedule),
sizeof(EmberAfPluginDoorLockWeekDaySchedule) * LockParams.numberOfWeekdaySchedulesPerUser * LockParams.numberOfUsers);

return DlStatus::kSuccess;
}
Expand Down Expand Up @@ -581,9 +581,9 @@ DlStatus LockManager::SetYeardaySchedule(chip::EndpointId endpointId, uint8_t ye
scheduleInStorage.status = status;

// Save schedule information in NVM flash
SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_YearDaySchedules, reinterpret_cast<const uint8_t *>(mYeardaySchedule),
sizeof(EmberAfPluginDoorLockYearDaySchedule) * LockParams.numberOfYeardaySchedulesPerUser *
LockParams.numberOfUsers);
SILABSConfig::WriteConfigValueBin(
SILABSConfig::kConfigKey_YearDaySchedules, reinterpret_cast<const uint8_t *>(mYeardaySchedule),
sizeof(EmberAfPluginDoorLockYearDaySchedule) * LockParams.numberOfYeardaySchedulesPerUser * LockParams.numberOfUsers);

return DlStatus::kSuccess;
}
Expand Down Expand Up @@ -626,8 +626,8 @@ DlStatus LockManager::SetHolidaySchedule(chip::EndpointId endpointId, uint8_t ho

// Save schedule information in NVM flash
SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_HolidaySchedules,
reinterpret_cast<const uint8_t *>(&(mHolidaySchedule)),
sizeof(EmberAfPluginDoorLockHolidaySchedule) * LockParams.numberOfHolidaySchedules);
reinterpret_cast<const uint8_t *>(&(mHolidaySchedule)),
sizeof(EmberAfPluginDoorLockHolidaySchedule) * LockParams.numberOfHolidaySchedules);

return DlStatus::kSuccess;
}
Expand Down
8 changes: 5 additions & 3 deletions examples/platform/silabs/SilabsDeviceAttestationCreds.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
#include <lib/support/CodeUtils.h>
#include <lib/support/Span.h>

#include "silabs_creds.h"
#include "psa/crypto.h"
#include "silabs_creds.h"

extern uint8_t __attestation_credentials_base[];

Expand Down Expand Up @@ -50,13 +50,15 @@ class DeviceAttestationCredsSilabs : public DeviceAttestationCredentialsProvider

CHIP_ERROR GetDeviceAttestationCert(MutableByteSpan & out_buffer) override
{
ByteSpan cert_span(((uint8_t *) __attestation_credentials_base) + SILABS_CREDENTIALS_DAC_OFFSET, SILABS_CREDENTIALS_DAC_SIZE);
ByteSpan cert_span(((uint8_t *) __attestation_credentials_base) + SILABS_CREDENTIALS_DAC_OFFSET,
SILABS_CREDENTIALS_DAC_SIZE);
return CopySpanToMutableSpan(cert_span, out_buffer);
}

CHIP_ERROR GetProductAttestationIntermediateCert(MutableByteSpan & out_pai_buffer) override
{
ByteSpan cert_span(((uint8_t *) __attestation_credentials_base) + SILABS_CREDENTIALS_PAI_OFFSET, SILABS_CREDENTIALS_PAI_SIZE);
ByteSpan cert_span(((uint8_t *) __attestation_credentials_base) + SILABS_CREDENTIALS_PAI_OFFSET,
SILABS_CREDENTIALS_PAI_SIZE);
return CopySpanToMutableSpan(cert_span, out_pai_buffer);
}

Expand Down
11 changes: 6 additions & 5 deletions examples/platform/silabs/efr32/EFR32DeviceDataProvider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@ CHIP_ERROR EFR32DeviceDataProvider::GetSpake2pVerifier(MutableByteSpan & verifie
char verifierB64[kSpake2pSerializedVerifier_MaxBase64Len] = { 0 };
size_t verifierB64Len = 0;

err =
SILABSConfig::ReadConfigValueStr(SILABSConfig::kConfigKey_Spake2pVerifier, verifierB64, sizeof(verifierB64), verifierB64Len);
err = SILABSConfig::ReadConfigValueStr(SILABSConfig::kConfigKey_Spake2pVerifier, verifierB64, sizeof(verifierB64),
verifierB64Len);

#if defined(CHIP_DEVICE_CONFIG_USE_TEST_SPAKE2P_VERIFIER)
if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND)
Expand Down Expand Up @@ -134,7 +134,7 @@ CHIP_ERROR EFR32DeviceDataProvider::GetSetupPayload(MutableCharSpan & payloadBuf
size_t bitSetLen = 0;

err = SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_SetupPayloadBitSet, payloadBitSet, kTotalPayloadDataSizeInBytes,
bitSetLen);
bitSetLen);

#if defined(CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE) && CHIP_DEVICE_CONFIG_USE_TEST_SETUP_PIN_CODE
if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND)
Expand Down Expand Up @@ -260,7 +260,8 @@ CHIP_ERROR EFR32DeviceDataProvider::GetRotatingDeviceIdUniqueId(MutableByteSpan
"Length of unique ID for rotating device ID is smaller than minimum.");

size_t uniqueIdLen = 0;
err = SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_UniqueId, uniqueIdSpan.data(), uniqueIdSpan.size(), uniqueIdLen);
err =
SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_UniqueId, uniqueIdSpan.data(), uniqueIdSpan.size(), uniqueIdLen);
#ifdef CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID
if (err == CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND)
{
Expand Down Expand Up @@ -294,7 +295,7 @@ CHIP_ERROR EFR32DeviceDataProvider::GetManufacturingDate(uint16_t & year, uint8_
char * parseEnd;

err = SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_ManufacturingDate, reinterpret_cast<uint8_t *>(dateStr),
sizeof(dateStr), dateLen);
sizeof(dateStr), dateLen);
SuccessOrExit(err);

VerifyOrExit(dateLen == kDateStringLength, err = CHIP_ERROR_INVALID_ARGUMENT);
Expand Down
26 changes: 13 additions & 13 deletions examples/platform/silabs/efr32/wf200/host_if.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -283,8 +283,8 @@ static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_res
struct scan_result_holder * ap;

SILABS_LOG("# %2d %2d %03d %02X:%02X:%02X:%02X:%02X:%02X %s", scan_count, scan_result->channel,
((int16_t)(scan_result->rcpi - 220) / 2), scan_result->mac[0], scan_result->mac[1], scan_result->mac[2],
scan_result->mac[3], scan_result->mac[4], scan_result->mac[5], scan_result->ssid_def.ssid);
((int16_t)(scan_result->rcpi - 220) / 2), scan_result->mac[0], scan_result->mac[1], scan_result->mac[2],
scan_result->mac[3], scan_result->mac[4], scan_result->mac[5], scan_result->ssid_def.ssid);
/*Report one AP information*/
SILABS_LOG("\r\n");
/* don't save if filter only wants specific ssid */
Expand Down Expand Up @@ -475,7 +475,7 @@ static void sl_wfx_client_connected_callback(uint8_t * mac)
static void sl_wfx_ap_client_rejected_callback(uint32_t status, uint8_t * mac)
{
SILABS_LOG("Client rejected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2], mac[3],
mac[4], mac[5]);
mac[4], mac[5]);
}

/****************************************************************************
Expand All @@ -488,7 +488,7 @@ static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t * ma
{
// TODO
SILABS_LOG("Client disconnected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2],
mac[3], mac[4], mac[5]);
mac[3], mac[4], mac[5]);
}
#endif /* SL_WFX_CONFIG_SOFTAP */

Expand Down Expand Up @@ -636,8 +636,8 @@ static void wfx_events_task(void * p_arg)
}

SILABS_LOG("WIFI Scan Paramter set to Active channel time %d, Passive "
"Channel Time: %d, Number of prob: %d",
ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
"Channel Time: %d, Number of prob: %d",
ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
(void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
(void) sl_wfx_send_scan_command(WFM_SCAN_MODE_ACTIVE, CHANNEL_LIST, /* Channel list */
CHANNEL_COUNT, /* Scan all chans */
Expand Down Expand Up @@ -684,9 +684,9 @@ static sl_status_t wfx_init(void)
{
case SL_STATUS_OK:
SILABS_LOG("WF200 FW ver:%d.%d.%d [MAC %02x:%02x:%02x-%02x:%02x:%02x]", wifiContext.firmware_major,
wifiContext.firmware_minor, wifiContext.firmware_build, wifiContext.mac_addr_0.octet[0],
wifiContext.mac_addr_0.octet[1], wifiContext.mac_addr_0.octet[2], wifiContext.mac_addr_0.octet[3],
wifiContext.mac_addr_0.octet[4], wifiContext.mac_addr_0.octet[5]);
wifiContext.firmware_minor, wifiContext.firmware_build, wifiContext.mac_addr_0.octet[0],
wifiContext.mac_addr_0.octet[1], wifiContext.mac_addr_0.octet[2], wifiContext.mac_addr_0.octet[3],
wifiContext.mac_addr_0.octet[4], wifiContext.mac_addr_0.octet[5]);
SILABS_LOG("WF200 Init OK");

if (wifiContext.state == SL_WFX_STA_INTERFACE_CONNECTED)
Expand Down Expand Up @@ -756,7 +756,7 @@ int32_t wfx_get_ap_info(wfx_wifi_scan_result_t * ap)
SILABS_LOG("WIFI:SSID:: %s", &ap_info.ssid[0]);
memcpy(ap->ssid, ap_info.ssid, sizeof(ap_info.ssid));
SILABS_LOG("WIFI:Mac addr:: %02x:%02x:%02x:%02x:%02x:%02x", ap_info.bssid[0], ap_info.bssid[1], ap_info.bssid[2],
ap_info.bssid[3], ap_info.bssid[4], ap_info.bssid[5]);
ap_info.bssid[3], ap_info.bssid[4], ap_info.bssid[5]);
memcpy(ap->bssid, ap_info.bssid, sizeof(ap_info.bssid));
ap->security = ap_info.security;
SILABS_LOG("WIFI:security:: %d", ap->security);
Expand Down Expand Up @@ -1034,8 +1034,8 @@ sl_status_t wfx_connect_to_ap(void)
SILABS_LOG("WIFI:JOIN to %s", &wifi_provision.ssid[0]);

SILABS_LOG("WIFI Scan Paramter set to Active channel time %d, Passive Channel "
"Time: %d, Number of prob: %d",
ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
"Time: %d, Number of prob: %d",
ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
(void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
result =
sl_wfx_send_join_command((uint8_t *) wifi_provision.ssid, strlen(wifi_provision.ssid), NULL, CHANNEL_0,
Expand All @@ -1062,7 +1062,7 @@ void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t *
#endif
*addr = *mac;
SILABS_LOG("WLAN:Get WiFi Mac addr %02x:%02x:%02x:%02x:%02x:%02x", mac->octet[0], mac->octet[1], mac->octet[2], mac->octet[3],
mac->octet[4], mac->octet[5]);
mac->octet[4], mac->octet[5]);
memcpy(&ap_info.bssid[0], &mac->octet[0], 6);
}

Expand Down
2 changes: 1 addition & 1 deletion examples/platform/silabs/silabs_creds.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@
#define SILABS_CREDENTIALS_DAC_KEY_ID PSA_KEY_ID_USER_MIN + 1
#endif

#endif // SILABS_DEVICE_CREDENTIALS
#endif // SILABS_DEVICE_CREDENTIALS
2 changes: 1 addition & 1 deletion examples/thermostat/efr32/src/AppTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ void AppTask::UpdateThermoStatUI()
}
#else
SILABS_LOG("Thermostat Status - M:%d T:%d'C H:%d'C C:%d'C", TempMgr().GetMode(), TempMgr().GetCurrentTemp(),
TempMgr().GetHeatingSetPoint(), TempMgr().GetCoolingSetPoint());
TempMgr().GetHeatingSetPoint(), TempMgr().GetCoolingSetPoint());
#endif // DISPLAY_ENABLED
}

Expand Down
2 changes: 1 addition & 1 deletion examples/thermostat/efr32/src/TemperatureManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ void TemperatureManager::AttributeChangeHandler(EndpointId endpointId, Attribute

case ThermAttr::OccupiedHeatingSetpoint::Id: {
int8_t heatingTemp = ConvertToPrintableTemp(*((int16_t *) value));
SILABS_LOG("HeatingSetpoint %d", heatingTemp);
SILABS_LOG("HeatingSetpoint %d", heatingTemp);
mHeatingCelsiusSetPoint = heatingTemp;
}
break;
Expand Down
4 changes: 2 additions & 2 deletions src/platform/silabs/ConfigurationManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@

#include <platform/internal/GenericConfigurationManagerImpl.h>

#include <platform/silabs/EFR32Config.h>
#include <platform/silabs/SilabsConfig.h>

namespace chip {
namespace DeviceLayer {

/**
* Concrete implementation of the ConfigurationManager singleton object for the EFR32 platform.
*/
class ConfigurationManagerImpl : public Internal::GenericConfigurationManagerImpl<Internal::EFR32Config>
class ConfigurationManagerImpl : public Internal::GenericConfigurationManagerImpl<Internal::SILABSConfig>
{
public:
// This returns an instance of this class.
Expand Down
4 changes: 2 additions & 2 deletions src/platform/silabs/EFR32/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ static_library("EFR32") {
"${silabs_platform_dir}/ConnectivityManagerImpl.h",
"${silabs_platform_dir}/DiagnosticDataProviderImpl.cpp",
"${silabs_platform_dir}/DiagnosticDataProviderImpl.h",
"${silabs_platform_dir}/EFR32Config.cpp",
"${silabs_platform_dir}/EFR32Config.h",
"${silabs_platform_dir}/InetPlatformConfig.h",
"${silabs_platform_dir}/KeyValueStoreManagerImpl.h",
"${silabs_platform_dir}/Logging.cpp",
"${silabs_platform_dir}/PlatformManagerImpl.h",
"${silabs_platform_dir}/SilabsConfig.cpp",
"${silabs_platform_dir}/SilabsConfig.h",
"${silabs_platform_dir}/SystemPlatformConfig.h",
"../../FreeRTOS/SystemTimeSupport.cpp",
"../../SingletonConfigurationManager.cpp",
Expand Down
Loading

0 comments on commit 0e012b2

Please sign in to comment.