From: luozheng <1732036298@qq.com> Date: Tue, 30 Apr 2024 04:00:09 +0000 (+0800) Subject: 实现第一次启动,需要实现弹窗切换语言的功能 X-Git-Tag: release_V1.2.70_20241020_135402~1123^2~3 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=54094239e91a3bb5cceda00dacc10acf64c61710;p=mirrors%2FFD230.git 实现第一次启动,需要实现弹窗切换语言的功能 --- diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp index 8ce45ddb0..7c43bfb5a 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp +++ b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp @@ -387,7 +387,7 @@ namespace OHOS TraingModel::GetInstance()->Init(); // 训练消息订阅 // 初始化默认首页 ScreenModels::GetInstance()->PreLoadAppimages(); - NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN); + //NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN); // 注册长按重启或关机事件 RebootModel::GetInstance()->RegisterLongPressEvents(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/config/include/ConfigModel.h b/code/sdk/application/wearable/fd230app/nativeui/config/include/ConfigModel.h index 7a8ffade2..ed37cf36b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/config/include/ConfigModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/config/include/ConfigModel.h @@ -194,7 +194,7 @@ namespace OHOS {ConfigDataType::DATATYPE_STRING, "Cat1_ModemVer", "" },//CONFIGMODEL_ITEM_CAT1_MODEMVER, {ConfigDataType::DATATYPE_STRING, "Cat1_PYVer", "" },//CONFIGMODEL_ITEM_CAT1_PYVER, {ConfigDataType::DATATYPE_INT, "LanguageID", "-1" },//CONFIGMODEL_ITEM_LANGUAGE_ID, //默认没有选择语言 - {ConfigDataType::DATATYPE_STRING, "LanguageCode", "zh" },//CONFIGMODEL_ITEM_LANGUAGE_CODE, //默认没有选择语言 + {ConfigDataType::DATATYPE_STRING, "LanguageCode", "" },//CONFIGMODEL_ITEM_LANGUAGE_CODE, //默认没有选择语言 {ConfigDataType::DATATYPE_BOOL, "SlientMode", "false" },//CONFIGMODEL_ITEM_SILENT_MODE, {ConfigDataType::DATATYPE_INT, "VibratorSwitch", "1" },//CONFIGMODEL_ITEM_VIBRATOR_SWITCH, // 马达 开关,0 强,1 中,2 å¼±,3 关 // {ConfigDataType::DATATYPE_BOOL, "HRS_QuickAccess", "false"},//CONFIGMODEL_ITEM_HRS_SPO2_QUICKACCESS, diff --git a/code/sdk/application/wearable/fd230app/nativeui/language/LanguageInit.cpp b/code/sdk/application/wearable/fd230app/nativeui/language/LanguageInit.cpp index c9dcb392c..af8a61909 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/language/LanguageInit.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/language/LanguageInit.cpp @@ -1,8 +1,8 @@ /* * @Author: luozheng 1732036298@qq.com * @Date: 2024-03-30 09:14:38 - * @LastEditors: SnickerSun snickersun@163.com - * @LastEditTime: 2024-04-15 14:59:48 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-04-30 10:25:43 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/language/LanguageInit.cpp */ #include @@ -14,6 +14,7 @@ #include "wearable_log.h" #include "language/LanguageInit.h" #include "config/include/ConfigModel.h" +#include namespace OHOS { @@ -90,23 +91,24 @@ namespace OHOS "user/res/font/zh.lang"// AZ, }; - static language *g_planguage{nullptr}; + //static language *g_planguage{nullptr}; language::language() { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "language::language"); - g_planguage = this; + ///g_planguage = this; } language::~language() { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "language::~language"); - g_planguage = nullptr; + //g_planguage = nullptr; } language *language::GetInstance() { - return g_planguage; + static language instance; + return &instance; } bool language::InitLangues() @@ -121,7 +123,12 @@ namespace OHOS * 如果 thelanguage = -1 证明第一次启动,需要实现弹窗切换语言的功能。 * 在此之前,先设置成默认0 */ - thelanguage = 0; + //thelanguage = 0; + NativeAbility::GetInstance().SetDefaultSliceId(VIEW_LANGUAGE_SWITCH); + } + else + { + NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN); } FontGlobalManager::GetInstance()->RegisterLanguageInfo(resFiles, MAX_LANGUAGE, thelanguage); return true; @@ -151,8 +158,8 @@ namespace OHOS // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "resFiles[language_status]:%s", resFiles[language_status]); return true; } - - bool language::ChangeLanguage( char *language_code) + + bool language::ChangeLanguage(std::string language_code) { if (!FontGlobalManager::GetInstance() || !UIFont::GetInstance()) { @@ -162,11 +169,11 @@ namespace OHOS // 获取语言Code对应的语言Id LanguageId currentLanguageId = LanguageManager::GetInstance().GetLanguageIdByCode(language_code); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %s", currentLanguageId, language_code); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %s", currentLanguageId, language_code.c_str()); FontGlobalManager::GetInstance()->RegisterLanguageInfo(resFiles, MAX_LANGUAGE, currentLanguageId); UIFont::GetInstance()->SetCurrentLangId(currentLanguageId); - ConfigModel::GetInstance()->SetLanguageCode(language_code); + ConfigModel::GetInstance()->SetLanguageCode(language_code.c_str()); ConfigModel::GetInstance()->SetLanguage(currentLanguageId); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "resFiles[%d]:%s", currentLanguageId, resFiles[currentLanguageId]); return true; diff --git a/code/sdk/application/wearable/fd230app/nativeui/language/LanguageInit.h b/code/sdk/application/wearable/fd230app/nativeui/language/LanguageInit.h index 1e6a343eb..02164a719 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/language/LanguageInit.h +++ b/code/sdk/application/wearable/fd230app/nativeui/language/LanguageInit.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-03-30 09:30:03 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-04-01 16:00:57 + * @LastEditTime: 2024-04-30 10:03:25 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/language/LanguageInit.h */ #ifndef LANGUAGE_INIT_H @@ -66,7 +66,7 @@ namespace OHOS static language *GetInstance(); bool InitLangues(); bool ChangeLanguage(uint32_t); - bool ChangeLanguage(char *language_code); + bool ChangeLanguage(std::string language_code); bool fileExists(const char *fileName); }; diff --git a/code/sdk/application/wearable/fd230app/nativeui/language/include/LanguageSwitchModel.h b/code/sdk/application/wearable/fd230app/nativeui/language/include/LanguageSwitchModel.h index 7b4373783..b3c0babd4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/language/include/LanguageSwitchModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/language/include/LanguageSwitchModel.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-03-28 16:36:58 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-03-30 21:10:24 + * @LastEditTime: 2024-04-30 11:34:16 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/language/include/LanguageSwitchModel.h */ @@ -10,7 +10,6 @@ #define LANGUAGE_SWITCH_MODEL_H #include "language/include/LanguageSwitchListAdapter.h" -#include "config/include/ConfigModel.h" namespace OHOS { @@ -19,9 +18,9 @@ namespace OHOS public: static LanguageSwitchModel &GetInstance(); void SetCurLanguageCode(char *curlanguageid); - char *GetCurLanguageCode(void); - void SetLastLanguageCode(char *prelanguageid); - char *GetLastLanguageCode(void); + const char *GetCurLanguageCode(void); + void SetLastLanguageCode(std::string prelanguageid); + const char *GetLastLanguageCode(void); private: LanguageSwitchModel(); @@ -30,8 +29,7 @@ namespace OHOS const LanguageSwitchModel &operator=(const LanguageSwitchModel &) = delete; static const uint16_t LANGUAGE_ITEM_MAX = MAX_LANGUAGE; // 语言总数 char *CurLanguageCode = "zh"; // 当前语言,默认简体中文 - char *PreLanguageCode = nullptr; // 上一次切换的语言 - ConfigModel *p_ConfigModel{nullptr}; + std::string PreLanguageCode; // 上一次切换的语言 }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchListAdapter.cpp b/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchListAdapter.cpp index 880b781b6..97d87311e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchListAdapter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchListAdapter.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-03-28 14:27:05 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-03-30 17:37:29 + * @LastEditTime: 2024-04-30 11:40:50 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchListAdapter.cpp */ #include "language/include/LanguageSwitchListAdapter.h" @@ -106,6 +106,7 @@ namespace OHOS // 设置未选中 item->GetUILabelButtonExt()->SetImageSrc(NotSelectedImg, NotSelectedImg); } + item->GetUILabelButtonExt()->Invalidate(); } return item; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchModel.cpp index 10932b2de..d0090b6bb 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchModel.cpp @@ -2,23 +2,19 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-03-28 16:36:46 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-04-01 11:52:27 + * @LastEditTime: 2024-04-30 11:58:38 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchModel.cpp */ #include "language/include/LanguageSwitchModel.h" #include "wearable_log.h" #include "language/LanguageInit.h" +#include "config/include/ConfigModel.h" namespace OHOS { LanguageSwitchModel::LanguageSwitchModel() { - p_ConfigModel = ConfigModel::GetInstance(); - // if (p_ConfigModel->GetLanguageCode().c_str() != nullptr) - { - //printf("%s\n", p_ConfigModel->GetLanguageCode()); - CurLanguageCode = const_cast(p_ConfigModel->GetLanguageCode().c_str()); - } + // CurLanguageCode = const_cast(ConfigModel::GetInstance()->GetLanguageCode().c_str()); } LanguageSwitchModel::~LanguageSwitchModel() @@ -36,21 +32,23 @@ namespace OHOS */ void LanguageSwitchModel::SetCurLanguageCode(char *curlanguagecode) { - CurLanguageCode = curlanguagecode; + // CurLanguageCode = curlanguagecode; + ConfigModel::GetInstance()->SetLanguageCode(curlanguagecode); } /* * @brief 获取当前设置的语言code */ - char *LanguageSwitchModel::GetCurLanguageCode(void) + const char *LanguageSwitchModel::GetCurLanguageCode(void) { - return CurLanguageCode; + // return CurLanguageCode; + return ConfigModel::GetInstance()->GetLanguageCode().c_str(); } /* * @brief 设置上一次语言code */ - void LanguageSwitchModel::SetLastLanguageCode(char *prelanguagecode) + void LanguageSwitchModel::SetLastLanguageCode(std::string prelanguagecode) { PreLanguageCode = prelanguagecode; } @@ -58,8 +56,8 @@ namespace OHOS /* * @brief 获取上一次设置的语言code */ - char *LanguageSwitchModel::GetLastLanguageCode(void) + const char *LanguageSwitchModel::GetLastLanguageCode(void) { - return PreLanguageCode; + return PreLanguageCode.c_str(); } } \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchPresenter.cpp index 5e4e4f0e8..7148bba74 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchPresenter.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-03-28 14:17:43 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-04-08 11:21:43 + * @LastEditTime: 2024-04-30 11:27:38 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/language/src/LanguageSwitchPresenter.cpp */ #include "AppViewIDs.h" @@ -82,7 +82,7 @@ namespace OHOS if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) { uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId(); - NativeAbility::GetInstance().ChangeSlice(preSlice); + NativeAbility::GetInstance().Back(); } return true; } @@ -90,10 +90,10 @@ namespace OHOS bool LanguageSwitchPresenter::OnClick(UIView &view, const ClickEvent &event) { UNUSED(event); - char *lastLanguageCode = p_LanguageSwitchModel->GetLastLanguageCode(); + const char *lastLanguageCode = p_LanguageSwitchModel->GetLastLanguageCode(); UILabelButtonExt *p_UILabelButtonExt = dynamic_cast(&view); char *id = const_cast(p_UILabelButtonExt->GetViewId()); - language *g_planguage = new language(); + language *g_planguage = language::GetInstance(); if (p_UILabelButtonExt != nullptr) { @@ -106,8 +106,8 @@ namespace OHOS return false; } WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lastLanguageCode = %s , CurrLanguageCode = %s", p_LanguageSwitchModel->GetLastLanguageCode(), p_LanguageSwitchModel->GetCurLanguageCode()); - // 检查当前语言ID是否已经是点击的语言ID,否则重复点击同一语言不响应切换 - if (p_LanguageSwitchModel->GetCurLanguageCode() == lastLanguageCode) + // 检查当前语言ID是否已经是点击的语言ID,否则重复点击同一语言不响应切换 + if (strcmp(p_LanguageSwitchModel->GetCurLanguageCode(), lastLanguageCode) == 0) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Do not ChangeLanguage!!"); return true; @@ -124,6 +124,7 @@ namespace OHOS // 更新上一个语言ID p_LanguageSwitchModel->SetLastLanguageCode(p_LanguageSwitchModel->GetCurLanguageCode()); } + NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN);//暂定选完语言后设置默认的Sliceid为主界面 return true; } @@ -136,8 +137,7 @@ namespace OHOS // 如果是power键,且是亮屏状态,按键释放就返回上一级 if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0) { - uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId(); - NativeAbility::GetInstance().ChangeSlice(preSlice); + NativeAbility::GetInstance().Back(); } return true; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/system/src/SystemPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/system/src/SystemPresenter.cpp index 432e40f03..6829336ab 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/system/src/SystemPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/system/src/SystemPresenter.cpp @@ -152,7 +152,7 @@ namespace OHOS if (strcmp(view.GetViewId(), "SystemLanguageButton") == 0) { - NativeAbility::GetInstance().ChangeSlice(VIEW_LANGUAGE_SWITCH); + NativeAbility::GetInstance().EnterSlice(VIEW_LANGUAGE_SWITCH); return true; } @@ -209,7 +209,7 @@ namespace OHOS if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)) { SystemPresenter::GetInstance()->set_key_falg(false); - NativeAbility::GetInstance().ChangeSlice(VIEW_SETTING); + NativeAbility::GetInstance().Back(); } return true; } @@ -241,38 +241,38 @@ namespace OHOS /* -------------------------------------------------------------------------- */ // 获取语言类 - language *g_planguage = new language; + //language *g_planguage = new language(); /* -------------------------------------------------------------------------- */ // 用来监听语言切换 bool RadiobuttonOnChangeListener::OnChange(UICheckBox::UICheckBoxState state) { - language *g_planguage; - // static const char *en = "user/res/font/en.lang"; - // static const char *zh_CN = "user/res/font/zh.lang"; - switch (state) - { - case UICheckBox::SELECTED: - if (isChineseRadioButtonSelected()) - { - // 中文文本 - g_planguage->ChangeLanguage(LanguageId::ZH_CN); - } - else if (isEnglishRadioButtonSelected()) - { - // 英语文本 - g_planguage->ChangeLanguage(LanguageId::EN); - } - m_label->SetTextId(0); - // 强制刷新 - m_label->ForceResetText(); - RootView::GetInstance()->Invalidate(); - break; - case UICheckBox::UNSELECTED: - // Handle unselected state if needed - break; - default: - break; - } + // language *g_planguage; + // // static const char *en = "user/res/font/en.lang"; + // // static const char *zh_CN = "user/res/font/zh.lang"; + // switch (state) + // { + // case UICheckBox::SELECTED: + // if (isChineseRadioButtonSelected()) + // { + // // 中文文本 + // g_planguage->ChangeLanguage(LanguageId::ZH_CN); + // } + // else if (isEnglishRadioButtonSelected()) + // { + // // 英语文本 + // g_planguage->ChangeLanguage(LanguageId::EN); + // } + // m_label->SetTextId(0); + // // 强制刷新 + // m_label->ForceResetText(); + // RootView::GetInstance()->Invalidate(); + // break; + // case UICheckBox::UNSELECTED: + // // Handle unselected state if needed + // break; + // default: + // break; + // } return true; } @@ -288,12 +288,7 @@ namespace OHOS if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0) { uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId(); - if (preSlice == VIEW_LANGUAGE_SWITCH) - { - NativeAbility::GetInstance().ChangeSlice(VIEW_SETTING); - return true; - } - NativeAbility::GetInstance().ChangeSlice(preSlice); + NativeAbility::GetInstance().Back(); } } return true; diff --git a/code/sdk/application/wearable/fd230app/nativeui/weather/src/WeatherModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/weather/src/WeatherModel.cpp index 2fd144feb..473a6d299 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/weather/src/WeatherModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/weather/src/WeatherModel.cpp @@ -130,12 +130,13 @@ namespace OHOS void WeatherModel::TimestampToMonthDayString(time_t timestamp, char *buffer) { - // 将时间戳转换成tm结构 - struct tm *timeinfo = localtime(×tamp); + // 将时间戳转换成tm结构 + struct tm timeinfo; + localtime_r(×tamp, &timeinfo); // 格式化输出月份和日期 // 注意: 月份tm_mon从0开始计数,所以显示时需要加1 - sprintf(buffer, "%02d.%02d", timeinfo->tm_mon + 1, timeinfo->tm_mday); + sprintf(buffer, "%02d.%02d", timeinfo.tm_mon + 1, timeinfo.tm_mday); } // 获取天气图片 diff --git a/code/sdk/application/wearable/service/msg_center/src/notify/pairing_notification.cpp b/code/sdk/application/wearable/service/msg_center/src/notify/pairing_notification.cpp index 8def5babe..9226f709b 100644 --- a/code/sdk/application/wearable/service/msg_center/src/notify/pairing_notification.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/notify/pairing_notification.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-03-22 10:04:36 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-03-30 09:28:18 + * @LastEditTime: 2024-04-29 20:09:47 * @FilePath: /FD230/code/sdk/application/wearable/service/msg_center/src/notify/pairing_notification.cpp */ #include "notification_manager.h" @@ -472,7 +472,7 @@ namespace OHOS DeviceUnbindingRequestViewLabel[0]->SetStyle(STYLE_TEXT_FONT, 30); DeviceUnbindingRequestViewLabel[0]->SetStyle(STYLE_LINE_HEIGHT, 40); char str[512]; - memcpy(str, 0, 512); + memset(str, 0, 512); sprintf(str, "当前设备已经与 %s 绑定", PairingViewEventListener::GetInstance().GetDeviceName()); DeviceUnbindingRequestViewLabel[0]->SetText(str); DeviceUnbindingRequestViewLabel[0]->SetLineBreakMode(UILabel::LINE_BREAK_WRAP); @@ -491,7 +491,7 @@ namespace OHOS DeviceUnbindingRequestViewLabel[1]->SetPosition(33, y, 400, 300); DeviceUnbindingRequestViewLabel[1]->SetStyle(STYLE_TEXT_FONT, 30); DeviceUnbindingRequestViewLabel[1]->SetStyle(STYLE_LINE_HEIGHT, 40); - memcpy(str, 0, 512); + memset(str, 0, 512); sprintf(str, "继续连接操作会解除与%s的绑定并将手表恢复出厂设置(会清空手表数据)\n\n是否继续此操作\n", PairingViewEventListener::GetInstance().GetDeviceName()); // str = "继续连接操作会解除与 " + GetDeviceName() + " 的绑定并将手表恢复出厂设置(会清空手表数据)\n\n是否继续此操作\n"; DeviceUnbindingRequestViewLabel[1]->SetText(str);