src/NPRStationXmlParser.cpp
author tahirm@symbian.org
Fri, 24 Jul 2009 08:46:02 +0100
changeset 0 0049171ecffb
permissions -rw-r--r--
initial release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
     1
/*
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
     2
 ============================================================================
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
     3
 Name	: NPRStationXmlParser.cpp
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
     4
 Author	: Symsource
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
     5
 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
     6
 Copyright (c) 2009 Symbian Foundation Ltd
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
     7
 This component and the accompanying materials are made available
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
     8
 under the terms of the License "Eclipse Public License v1.0"
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
     9
 which accompanies this distribution, and is available
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    10
 at the URL "http://www.eclipse.org/legal/epl-v10.html".
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    11
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    12
 Initial Contributors:
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    13
 - Symsource
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    14
 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    15
 Contributors:
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    16
 - Symsource
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    17
 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    18
 Description : Station xml parser
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    19
 ============================================================================
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    20
 */
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    21
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    22
#include "NPRDocument.h"
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    23
#include "NPRStationXmlParser.h"
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    24
#include "NPRStation.h"
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    25
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    26
CNPRStationXmlParser* CNPRStationXmlParser::NewLC(RPointerArray<CNPRStation>* aStationArray)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    27
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    28
	CNPRStationXmlParser* self = new (ELeave) CNPRStationXmlParser(aStationArray);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    29
	CleanupStack::PushL(self);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    30
	self->ConstructL();
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    31
	return self;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    32
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    33
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    34
CNPRStationXmlParser* CNPRStationXmlParser::NewL(RPointerArray<CNPRStation>* aStationArray)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    35
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    36
	CNPRStationXmlParser* self = CNPRStationXmlParser::NewLC(aStationArray);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    37
	CleanupStack::Pop(); // self;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    38
	return self;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    39
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    40
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    41
CNPRStationXmlParser::CNPRStationXmlParser(RPointerArray<CNPRStation>* aStationArray)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    42
:iStationArray(aStationArray)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    43
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    44
	// No implementation required
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    45
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    46
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    47
CNPRStationXmlParser::~CNPRStationXmlParser()
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    48
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    49
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    50
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    51
void CNPRStationXmlParser::ConstructL()
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    52
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    53
	iState = ENPRStationStateIdle;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    54
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    55
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    56
void CNPRStationXmlParser::OnStartDocumentL(const RDocumentParameters& /* aDocParam */, TInt aErrorCode)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    57
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    58
	User::LeaveIfError(aErrorCode);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    59
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    60
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    61
void CNPRStationXmlParser::OnEndDocumentL(TInt aErrorCode)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    62
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    63
	User::LeaveIfError(aErrorCode);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    64
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    65
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    66
HBufC* CNPRStationXmlParser::Copy8To16LC(const TDesC8& aDes)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    67
        {
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    68
        HBufC* buf16 = HBufC::NewLC(aDes.Length());
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    69
        buf16->Des().Copy(aDes);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    70
        return buf16;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    71
        }
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    72
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    73
void CNPRStationXmlParser::OnStartElementL(
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    74
		const RTagInfo& aElement, 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    75
		const RAttributeArray& aAttributes, 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    76
		TInt  aErrorCode)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    77
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    78
	User::LeaveIfError(aErrorCode);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    79
	const TDesC8& tagName = aElement.LocalName().DesC();
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    80
	if (tagName.CompareF(_L8("station"))==0)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    81
		{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    82
		iState = ENPRStationStateStation;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    83
		iCurrentStation = CNPRStation::NewL(); 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    84
		// find the story Id attribute
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    85
		TInt count = aAttributes.Count();
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    86
		for (TInt i = 0 ; i < count ; i++)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    87
			{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    88
			 const RAttribute& attribute = aAttributes[i];
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    89
			 const RTagInfo& nameInfo = attribute.Attribute();
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    90
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    91
			 const TDesC8& localName8 = nameInfo.LocalName().DesC();
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    92
			 const TDesC8& value8 = attribute.Value().DesC();
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    93
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    94
			 HBufC* localName16 = Copy8To16LC(localName8);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    95
			 HBufC* value16 = Copy8To16LC(value8);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    96
			 if (localName16->CompareF(_L("id")) == 0 )
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    97
				 {
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    98
				 TLex lex(value16->Des());
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
    99
				 TInt v = 0;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   100
				 lex.Val(v);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   101
				 iCurrentStation->SetStationId( v );
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   102
				 }
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   103
			 CleanupStack::PopAndDestroy(2); // value16 and localName16
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   104
			}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   105
		}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   106
	else if (tagName.CompareF(_L8("name"))==0 && iState == ENPRStationStateStation)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   107
			{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   108
			iState = ENPRStationStateName;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   109
			}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   110
	else if (tagName.CompareF(_L8("frequency"))==0 && iState == ENPRStationStateNameEnd)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   111
			{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   112
			iState = ENPRStationStateFrequency;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   113
			}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   114
	else if (tagName.CompareF(_L8("marketCity"))==0 && iState == ENPRStationStateFrequencyEnd)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   115
			{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   116
			iState = ENPRStationStateMarketCity;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   117
			}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   118
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   119
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   120
void CNPRStationXmlParser::OnEndElementL(const RTagInfo& aElement, TInt aErrorCode )
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   121
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   122
	User::LeaveIfError(aErrorCode);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   123
	const TDesC8& tagName = aElement.LocalName().DesC();
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   124
	if (tagName.CompareF(_L8("station"))== 0 && iState == ENPRStationStateMarketCityEnd) 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   125
		{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   126
		iState = ENPRStationStateIdle; 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   127
		iStationArray->AppendL(iCurrentStation);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   128
		iCurrentStation = NULL;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   129
		} 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   130
	else if (tagName.CompareF(_L8("name"))== 0 && iState == ENPRStationStateName)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   131
		{ 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   132
		iState = ENPRStationStateNameEnd;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   133
		} 	
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   134
	else if (tagName.CompareF(_L8("frequency"))== 0 && iState == ENPRStationStateFrequency)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   135
		{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   136
		iState = ENPRStationStateFrequencyEnd;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   137
		}	
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   138
	else if (tagName.CompareF(_L8("marketCity"))== 0 && iState == ENPRStationStateMarketCity)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   139
		{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   140
		iState = ENPRStationStateMarketCityEnd;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   141
		}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   142
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   143
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   144
void CNPRStationXmlParser::OnContentL(const TDesC8&  aBytes, TInt aErrorCode)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   145
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   146
	User::LeaveIfError(aErrorCode);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   147
	
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   148
	switch(iState)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   149
		{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   150
		case ENPRStationStateName:
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   151
			{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   152
			iCurrentStation->SetNameL(aBytes);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   153
			break;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   154
			}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   155
		case ENPRStationStateFrequency:
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   156
			{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   157
			iCurrentStation->SetFrequencyL(aBytes);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   158
			break; 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   159
			}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   160
		case ENPRStationStateMarketCity:
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   161
			{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   162
			iCurrentStation->SetMarketCityL(aBytes);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   163
			break;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   164
			}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   165
		
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   166
		default:
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   167
			iState = iState; // for debugging. 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   168
			break;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   169
		}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   170
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   171
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   172
void CNPRStationXmlParser::OnStartPrefixMappingL(
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   173
		const RString& /* aPrefix */, 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   174
		const RString& /* aUri */, 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   175
		TInt aErrorCode)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   176
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   177
	User::LeaveIfError(aErrorCode);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   178
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   179
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   180
void CNPRStationXmlParser::OnEndPrefixMappingL(const RString& /* aPrefix */, TInt aErrorCode)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   181
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   182
	User::LeaveIfError(aErrorCode);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   183
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   184
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   185
void CNPRStationXmlParser::OnIgnorableWhiteSpaceL(const TDesC8& /* aBytes */, TInt /* aErrorCode*/ )
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   186
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   187
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   188
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   189
void CNPRStationXmlParser::OnSkippedEntityL(const RString& /* aName */, TInt aErrorCode)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   190
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   191
	User::LeaveIfError(aErrorCode);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   192
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   193
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   194
void CNPRStationXmlParser::OnProcessingInstructionL(
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   195
		const TDesC8& /* aTarget */ , 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   196
		const TDesC8& /* aData */ , 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   197
		TInt aErrorCode)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   198
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   199
	User::LeaveIfError(aErrorCode);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   200
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   201
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   202
void CNPRStationXmlParser::OnError(TInt aErrorCode)
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   203
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   204
	User::LeaveIfError(aErrorCode);
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   205
	}
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   206
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   207
TAny* CNPRStationXmlParser::GetExtendedInterface(const TInt32 /* aUid */ ) 
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   208
	{
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   209
	return NULL;
0049171ecffb initial release
tahirm@symbian.org
parents:
diff changeset
   210
	}