Rev 242 | Blame | Compare with Previous | Last modification | View Log | RSS feed
// LCDDisplay.cpp: implementation of the CLCDDisplay class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "LCDDisplay.h"//#include "LCDCustomScreen.h"#include "Utils\String.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CLCDDisplay::CLCDDisplay( CEzLcd *lcd, CX3Data *data ){int i;m_bLoading = false;m_bWaiting = false;m_bStarted = false;m_iUpdateCount = 0;m_pCustomScreen = NULL;m_pLcd = lcd;m_pData = data;// icon for stats pageHICON hIcon = static_cast<HICON>(LoadImage(0, _T("x3.ico"), IMAGE_ICON, 32, 32, LR_LOADFROMFILE));HANDLE icon = m_pLcd->AddIcon(hIcon, 32, 32);m_pLcd->SetOrigin(icon, 2, 15);// first stats pagem_hStatsTitle1 = lcd->AddText ( LG_SCROLLING_TEXT_FAST, LG_MEDIUM, DT_CENTER, 126 );lcd->SetOrigin ( m_hStatsTitle1, 17, 2);HANDLE shipsText = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 30 );lcd->SetOrigin ( shipsText, 35, 34);lcd->SetText ( shipsText, _T("Ships:") );HANDLE stationsText = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 40 );lcd->SetOrigin ( stationsText, 100, 34);lcd->SetText ( stationsText, _T("Stations:") );HANDLE timeText = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 50 );lcd->SetOrigin ( timeText, 35, 14);lcd->SetText ( timeText, _T("Game Time:") );HANDLE accountText = m_pLcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 40 );lcd->SetOrigin ( accountText, 35, 24);lcd->SetText ( accountText, _T("Credits:") );// varible statsm_hShipsNum = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20 );lcd->SetOrigin ( m_hShipsNum, 75, 34);m_hStationsNum = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20 );lcd->SetOrigin ( m_hStationsNum, 140, 34);m_hGameTime = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 65 );lcd->SetOrigin ( m_hGameTime, 95, 14);m_hCredits = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 65);lcd->SetOrigin ( m_hCredits, 95, 24);m_hInsurance1 = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 15 );lcd->SetOrigin ( m_hInsurance1, 0, 0 );lcd->SetText ( m_hInsurance1, _T("000") );lcd->AddNewPage ();lcd->ModifyControlsOnPage(1);// second stats pagem_hStatsTitle2 = lcd->AddText ( LG_SCROLLING_TEXT_FAST, LG_MEDIUM, DT_CENTER, 150 );lcd->SetOrigin ( m_hStatsTitle2, 2, 2 );for ( i = 0; i < MAXSHIPCLASS; i++ ){int x = (40 * (i % 4));int y = 14 + (10 * (i / 4));HANDLE shipsText = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 20);lcd->SetOrigin ( shipsText, x, y);lcd->SetText ( shipsText, GetShipClassName(i).c_str() );}// class stats variblessfor ( i = 0; i < MAXSHIPCLASS; i++ ){int x = 16 + (40 * (i % 4));int y = 14 + (10 * (i / 4));m_hClasses[i] = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20);lcd->SetOrigin ( m_hClasses[i], x, y);}/*m_hClasses[1] = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20);lcd->SetOrigin ( m_hClasses[1], 55, 24);m_hClasses[2] = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20);lcd->SetOrigin ( m_hClasses[2], 55, 34);m_hClasses[3] = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20);lcd->SetOrigin ( m_hClasses[3], 100, 14);m_hClasses[4] = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20);lcd->SetOrigin ( m_hClasses[4], 100, 24);m_hClasses[5] = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20);lcd->SetOrigin ( m_hClasses[5], 100, 34);m_hClasses[6] = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20);lcd->SetOrigin ( m_hClasses[6], 140, 14);m_hClasses[7] = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20);lcd->SetOrigin ( m_hClasses[7], 140, 24);m_hClasses[8] = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20);lcd->SetOrigin ( m_hClasses[8], 140, 34);m_hInsurance2 = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 15 );*/lcd->SetOrigin ( m_hInsurance2, 0, 0 );lcd->SetText ( m_hInsurance2, _T("000") );// first combat stats, your statsm_pLcd->AddNewPage ();m_pLcd->ModifyControlsOnPage(2);m_hCombatTitle1 = lcd->AddText(LG_SCROLLING_TEXT_FAST, LG_MEDIUM, DT_CENTER, 136);lcd->SetOrigin ( m_hCombatTitle1, 12, 2);HANDLE hullText = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 42);lcd->SetOrigin ( hullText, 5, 14);lcd->SetText ( hullText, _T("Hull") );HANDLE shieldText = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 42);lcd->SetOrigin ( shieldText, 5, 24);lcd->SetText ( shieldText, _T("Shields") );HANDLE weapText = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 42);lcd->SetOrigin ( weapText, 5, 34);lcd->SetText ( weapText, _T("Weapons") );m_hMissiles = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 10);lcd->SetOrigin ( m_hMissiles, 0, 0);lcd->SetText ( m_hMissiles, _T("") );m_hEnemies = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 10);lcd->SetOrigin ( m_hEnemies, 150, 0);lcd->SetText ( m_hEnemies, _T("") );m_hMyHull = lcd->AddProgressBar(LG_FILLED);lcd->SetProgressBarSize ( m_hMyHull, 100, 8 );lcd->SetOrigin ( m_hMyHull, 55, 14 );lcd->SetProgressBarPosition ( m_hMyHull, 0 );m_hMyShield = lcd->AddProgressBar ( LG_FILLED );lcd->SetProgressBarSize ( m_hMyShield, 100, 8 );lcd->SetOrigin ( m_hMyShield, 55, 24);lcd->SetProgressBarPosition ( m_hMyShield, 0 );m_hMyWeapon = lcd->AddProgressBar(LG_FILLED);lcd->SetProgressBarSize ( m_hMyWeapon, 100, 8 );lcd->SetOrigin ( m_hMyWeapon, 55, 34 );lcd->SetProgressBarPosition ( m_hMyWeapon, 0 );// second page of combat statslcd->AddNewPage ();lcd->ModifyControlsOnPage(3);m_hCombatTitle2 = lcd->AddText ( LG_SCROLLING_TEXT_FAST, LG_MEDIUM, DT_CENTER, 136 );lcd->SetOrigin ( m_hCombatTitle2, 12, 2 );m_hSpeedText1 = m_pLcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 40);lcd->SetOrigin ( m_hSpeedText1, 5, 14);lcd->SetText ( m_hSpeedText1, _T("Speed:") );m_hSpeedText2 = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 40);lcd->SetOrigin ( m_hSpeedText2, 80, 14);lcd->SetText ( m_hSpeedText2, _T("Dist:") );m_hMySpeed = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 40 );lcd->SetOrigin ( m_hMySpeed, 35, 14 );m_hTargetSpeed = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 40 );lcd->SetOrigin ( m_hTargetSpeed, 120, 14);HANDLE hullText2 = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 42);lcd->SetOrigin ( hullText2, 5, 24);lcd->SetText ( hullText2, _T("Hull") );HANDLE shieldText2 = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 42 );lcd->SetOrigin ( shieldText2, 5, 34);lcd->SetText ( shieldText2, _T("Shields") );m_hTargetHull = lcd->AddProgressBar(LG_FILLED);lcd->SetProgressBarSize ( m_hTargetHull, 100, 8 );lcd->SetOrigin ( m_hTargetHull, 55, 24 );lcd->SetProgressBarPosition ( m_hTargetHull, 0 );m_hTargetShield = lcd->AddProgressBar(LG_FILLED);lcd->SetProgressBarSize ( m_hTargetShield, 100, 8 );lcd->SetOrigin ( m_hTargetShield, 55, 34 );lcd->SetProgressBarPosition ( m_hTargetShield, 0 );m_hMissiles2 = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 10);lcd->SetOrigin ( m_hMissiles2, 0, 0);lcd->SetText ( m_hMissiles2, _T("") );m_hEnemies2 = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 10);lcd->SetOrigin ( m_hEnemies2, 150, 0);lcd->SetText ( m_hEnemies2, _T("") );// rep pageslcd->AddNewPage ();lcd->ModifyControlsOnPage(4);m_hRepText[0] = lcd->AddText(LG_SCROLLING_TEXT, LG_SMALL, DT_CENTER, 160);lcd->SetOrigin ( m_hRepText[0], 0, 2);m_hRepText[1] = lcd->AddText(LG_SCROLLING_TEXT, LG_SMALL, DT_CENTER, 160);lcd->SetOrigin ( m_hRepText[1], 0, 13);m_hRepText[2] = lcd->AddText(LG_SCROLLING_TEXT, LG_SMALL, DT_CENTER, 160);lcd->SetOrigin ( m_hRepText[2], 0, 24);m_hRepText[3] = lcd->AddText(LG_SCROLLING_TEXT, LG_SMALL, DT_CENTER, 160);lcd->SetOrigin ( m_hRepText[3], 0, 35);lcd->AddNewPage ();lcd->ModifyControlsOnPage(5);for ( int i = 0; i < 4; i++ ){m_hCustomText[i] = lcd->AddText ( LG_SCROLLING_TEXT_FAST, LG_SMALL, DT_CENTER, 160 );lcd->SetOrigin ( m_hCustomText[i], 0, (i + 1) * 9 );lcd->SetText ( m_hCustomText[i], L"Test" );}HANDLE customPage = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80 );lcd->SetOrigin ( customPage, 0, 0);lcd->SetText ( customPage, _T("Custom Stats") );m_hCustomPage = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 80 );lcd->SetOrigin ( m_hCustomPage, 80, 0 );lcd->AddNewPage ();lcd->ModifyControlsOnPage(6);HANDLE combatTitle = lcd->AddText ( LG_SCROLLING_TEXT_FAST, LG_MEDIUM, DT_CENTER, 126 );lcd->SetOrigin ( combatTitle, 12, 0 );lcd->SetText ( combatTitle, _T("Combat Computer") );m_hMissiles3 = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 10);lcd->SetOrigin ( m_hMissiles3, 0, 0);lcd->SetText ( m_hMissiles3, _T("") );m_hEnemies3 = lcd->AddText ( LG_STATIC_TEXT, LG_SMALL, DT_RIGHT, 20);lcd->SetOrigin ( m_hEnemies3, 140, 0);lcd->SetText ( m_hEnemies3, _T("") );// no game screenm_iTitlePage = lcd->AddNewPage () - 1;lcd->ModifyControlsOnPage ( m_iTitlePage );HANDLE icon3 = lcd->AddIcon(hIcon, 32, 32);lcd->SetOrigin(icon3, 1, 6);m_hMainText = lcd->AddText(LG_SCROLLING_TEXT_FAST, LG_BIG, DT_LEFT, 155);lcd->SetOrigin ( m_hMainText, 36, 9);lcd->SetText ( m_hMainText, _T("Reunion") );HANDLE pilotText = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 155);lcd->SetOrigin ( pilotText, 37, 25);lcd->SetText ( pilotText, _T("No Game Found") );// no game screenm_iLoadingPage = lcd->AddNewPage () - 1;lcd->ModifyControlsOnPage ( m_iLoadingPage );HANDLE icon4 = lcd->AddIcon(hIcon, 32, 32);lcd->SetOrigin ( icon4, 1, 3 );m_hMainText2 = lcd->AddText(LG_SCROLLING_TEXT_FAST, LG_BIG, DT_LEFT, 155);lcd->SetOrigin ( m_hMainText2, 36, 7);lcd->SetText ( m_hMainText2, _T("Reunion") );HANDLE loadingText = lcd->AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 155);lcd->SetOrigin ( loadingText, 37, 22);lcd->SetText ( loadingText, _T("Searching for Stats") );m_hLoadBar = lcd->AddProgressBar ( LG_CURSOR );lcd->SetProgressBarSize ( m_hLoadBar, 100, 6 );lcd->SetOrigin ( m_hLoadBar, 30, 34 );lcd->SetProgressBarPosition ( m_hLoadBar, 50 );m_iPage = m_iSplitPage = 0;}CLCDDisplay::~CLCDDisplay(){delete m_pLcd;}void CLCDDisplay::Display (){int i;// Modifying controls on the 1st pageUtils::WString name = m_pData->GetGameName();name += L": ";name += m_pData->pilot();// first stats pagem_pLcd->ModifyControlsOnPage(0);m_pLcd->SetText ( m_hStatsTitle1, name.c_str() );m_pLcd->SetText ( m_hShipsNum, Utils::WString::Number(m_pData->GetShipsNum()).c_str() );m_pLcd->SetText ( m_hStationsNum, Utils::WString::Number(m_pData->GetStations()).c_str() );m_pLcd->SetText ( m_hCredits, m_pData->credits().c_str() );m_pLcd->SetText ( m_hGameTime, m_pData->gameTime().c_str() );m_pLcd->SetText ( m_hInsurance1, Utils::WString::Number(m_pData->GetInsurance()).c_str() );// second stats pages (each ship classes)m_pLcd->ModifyControlsOnPage(1);m_pLcd->SetText(m_hStatsTitle2, name.c_str());for ( i = 0; i < MAXSHIPCLASS; i++ )m_pLcd->SetText ( m_hClasses[i], Utils::WString::Number(m_pData->GetShipClass(i)).c_str() );m_pLcd->SetText ( m_hInsurance2, Utils::WString::Number(m_pData->GetInsurance()).c_str() );// first combat page, your current ship)m_pLcd->ModifyControlsOnPage(2);m_pLcd->SetText ( m_hCombatTitle1, m_pData->myShip().c_str());m_pLcd->SetProgressBarPosition ( m_hMyHull, (float)m_pData->GetHull());m_pLcd->SetProgressBarPosition ( m_hMyShield, (float)m_pData->GetShields());m_pLcd->SetProgressBarPosition ( m_hMyWeapon, (float)m_pData->GetWeaponEnergy ());m_pLcd->SetText ( m_hMissiles, Utils::WString::Number(m_pData->GetMissiles()).c_str() );m_pLcd->SetText ( m_hEnemies, Utils::WString::Number(m_pData->GetEnemies()).c_str() );// second combat page, Your current targetm_pLcd->ModifyControlsOnPage(3);Utils::WString target = m_pData->myTarget();if ( !m_pData->targetRelation().empty() ){target += L" / ";target += m_pData->targetRelation();}m_pLcd->SetText ( m_hCombatTitle2, target.c_str());m_pLcd->SetText ( m_hSpeedText1, _T("Speed:") );m_pLcd->SetText ( m_hSpeedText2, _T("Distance:") );Utils::WString speed = Utils::WString::Number(m_pData->GetTargetSpeed()) + L" (" + Utils::WString::Number(m_pData->GetMySpeed()) + L")";m_pLcd->SetText ( m_hMySpeed, speed.c_str());m_pLcd->SetText ( m_hTargetSpeed, m_pData->GetTargetDistanceStr().c_str());m_pLcd->SetProgressBarPosition ( m_hTargetHull, (float)m_pData->GetTargetHull() );m_pLcd->SetProgressBarPosition ( m_hTargetShield, (float)m_pData->GetTargetShield() );m_pLcd->SetText ( m_hMissiles2, Utils::WString::Number(m_pData->GetMissiles()).c_str() );m_pLcd->SetText ( m_hEnemies2, Utils::WString::Number(m_pData->GetEnemies()).c_str() );// rep pagessm_pLcd->ModifyControlsOnPage(4);int done = 0;for ( i = 0; i < 4; i++ )m_pLcd->SetText ( m_hRepText[i], _T("") );for ( i = 0; i < MAXRACEREP; i++ ){SRaceRep rep = m_pData->GetRaceRep(i);if ( rep.sRace.empty() ) continue;int pos = done - (m_iSplitPage * 4);++done;if ( pos >= 4 )break;else if ( pos < 0 )continue;Utils::WString sRep = rep.sRank + L" (" + (long)rep.iRepPct + L"%)";if ( rep.bIncludeRace )sRep = rep.sRace + ": " + sRep;m_pLcd->SetText ( m_hRepText[pos], sRep.c_str());}// wait while data is lockedwhile ( m_pData->IsLocked() ) Sleep(1);m_pLcd->ModifyControlsOnPage(5);const Utils::WStringList &list = m_pData->customList();int pages = ((list.size() - 1) / 4);Utils::WString page(L"(Page: ");page += (long)(pages + 1);page += L"/";page += (long)(m_iSplitPage + 1);page += L")";m_pLcd->SetText ( m_hCustomPage, page.c_str());size_t pos = m_iSplitPage * 4;const Utils::WStringNode* pCustom = list[pos];for ( i = 0; i < 4; i++ ){if ( !pCustom )m_pLcd->SetText ( m_hCustomText[i], _T("") );else{m_pLcd->SetText ( m_hCustomText[i], pCustom->data.c_str());pCustom = list[++pos];}}m_pLcd->ModifyControlsOnPage(6);m_pLcd->SetText ( m_hMissiles2, Utils::WString::Number(m_pData->GetMissiles()).c_str());m_pLcd->SetText ( m_hEnemies2, Utils::WString::Number(m_pData->GetEnemies2()).c_str());m_pLcd->ModifyControlsOnPage(m_iTitlePage);m_pLcd->SetText(m_hMainText, m_pData->GetGameName().tokens(L" ", 2).c_str());m_pLcd->ModifyControlsOnPage(m_iLoadingPage);m_pLcd->SetText(m_hMainText2, m_pData->GetGameName().tokens(L" ", 2).c_str());}int CLCDDisplay::FindMaxRacePages(){int count = 0;for ( int i = 0; i < MAXRACEREP; i++ ){SRaceRep rep = m_pData->GetRaceRep(i);if ( rep.sRace.empty() ) continue;++count;}int pages = count / 4;if ( count % 4 ) pages++;return pages;}void CLCDDisplay::CheckButtons (){if ( m_pLcd->ButtonTriggered(LG_BUTTON_1)){if ( m_iPage == 0 )m_iPage = 1;elsem_iPage = 0;}else if ( m_pLcd->ButtonTriggered(LG_BUTTON_2)){if ( m_iPage == 2 )m_iPage = 3;else if ( m_iPage == 3 )m_iPage = 6;elsem_iPage = 2;}else if ( m_pLcd->ButtonTriggered(LG_BUTTON_3)){if ( m_iPage == 4 ){m_iSplitPage++;if ( m_iSplitPage >= FindMaxRacePages() )m_iSplitPage = 0;}elsem_iSplitPage = 0;m_iPage = 4;}else if ( m_pLcd->ButtonTriggered(LG_BUTTON_4)){const Utils::WStringList &list = m_pData->customList();if ( m_iPage == 5 ){m_iSplitPage++;if ( m_iSplitPage > ((static_cast<int>(list.size()) - 1) / 4) )m_iSplitPage = 0;}elsem_iSplitPage = 0;m_iPage = 5;}}void CLCDDisplay::UpdateDisplay(bool updated){if ( !m_bStarted )m_pLcd->SetAsForeground(TRUE);m_bStarted = true;if ( m_bWaiting )m_pLcd->ShowPage( m_iTitlePage );else if ( m_bLoading )m_pLcd->ShowPage( m_iLoadingPage );elsem_pLcd->ShowPage( m_iPage );if ( m_pCustomScreen ){if ( !m_pCustomScreen->Display () ){delete m_pCustomScreen;m_pCustomScreen = NULL;}m_pLcd->Update();return;}if ( updated ){m_iUpdateCount = 60;m_bLoading = false;m_bWaiting = false;m_pLcd->ModifyControlsOnPage ( m_iLoadingPage );m_pLcd->SetProgressBarPosition ( m_hLoadBar, 100 );if ( m_pData->customFiles().size()){Utils::WString c = m_pData->customFiles().front();Utils::WString v = m_pData->customFiles()[0]->data;const_cast<Utils::WStringList *>(&m_pData->customFiles())->popFront();m_pCustomScreen = new CLcdCustomScreen ( m_pLcd );m_pCustomScreen->loadScript ( m_pData->GetGameDirectory(), m_pData->GetProgDir(), c.c_str() );std::vector<Utils::WString> tokens;size_t max = v.tokenise(L"|", tokens);for (size_t i = 0; i < max; i++ )m_pCustomScreen->setVarible(tokens[i], i);}}else{m_pLcd->ModifyControlsOnPage ( m_iLoadingPage );m_pLcd->SetProgressBarPosition ( m_hLoadBar, (float)(200 - m_iUpdateCount) / 2 );--m_iUpdateCount;if ( m_iUpdateCount <= 0 ){if ( !m_bWaiting && !m_bLoading ){m_bLoading = true;m_iUpdateCount = 200;}else if ( m_bLoading ){m_bLoading = false;m_bWaiting = true;}m_pData->Reset();}}// Display the statsDisplay ();// check buttons are pressedCheckButtons ();// Update the LCD displaym_pLcd->Update();}Utils::WString CLCDDisplay::GetShipClassName(int i){switch (i){case CLASS_M1:return L"M1:";case CLASS_M2:return L"M2:";case CLASS_M3:return L"M3:";case CLASS_M4:return L"M4:";case CLASS_M5:return L"M5:";case CLASS_M6:return L"M6:";case CLASS_M7:return L"M7:";case CLASS_M8:return L"M8:";case CLASS_TS:return L"TS:";case CLASS_TM:return L"TM:";case CLASS_TP:return L"TP:";case CLASS_TL:return L"TL:";}return "";}