This commit is contained in:
niko
2026-04-10 22:50:51 +02:00
parent 6d1607d5a2
commit f18d448581
17033 changed files with 2863270 additions and 0 deletions
@@ -0,0 +1,637 @@
using System;
using System.Collections.Generic;
using System.IO;
using BestHTTP.Extensions;
using BestHTTP.PlatformSupport.FileSystem;
using Cpp2IlInjected;
namespace BestHTTP.Caching
{
// Token: 0x02001FC1 RID: 8129
[Token(Token = "0x2001FC1")]
public class HTTPCacheFileInfo : IComparable<HTTPCacheFileInfo>
{
// Token: 0x170020D2 RID: 8402
// (get) Token: 0x0600CE3E RID: 52798 RVA: 0x002F7658 File Offset: 0x002F5858
// (set) Token: 0x0600CE3F RID: 52799 RVA: 0x002F766C File Offset: 0x002F586C
[Token(Token = "0x170020D2")]
internal Uri Uri
{
[Token(Token = "0x600CE3E")]
[Address(RVA = "0x3F6E20", Offset = "0x3F5C20", VA = "0x1803F6E20")]
get;
[Token(Token = "0x600CE3F")]
[Address(RVA = "0x3F7200", Offset = "0x3F6000", VA = "0x1803F7200")]
set;
}
// Token: 0x170020D3 RID: 8403
// (get) Token: 0x0600CE40 RID: 52800 RVA: 0x002F7680 File Offset: 0x002F5880
// (set) Token: 0x0600CE41 RID: 52801 RVA: 0x002F7694 File Offset: 0x002F5894
[Token(Token = "0x170020D3")]
internal DateTime LastAccess
{
[Token(Token = "0x600CE40")]
[Address(RVA = "0x3F5F40", Offset = "0x3F4D40", VA = "0x1803F5F40")]
get;
[Token(Token = "0x600CE41")]
[Address(RVA = "0x3F7210", Offset = "0x3F6010", VA = "0x1803F7210")]
set;
}
// Token: 0x170020D4 RID: 8404
// (get) Token: 0x0600CE42 RID: 52802 RVA: 0x002F76A8 File Offset: 0x002F58A8
// (set) Token: 0x0600CE43 RID: 52803 RVA: 0x002F76BC File Offset: 0x002F58BC
[Token(Token = "0x170020D4")]
public int BodyLength
{
[Token(Token = "0x600CE42")]
[Address(RVA = "0x3F7310", Offset = "0x3F6110", VA = "0x1803F7310")]
get;
[Token(Token = "0x600CE43")]
[Address(RVA = "0x420360", Offset = "0x41F160", VA = "0x180420360")]
set;
}
// Token: 0x170020D5 RID: 8405
// (get) Token: 0x0600CE44 RID: 52804 RVA: 0x002F76D0 File Offset: 0x002F58D0
// (set) Token: 0x0600CE45 RID: 52805 RVA: 0x002F76E4 File Offset: 0x002F58E4
[Token(Token = "0x170020D5")]
private string ETag
{
[Token(Token = "0x600CE44")]
[Address(RVA = "0x3F63E0", Offset = "0x3F51E0", VA = "0x1803F63E0")]
get;
[Token(Token = "0x600CE45")]
[Address(RVA = "0x409C60", Offset = "0x408A60", VA = "0x180409C60")]
set;
}
// Token: 0x170020D6 RID: 8406
// (get) Token: 0x0600CE46 RID: 52806 RVA: 0x002F76F8 File Offset: 0x002F58F8
// (set) Token: 0x0600CE47 RID: 52807 RVA: 0x002F770C File Offset: 0x002F590C
[Token(Token = "0x170020D6")]
private string LastModified
{
[Token(Token = "0x600CE46")]
[Address(RVA = "0x3FA180", Offset = "0x3F8F80", VA = "0x1803FA180")]
get;
[Token(Token = "0x600CE47")]
[Address(RVA = "0x4437E0", Offset = "0x4425E0", VA = "0x1804437E0")]
set;
}
// Token: 0x170020D7 RID: 8407
// (get) Token: 0x0600CE48 RID: 52808 RVA: 0x002F7720 File Offset: 0x002F5920
// (set) Token: 0x0600CE49 RID: 52809 RVA: 0x002F7734 File Offset: 0x002F5934
[Token(Token = "0x170020D7")]
private DateTime Expires
{
[Token(Token = "0x600CE48")]
[Address(RVA = "0x3F63D0", Offset = "0x3F51D0", VA = "0x1803F63D0")]
get;
[Token(Token = "0x600CE49")]
[Address(RVA = "0x5329E0", Offset = "0x5317E0", VA = "0x1805329E0")]
set;
}
// Token: 0x170020D8 RID: 8408
// (get) Token: 0x0600CE4A RID: 52810 RVA: 0x002F7748 File Offset: 0x002F5948
// (set) Token: 0x0600CE4B RID: 52811 RVA: 0x002F775C File Offset: 0x002F595C
[Token(Token = "0x170020D8")]
private long Age
{
[Token(Token = "0x600CE4A")]
[Address(RVA = "0x408890", Offset = "0x407690", VA = "0x180408890")]
get;
[Token(Token = "0x600CE4B")]
[Address(RVA = "0x403B30", Offset = "0x402930", VA = "0x180403B30")]
set;
}
// Token: 0x170020D9 RID: 8409
// (get) Token: 0x0600CE4C RID: 52812 RVA: 0x002F7770 File Offset: 0x002F5970
// (set) Token: 0x0600CE4D RID: 52813 RVA: 0x002F7784 File Offset: 0x002F5984
[Token(Token = "0x170020D9")]
private long MaxAge
{
[Token(Token = "0x600CE4C")]
[Address(RVA = "0x3FA170", Offset = "0x3F8F70", VA = "0x1803FA170")]
get;
[Token(Token = "0x600CE4D")]
[Address(RVA = "0x46AA50", Offset = "0x469850", VA = "0x18046AA50")]
set;
}
// Token: 0x170020DA RID: 8410
// (get) Token: 0x0600CE4E RID: 52814 RVA: 0x002F7798 File Offset: 0x002F5998
// (set) Token: 0x0600CE4F RID: 52815 RVA: 0x002F77AC File Offset: 0x002F59AC
[Token(Token = "0x170020DA")]
private DateTime Date
{
[Token(Token = "0x600CE4E")]
[Address(RVA = "0x415290", Offset = "0x414090", VA = "0x180415290")]
get;
[Token(Token = "0x600CE4F")]
[Address(RVA = "0x46AB00", Offset = "0x469900", VA = "0x18046AB00")]
set;
}
// Token: 0x170020DB RID: 8411
// (get) Token: 0x0600CE50 RID: 52816 RVA: 0x002F77C0 File Offset: 0x002F59C0
// (set) Token: 0x0600CE51 RID: 52817 RVA: 0x002F77D4 File Offset: 0x002F59D4
[Token(Token = "0x170020DB")]
private bool MustRevalidate
{
[Token(Token = "0x600CE50")]
[Address(RVA = "0x40FFA0", Offset = "0x40EDA0", VA = "0x18040FFA0")]
get;
[Token(Token = "0x600CE51")]
[Address(RVA = "0x410010", Offset = "0x40EE10", VA = "0x180410010")]
set;
}
// Token: 0x170020DC RID: 8412
// (get) Token: 0x0600CE52 RID: 52818 RVA: 0x002F77E8 File Offset: 0x002F59E8
// (set) Token: 0x0600CE53 RID: 52819 RVA: 0x002F77FC File Offset: 0x002F59FC
[Token(Token = "0x170020DC")]
private DateTime Received
{
[Token(Token = "0x600CE52")]
[Address(RVA = "0x423DE0", Offset = "0x422BE0", VA = "0x180423DE0")]
get;
[Token(Token = "0x600CE53")]
[Address(RVA = "0x567490", Offset = "0x566290", VA = "0x180567490")]
set;
}
// Token: 0x170020DD RID: 8413
// (get) Token: 0x0600CE54 RID: 52820 RVA: 0x002F7810 File Offset: 0x002F5A10
// (set) Token: 0x0600CE55 RID: 52821 RVA: 0x002F7824 File Offset: 0x002F5A24
[Token(Token = "0x170020DD")]
private string ConstructedPath
{
[Token(Token = "0x600CE54")]
[Address(RVA = "0x423E10", Offset = "0x422C10", VA = "0x180423E10")]
get;
[Token(Token = "0x600CE55")]
[Address(RVA = "0x687270", Offset = "0x686070", VA = "0x180687270")]
set;
}
// Token: 0x170020DE RID: 8414
// (get) Token: 0x0600CE56 RID: 52822 RVA: 0x002F7838 File Offset: 0x002F5A38
// (set) Token: 0x0600CE57 RID: 52823 RVA: 0x002F784C File Offset: 0x002F5A4C
[Token(Token = "0x170020DE")]
internal ulong MappedNameIDX
{
[Token(Token = "0x600CE56")]
[Address(RVA = "0x4335D0", Offset = "0x4323D0", VA = "0x1804335D0")]
get;
[Token(Token = "0x600CE57")]
[Address(RVA = "0x703580", Offset = "0x702380", VA = "0x180703580")]
set;
}
// Token: 0x0600CE58 RID: 52824 RVA: 0x002F7860 File Offset: 0x002F5A60
[Token(Token = "0x600CE58")]
[Address(RVA = "0xAA4B80", Offset = "0xAA3980", VA = "0x180AA4B80")]
internal HTTPCacheFileInfo(Uri uri)
{
DateTime utcNow = DateTime.UtcNow;
}
// Token: 0x0600CE59 RID: 52825 RVA: 0x002F7878 File Offset: 0x002F5A78
[Token(Token = "0x600CE59")]
[Address(RVA = "0xAA4C00", Offset = "0xAA3A00", VA = "0x180AA4C00")]
internal HTTPCacheFileInfo(Uri uri, DateTime lastAcces, int bodyLength)
{
this.Uri = uri;
this.LastAccess = lastAcces;
this.BodyLength = bodyLength;
this.MaxAge = (long)((ulong)(-1L));
ulong nameIdx = HTTPCacheService.GetNameIdx();
this.MappedNameIDX = nameIdx;
}
// Token: 0x0600CE5A RID: 52826 RVA: 0x002F78B8 File Offset: 0x002F5AB8
[Token(Token = "0x600CE5A")]
[Address(RVA = "0xAA49A0", Offset = "0xAA37A0", VA = "0x180AA49A0")]
internal HTTPCacheFileInfo(Uri uri, BinaryReader reader, int version)
{
this.Uri = uri;
DateTime dateTime = DateTime.FromBinary((long)reader.ReadUInt32());
this.LastAccess = dateTime;
ushort num = reader.ReadUInt16();
this.BodyLength = (int)num;
if (version != 1)
{
if (version != 2)
{
return;
}
long num2 = reader.ReadInt64();
this.MappedNameIDX = (ulong)num2;
}
decimal num3 = reader.ReadDecimal();
this.ETag = num3;
decimal num4 = reader.ReadDecimal();
this.LastModified = num4;
DateTime dateTime2 = DateTime.FromBinary((long)reader.ReadUInt32());
this.Expires = dateTime2;
uint num5 = reader.ReadUInt32();
this.Age = (long)num5;
uint num6 = reader.ReadUInt32();
this.MaxAge = (long)num6;
DateTime dateTime3 = DateTime.FromBinary((long)reader.ReadUInt32());
this.Date = dateTime3;
int num7 = reader.Read();
this.MustRevalidate = num7 != 0;
DateTime dateTime4 = DateTime.FromBinary((long)reader.ReadUInt32());
this.Received = dateTime4;
}
// Token: 0x0600CE5B RID: 52827 RVA: 0x002F79A0 File Offset: 0x002F5BA0
[Token(Token = "0x600CE5B")]
[Address(RVA = "0xAA3D60", Offset = "0xAA2B60", VA = "0x180AA3D60")]
internal void SaveTo(BinaryWriter writer)
{
DateTime dateTime = this.<LastAccess>k__BackingField;
long num;
writer.Write((uint)num);
int num2 = this.<BodyLength>k__BackingField;
writer.Write((ushort)num2);
ulong num3 = this.<MappedNameIDX>k__BackingField;
writer.Write((long)num3);
string text = this.<ETag>k__BackingField;
writer.Write(text);
string text2 = this.<LastModified>k__BackingField;
writer.Write(text2);
DateTime dateTime2 = this.<Expires>k__BackingField;
long num4;
writer.Write((uint)num4);
long num5 = this.<Age>k__BackingField;
writer.Write((uint)num5);
long num6 = this.<MaxAge>k__BackingField;
writer.Write((uint)num6);
DateTime dateTime3 = this.<Date>k__BackingField;
long num7;
writer.Write((uint)num7);
writer.Flush();
DateTime dateTime4 = this.<Received>k__BackingField;
long num8;
writer.Write((uint)num8);
}
// Token: 0x0600CE5C RID: 52828 RVA: 0x002F7A54 File Offset: 0x002F5C54
[Token(Token = "0x600CE5C")]
[Address(RVA = "0xAA31E0", Offset = "0xAA1FE0", VA = "0x180AA31E0")]
public string GetPath()
{
string text = this.<ConstructedPath>k__BackingField;
if (text == 0)
{
string <CacheFolder>k__BackingField = HTTPCacheService.<CacheFolder>k__BackingField;
ulong num = this.<MappedNameIDX>k__BackingField;
string text3;
string text2 = Path.Combine(<CacheFolder>k__BackingField, text3);
this.<ConstructedPath>k__BackingField = text2;
}
return text;
}
// Token: 0x0600CE5D RID: 52829 RVA: 0x002F7A8C File Offset: 0x002F5C8C
[Token(Token = "0x600CE5D")]
[Address(RVA = "0xAA39F0", Offset = "0xAA27F0", VA = "0x180AA39F0")]
public bool IsExists()
{
if (HTTPCacheService.IsSupported)
{
IIOService ioservice = HTTPManager.IOService;
string path = this.GetPath();
}
throw new NullReferenceException();
}
// Token: 0x0600CE5E RID: 52830 RVA: 0x002F7AB8 File Offset: 0x002F5CB8
[Token(Token = "0x600CE5E")]
[Address(RVA = "0xAA2ED0", Offset = "0xAA1CD0", VA = "0x180AA2ED0")]
internal void Delete()
{
int num;
do
{
num = 0;
if (!HTTPCacheService.IsSupported)
{
break;
}
string path = this.GetPath();
IIOService ioservice = HTTPManager.IOService;
this.<BodyLength>k__BackingField = (int)((ulong)4294967295L);
string empty = string.Empty;
this.<ETag>k__BackingField = empty;
DateTime dateTime = DateTime.FromBinary(0L);
this.<Expires>k__BackingField = dateTime;
string empty2 = string.Empty;
this.<LastModified>k__BackingField = empty2;
this.<Age>k__BackingField = (long)((ulong)0L);
this.<MaxAge>k__BackingField = (long)((ulong)(-1L));
DateTime dateTime2 = DateTime.FromBinary(0L);
this.<Date>k__BackingField = dateTime2;
this.<MustRevalidate>k__BackingField = false;
DateTime dateTime3 = DateTime.FromBinary(0L);
this.<Received>k__BackingField = dateTime3;
}
while (num != 0);
}
// Token: 0x0600CE5F RID: 52831 RVA: 0x002F7B68 File Offset: 0x002F5D68
[Token(Token = "0x600CE5F")]
[Address(RVA = "0xAA3CA0", Offset = "0xAA2AA0", VA = "0x180AA3CA0")]
private void Reset()
{
this.<BodyLength>k__BackingField = (int)((ulong)4294967295L);
string empty = string.Empty;
this.<ETag>k__BackingField = empty;
DateTime dateTime = DateTime.FromBinary(0L);
this.<Expires>k__BackingField = dateTime;
string empty2 = string.Empty;
int num = 0;
this.<LastModified>k__BackingField = empty2;
this.<Age>k__BackingField = (long)((ulong)0L);
this.<MaxAge>k__BackingField = (long)((ulong)(-1L));
DateTime dateTime2 = DateTime.FromBinary((long)num);
this.<Date>k__BackingField = dateTime2;
int num2 = 0;
this.<MustRevalidate>k__BackingField = false;
DateTime dateTime3 = DateTime.FromBinary((long)num2);
this.<Received>k__BackingField = dateTime3;
}
// Token: 0x0600CE60 RID: 52832 RVA: 0x002F7BEC File Offset: 0x002F5DEC
[Token(Token = "0x600CE60")]
[Address(RVA = "0xAA3EE0", Offset = "0xAA2CE0", VA = "0x180AA3EE0")]
private void SetUpCachingValues(HTTPResponse response)
{
response.<CacheFileInfo>k__BackingField = this;
string text = response.GetFirstHeaderValue("ETag").ToStrOrEmpty();
this.<ETag>k__BackingField = text;
string firstHeaderValue = response.GetFirstHeaderValue("Expires");
DateTime dateTime = DateTime.FromBinary(0L);
DateTime dateTime2 = firstHeaderValue.ToDateTime(dateTime);
this.<Expires>k__BackingField = dateTime2;
string text2 = response.GetFirstHeaderValue("Last-Modified").ToStrOrEmpty();
this.<LastModified>k__BackingField = text2;
string firstHeaderValue2 = response.GetFirstHeaderValue("Age");
int num = 0;
long num2 = firstHeaderValue2.ToInt64((long)num);
this.<Age>k__BackingField = num2;
string firstHeaderValue3 = response.GetFirstHeaderValue("Date");
DateTime dateTime3 = DateTime.FromBinary(0L);
DateTime dateTime4 = firstHeaderValue3.ToDateTime(dateTime3);
this.<Date>k__BackingField = dateTime4;
string firstHeaderValue4 = response.GetFirstHeaderValue("cache-control");
if (!string.IsNullOrEmpty(firstHeaderValue4))
{
string[] array = firstHeaderValue4.FindOption("max-age");
if (array != 0)
{
string text3 = array[1];
bool flag;
if (flag)
{
this.<MaxAge>k__BackingField = (flag ? 1L : 0L);
}
}
bool flag2 = firstHeaderValue4.ToLower().Contains("must-revalidate");
this.<MustRevalidate>k__BackingField = flag2;
}
DateTime utcNow = DateTime.UtcNow;
this.<Received>k__BackingField = utcNow;
}
// Token: 0x0600CE61 RID: 52833 RVA: 0x002F7D14 File Offset: 0x002F5F14
[Token(Token = "0x600CE61")]
[Address(RVA = "0xAA4820", Offset = "0xAA3620", VA = "0x180AA4820")]
internal bool WillExpireInTheFuture()
{
if (this.IsExists() && !this.<MustRevalidate>k__BackingField)
{
DateTime dateTime = this.<Expires>k__BackingField;
DateTime utcNow = DateTime.UtcNow;
return dateTime > utcNow;
}
}
// Token: 0x0600CE62 RID: 52834 RVA: 0x002F7DBC File Offset: 0x002F5FBC
[Token(Token = "0x600CE62")]
[Address(RVA = "0xAA4150", Offset = "0xAA2F50", VA = "0x180AA4150")]
internal void SetUpRevalidationHeaders(HTTPRequest request)
{
bool flag = this.IsExists();
if (flag)
{
string text = this.<ETag>k__BackingField;
if (!flag)
{
string text2 = this.<ETag>k__BackingField;
request.SetHeader("If-None-Match", text2);
}
string text3 = this.<LastModified>k__BackingField;
if (!flag)
{
string text4 = this.<LastModified>k__BackingField;
request.SetHeader("If-Modified-Since", text4);
}
}
}
// Token: 0x0600CE63 RID: 52835 RVA: 0x002F7E18 File Offset: 0x002F6018
[Token(Token = "0x600CE63")]
[Address(RVA = "0xAA30B0", Offset = "0xAA1EB0", VA = "0x180AA30B0")]
public Stream GetBodyStream(out int length)
{
if (this.IsExists())
{
int num = this.<BodyLength>k__BackingField;
length.m_value = num;
DateTime utcNow = DateTime.UtcNow;
this.<LastAccess>k__BackingField = utcNow;
IIOService ioservice = HTTPManager.IOService;
string path = this.GetPath();
}
throw new NullReferenceException();
}
// Token: 0x0600CE64 RID: 52836 RVA: 0x002F7E64 File Offset: 0x002F6064
[Token(Token = "0x600CE64")]
[Address(RVA = "0xAA3AC0", Offset = "0xAA28C0", VA = "0x180AA3AC0")]
internal HTTPResponse ReadResponseTo(HTTPRequest request)
{
int num;
do
{
num = 0;
if (!this.IsExists())
{
break;
}
DateTime utcNow = DateTime.UtcNow;
this.<LastAccess>k__BackingField = utcNow;
IIOService ioservice = HTTPManager.IOService;
string path = this.GetPath();
HTTPResponse httpresponse;
httpresponse.<CacheFileInfo>k__BackingField = this;
httpresponse.Dispose();
if (path != 0)
{
}
}
while (num != 0);
throw new NullReferenceException();
}
// Token: 0x0600CE65 RID: 52837 RVA: 0x002F7EC0 File Offset: 0x002F60C0
[Token(Token = "0x600CE65")]
[Address(RVA = "0xAA41F0", Offset = "0xAA2FF0", VA = "0x180AA41F0")]
internal void Store(HTTPResponse response)
{
for (;;)
{
int num = 0;
if (!HTTPCacheService.IsSupported)
{
return;
}
int num2 = this.GetPath().m_stringLength;
IIOService ioservice = HTTPManager.IOService;
this.Delete();
IIOService ioservice2 = HTTPManager.IOService;
string path = this.GetPath();
object[] array = new object[2];
int <StatusCode>k__BackingField = response.<StatusCode>k__BackingField;
num2 = <StatusCode>k__BackingField;
if (<StatusCode>k__BackingField != 0)
{
}
array[0] = num2;
string <Message>k__BackingField = response.<Message>k__BackingField;
if (<Message>k__BackingField != 0)
{
}
array[1] = <Message>k__BackingField;
Dictionary<string, List<string>> <Headers>k__BackingField = response.<Headers>k__BackingField;
bool flag;
int num3;
if (flag)
{
if (num < this.<LastAccess>k__BackingField)
{
break;
}
num3 = 0;
}
if (num3 != 0)
{
goto IL_116;
}
if (num3 != -1)
{
}
byte[] <Data>k__BackingField = response.<Data>k__BackingField;
if (path != 0)
{
}
if (num3 == 0)
{
goto Block_4;
}
}
object[] array2 = new object[2];
throw new ArrayTypeMismatchException();
Block_4:
int length = response.<Data>k__BackingField.Length;
DateTime utcNow = DateTime.UtcNow;
return;
IL_116:
throw new NullReferenceException();
}
// Token: 0x0600CE66 RID: 52838 RVA: 0x002F8008 File Offset: 0x002F6208
[Token(Token = "0x600CE66")]
[Address(RVA = "0xAA3300", Offset = "0xAA2100", VA = "0x180AA3300")]
internal Stream GetSaveStream(HTTPResponse response)
{
for (;;)
{
int num = 0;
if (!HTTPCacheService.IsSupported)
{
goto IL_EA;
}
DateTime utcNow = DateTime.UtcNow;
this.<LastAccess>k__BackingField = utcNow;
string path = this.GetPath();
IIOService ioservice = HTTPManager.IOService;
if (path != 0)
{
this.Delete();
}
int stringLength = path.m_stringLength;
IIOService ioservice2 = HTTPManager.IOService;
string path2 = this.GetPath();
object[] array = new object[2];
int <StatusCode>k__BackingField = response.<StatusCode>k__BackingField;
if (<StatusCode>k__BackingField != 0)
{
}
array[0] = <StatusCode>k__BackingField;
string <Message>k__BackingField = response.<Message>k__BackingField;
if (<Message>k__BackingField != 0)
{
}
array[1] = <Message>k__BackingField;
Dictionary<string, List<string>> <Headers>k__BackingField = response.<Headers>k__BackingField;
bool flag;
if (flag)
{
break;
}
if (num != 0)
{
goto IL_11D;
}
if (num != -1)
{
}
if (path2 != 0)
{
}
if (num == 0)
{
goto Block_4;
}
}
object[] array2 = new object[2];
throw new ArrayTypeMismatchException();
Block_4:
throw new NullReferenceException();
IL_EA:
throw new ArrayTypeMismatchException();
IL_11D:
throw new NullReferenceException();
}
// Token: 0x0600CE67 RID: 52839 RVA: 0x002F8144 File Offset: 0x002F6344
[Token(Token = "0x600CE67")]
[Address(RVA = "0xAA2EA0", Offset = "0xAA1CA0", VA = "0x180AA2EA0", Slot = "4")]
public int CompareTo(HTTPCacheFileInfo other)
{
DateTime dateTime = this.<LastAccess>k__BackingField;
DateTime dateTime2 = other.<LastAccess>k__BackingField;
int num;
return num;
}
}
}