Decompiled source of TrophyHuntMod v0.9.14

plugins/Newtonsoft.Json.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Data.SqlTypes;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Dynamic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Numerics;
using System.Reflection;
using System.Reflection.Emit;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json.Bson;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Linq.JsonPath;
using Newtonsoft.Json.Schema;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Utilities;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AllowPartiallyTrustedCallers]
[assembly: InternalsVisibleTo("Newtonsoft.Json.Schema, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")]
[assembly: InternalsVisibleTo("Newtonsoft.Json.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")]
[assembly: InternalsVisibleTo("Newtonsoft.Json.Dynamic, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cbd8d53b9d7de30f1f1278f636ec462cf9c254991291e66ebb157a885638a517887633b898ccbcf0d5c5ff7be85a6abe9e765d0ac7cd33c68dac67e7e64530e8222101109f154ab14a941c490ac155cd1d4fcba0fabb49016b4ef28593b015cab5937da31172f03f67d09edda404b88a60023f062ae71d0b2e4438b74cc11dc9")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("9ca358aa-317b-4925-8ada-4a29e943a363")]
[assembly: CLSCompliant(true)]
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
[assembly: AssemblyCompany("Newtonsoft")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("Copyright © James Newton-King 2008")]
[assembly: AssemblyDescription("Json.NET is a popular high-performance JSON framework for .NET")]
[assembly: AssemblyFileVersion("13.0.3.27908")]
[assembly: AssemblyInformationalVersion("13.0.3+0a2e291c0d9c0c7675d445703e51750363a549ef")]
[assembly: AssemblyProduct("Json.NET")]
[assembly: AssemblyTitle("Json.NET .NET 4.5")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/JamesNK/Newtonsoft.Json")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: AssemblyVersion("13.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class IsReadOnlyAttribute : Attribute
	{
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace System.Diagnostics.CodeAnalysis
{
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true)]
	internal sealed class NotNullAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
	internal sealed class NotNullWhenAttribute : Attribute
	{
		public bool ReturnValue { get; }

		public NotNullWhenAttribute(bool returnValue)
		{
			ReturnValue = returnValue;
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)]
	internal sealed class MaybeNullAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)]
	internal sealed class AllowNullAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
	internal class DoesNotReturnIfAttribute : Attribute
	{
		public bool ParameterValue { get; }

		public DoesNotReturnIfAttribute(bool parameterValue)
		{
			ParameterValue = parameterValue;
		}
	}
}
namespace Newtonsoft.Json
{
	public enum ConstructorHandling
	{
		Default,
		AllowNonPublicDefaultConstructor
	}
	public enum DateFormatHandling
	{
		IsoDateFormat,
		MicrosoftDateFormat
	}
	public enum DateParseHandling
	{
		None,
		DateTime,
		DateTimeOffset
	}
	public enum DateTimeZoneHandling
	{
		Local,
		Utc,
		Unspecified,
		RoundtripKind
	}
	public class DefaultJsonNameTable : JsonNameTable
	{
		private class Entry
		{
			internal readonly string Value;

			internal readonly int HashCode;

			internal Entry Next;

			internal Entry(string value, int hashCode, Entry next)
			{
				Value = value;
				HashCode = hashCode;
				Next = next;
			}
		}

		private static readonly int HashCodeRandomizer;

		private int _count;

		private Entry[] _entries;

		private int _mask = 31;

		static DefaultJsonNameTable()
		{
			HashCodeRandomizer = Environment.TickCount;
		}

		public DefaultJsonNameTable()
		{
			_entries = new Entry[_mask + 1];
		}

		public override string? Get(char[] key, int start, int length)
		{
			if (length == 0)
			{
				return string.Empty;
			}
			int num = length + HashCodeRandomizer;
			num += (num << 7) ^ key[start];
			int num2 = start + length;
			for (int i = start + 1; i < num2; i++)
			{
				num += (num << 7) ^ key[i];
			}
			num -= num >> 17;
			num -= num >> 11;
			num -= num >> 5;
			int num3 = Volatile.Read(ref _mask);
			int num4 = num & num3;
			for (Entry entry = _entries[num4]; entry != null; entry = entry.Next)
			{
				if (entry.HashCode == num && TextEquals(entry.Value, key, start, length))
				{
					return entry.Value;
				}
			}
			return null;
		}

		public string Add(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			int length = key.Length;
			if (length == 0)
			{
				return string.Empty;
			}
			int num = length + HashCodeRandomizer;
			for (int i = 0; i < key.Length; i++)
			{
				num += (num << 7) ^ key[i];
			}
			num -= num >> 17;
			num -= num >> 11;
			num -= num >> 5;
			for (Entry entry = _entries[num & _mask]; entry != null; entry = entry.Next)
			{
				if (entry.HashCode == num && entry.Value.Equals(key, StringComparison.Ordinal))
				{
					return entry.Value;
				}
			}
			return AddEntry(key, num);
		}

		private string AddEntry(string str, int hashCode)
		{
			int num = hashCode & _mask;
			Entry entry = new Entry(str, hashCode, _entries[num]);
			_entries[num] = entry;
			if (_count++ == _mask)
			{
				Grow();
			}
			return entry.Value;
		}

		private void Grow()
		{
			Entry[] entries = _entries;
			int num = _mask * 2 + 1;
			Entry[] array = new Entry[num + 1];
			for (int i = 0; i < entries.Length; i++)
			{
				Entry entry = entries[i];
				while (entry != null)
				{
					int num2 = entry.HashCode & num;
					Entry next = entry.Next;
					entry.Next = array[num2];
					array[num2] = entry;
					entry = next;
				}
			}
			_entries = array;
			Volatile.Write(ref _mask, num);
		}

		private static bool TextEquals(string str1, char[] str2, int str2Start, int str2Length)
		{
			if (str1.Length != str2Length)
			{
				return false;
			}
			for (int i = 0; i < str1.Length; i++)
			{
				if (str1[i] != str2[str2Start + i])
				{
					return false;
				}
			}
			return true;
		}
	}
	[Flags]
	public enum DefaultValueHandling
	{
		Include = 0,
		Ignore = 1,
		Populate = 2,
		IgnoreAndPopulate = 3
	}
	public enum FloatFormatHandling
	{
		String,
		Symbol,
		DefaultValue
	}
	public enum FloatParseHandling
	{
		Double,
		Decimal
	}
	public enum Formatting
	{
		None,
		Indented
	}
	public interface IArrayPool<T>
	{
		T[] Rent(int minimumLength);

		void Return(T[]? array);
	}
	public interface IJsonLineInfo
	{
		int LineNumber { get; }

		int LinePosition { get; }

		bool HasLineInfo();
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)]
	public sealed class JsonArrayAttribute : JsonContainerAttribute
	{
		private bool _allowNullItems;

		public bool AllowNullItems
		{
			get
			{
				return _allowNullItems;
			}
			set
			{
				_allowNullItems = value;
			}
		}

		public JsonArrayAttribute()
		{
		}

		public JsonArrayAttribute(bool allowNullItems)
		{
			_allowNullItems = allowNullItems;
		}

		public JsonArrayAttribute(string id)
			: base(id)
		{
		}
	}
	[AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false)]
	public sealed class JsonConstructorAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)]
	public abstract class JsonContainerAttribute : Attribute
	{
		internal bool? _isReference;

		internal bool? _itemIsReference;

		internal ReferenceLoopHandling? _itemReferenceLoopHandling;

		internal TypeNameHandling? _itemTypeNameHandling;

		private Type? _namingStrategyType;

		private object[]? _namingStrategyParameters;

		public string? Id { get; set; }

		public string? Title { get; set; }

		public string? Description { get; set; }

		public Type? ItemConverterType { get; set; }

		public object[]? ItemConverterParameters { get; set; }

		public Type? NamingStrategyType
		{
			get
			{
				return _namingStrategyType;
			}
			set
			{
				_namingStrategyType = value;
				NamingStrategyInstance = null;
			}
		}

		public object[]? NamingStrategyParameters
		{
			get
			{
				return _namingStrategyParameters;
			}
			set
			{
				_namingStrategyParameters = value;
				NamingStrategyInstance = null;
			}
		}

		internal NamingStrategy? NamingStrategyInstance { get; set; }

		public bool IsReference
		{
			get
			{
				return _isReference.GetValueOrDefault();
			}
			set
			{
				_isReference = value;
			}
		}

		public bool ItemIsReference
		{
			get
			{
				return _itemIsReference.GetValueOrDefault();
			}
			set
			{
				_itemIsReference = value;
			}
		}

		public ReferenceLoopHandling ItemReferenceLoopHandling
		{
			get
			{
				return _itemReferenceLoopHandling.GetValueOrDefault();
			}
			set
			{
				_itemReferenceLoopHandling = value;
			}
		}

		public TypeNameHandling ItemTypeNameHandling
		{
			get
			{
				return _itemTypeNameHandling.GetValueOrDefault();
			}
			set
			{
				_itemTypeNameHandling = value;
			}
		}

		protected JsonContainerAttribute()
		{
		}

		protected JsonContainerAttribute(string id)
		{
			Id = id;
		}
	}
	public static class JsonConvert
	{
		public static readonly string True = "true";

		public static readonly string False = "false";

		public static readonly string Null = "null";

		public static readonly string Undefined = "undefined";

		public static readonly string PositiveInfinity = "Infinity";

		public static readonly string NegativeInfinity = "-Infinity";

		public static readonly string NaN = "NaN";

		public static Func<JsonSerializerSettings>? DefaultSettings { get; set; }

		public static string ToString(DateTime value)
		{
			return ToString(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind);
		}

		public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling)
		{
			DateTime value2 = DateTimeUtils.EnsureDateTime(value, timeZoneHandling);
			using StringWriter stringWriter = StringUtils.CreateStringWriter(64);
			stringWriter.Write('"');
			DateTimeUtils.WriteDateTimeString(stringWriter, value2, format, null, CultureInfo.InvariantCulture);
			stringWriter.Write('"');
			return stringWriter.ToString();
		}

		public static string ToString(DateTimeOffset value)
		{
			return ToString(value, DateFormatHandling.IsoDateFormat);
		}

		public static string ToString(DateTimeOffset value, DateFormatHandling format)
		{
			using StringWriter stringWriter = StringUtils.CreateStringWriter(64);
			stringWriter.Write('"');
			DateTimeUtils.WriteDateTimeOffsetString(stringWriter, value, format, null, CultureInfo.InvariantCulture);
			stringWriter.Write('"');
			return stringWriter.ToString();
		}

		public static string ToString(bool value)
		{
			if (!value)
			{
				return False;
			}
			return True;
		}

		public static string ToString(char value)
		{
			return ToString(char.ToString(value));
		}

		public static string ToString(Enum value)
		{
			return value.ToString("D");
		}

		public static string ToString(int value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		public static string ToString(short value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		[CLSCompliant(false)]
		public static string ToString(ushort value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		[CLSCompliant(false)]
		public static string ToString(uint value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		public static string ToString(long value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		private static string ToStringInternal(BigInteger value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		[CLSCompliant(false)]
		public static string ToString(ulong value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		public static string ToString(float value)
		{
			return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture));
		}

		internal static string ToString(float value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable)
		{
			return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable);
		}

		private static string EnsureFloatFormat(double value, string text, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable)
		{
			if (floatFormatHandling == FloatFormatHandling.Symbol || (!double.IsInfinity(value) && !double.IsNaN(value)))
			{
				return text;
			}
			if (floatFormatHandling == FloatFormatHandling.DefaultValue)
			{
				if (nullable)
				{
					return Null;
				}
				return "0.0";
			}
			return quoteChar + text + quoteChar;
		}

		public static string ToString(double value)
		{
			return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture));
		}

		internal static string ToString(double value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable)
		{
			return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable);
		}

		private static string EnsureDecimalPlace(double value, string text)
		{
			if (double.IsNaN(value) || double.IsInfinity(value) || StringUtils.IndexOf(text, '.') != -1 || StringUtils.IndexOf(text, 'E') != -1 || StringUtils.IndexOf(text, 'e') != -1)
			{
				return text;
			}
			return text + ".0";
		}

		private static string EnsureDecimalPlace(string text)
		{
			if (StringUtils.IndexOf(text, '.') != -1)
			{
				return text;
			}
			return text + ".0";
		}

		public static string ToString(byte value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		[CLSCompliant(false)]
		public static string ToString(sbyte value)
		{
			return value.ToString(null, CultureInfo.InvariantCulture);
		}

		public static string ToString(decimal value)
		{
			return EnsureDecimalPlace(value.ToString(null, CultureInfo.InvariantCulture));
		}

		public static string ToString(Guid value)
		{
			return ToString(value, '"');
		}

		internal static string ToString(Guid value, char quoteChar)
		{
			string text = value.ToString("D", CultureInfo.InvariantCulture);
			string text2 = quoteChar.ToString(CultureInfo.InvariantCulture);
			return text2 + text + text2;
		}

		public static string ToString(TimeSpan value)
		{
			return ToString(value, '"');
		}

		internal static string ToString(TimeSpan value, char quoteChar)
		{
			return ToString(value.ToString(), quoteChar);
		}

		public static string ToString(Uri? value)
		{
			if (value == null)
			{
				return Null;
			}
			return ToString(value, '"');
		}

		internal static string ToString(Uri value, char quoteChar)
		{
			return ToString(value.OriginalString, quoteChar);
		}

		public static string ToString(string? value)
		{
			return ToString(value, '"');
		}

		public static string ToString(string? value, char delimiter)
		{
			return ToString(value, delimiter, StringEscapeHandling.Default);
		}

		public static string ToString(string? value, char delimiter, StringEscapeHandling stringEscapeHandling)
		{
			if (delimiter != '"' && delimiter != '\'')
			{
				throw new ArgumentException("Delimiter must be a single or double quote.", "delimiter");
			}
			return JavaScriptUtils.ToEscapedJavaScriptString(value, delimiter, appendDelimiters: true, stringEscapeHandling);
		}

		public static string ToString(object? value)
		{
			if (value == null)
			{
				return Null;
			}
			return ConvertUtils.GetTypeCode(value.GetType()) switch
			{
				PrimitiveTypeCode.String => ToString((string)value), 
				PrimitiveTypeCode.Char => ToString((char)value), 
				PrimitiveTypeCode.Boolean => ToString((bool)value), 
				PrimitiveTypeCode.SByte => ToString((sbyte)value), 
				PrimitiveTypeCode.Int16 => ToString((short)value), 
				PrimitiveTypeCode.UInt16 => ToString((ushort)value), 
				PrimitiveTypeCode.Int32 => ToString((int)value), 
				PrimitiveTypeCode.Byte => ToString((byte)value), 
				PrimitiveTypeCode.UInt32 => ToString((uint)value), 
				PrimitiveTypeCode.Int64 => ToString((long)value), 
				PrimitiveTypeCode.UInt64 => ToString((ulong)value), 
				PrimitiveTypeCode.Single => ToString((float)value), 
				PrimitiveTypeCode.Double => ToString((double)value), 
				PrimitiveTypeCode.DateTime => ToString((DateTime)value), 
				PrimitiveTypeCode.Decimal => ToString((decimal)value), 
				PrimitiveTypeCode.DBNull => Null, 
				PrimitiveTypeCode.DateTimeOffset => ToString((DateTimeOffset)value), 
				PrimitiveTypeCode.Guid => ToString((Guid)value), 
				PrimitiveTypeCode.Uri => ToString((Uri)value), 
				PrimitiveTypeCode.TimeSpan => ToString((TimeSpan)value), 
				PrimitiveTypeCode.BigInteger => ToStringInternal((BigInteger)value), 
				_ => throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType())), 
			};
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value)
		{
			return SerializeObject(value, (Type?)null, (JsonSerializerSettings?)null);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, Formatting formatting)
		{
			return SerializeObject(value, formatting, (JsonSerializerSettings?)null);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, params JsonConverter[] converters)
		{
			JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings
			{
				Converters = converters
			} : null);
			return SerializeObject(value, null, settings);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, Formatting formatting, params JsonConverter[] converters)
		{
			JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings
			{
				Converters = converters
			} : null);
			return SerializeObject(value, null, formatting, settings);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, JsonSerializerSettings? settings)
		{
			return SerializeObject(value, null, settings);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, Type? type, JsonSerializerSettings? settings)
		{
			JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings);
			return SerializeObjectInternal(value, type, jsonSerializer);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, Formatting formatting, JsonSerializerSettings? settings)
		{
			return SerializeObject(value, null, formatting, settings);
		}

		[DebuggerStepThrough]
		public static string SerializeObject(object? value, Type? type, Formatting formatting, JsonSerializerSettings? settings)
		{
			JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings);
			jsonSerializer.Formatting = formatting;
			return SerializeObjectInternal(value, type, jsonSerializer);
		}

		private static string SerializeObjectInternal(object? value, Type? type, JsonSerializer jsonSerializer)
		{
			StringWriter stringWriter = new StringWriter(new StringBuilder(256), CultureInfo.InvariantCulture);
			using (JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter))
			{
				jsonTextWriter.Formatting = jsonSerializer.Formatting;
				jsonSerializer.Serialize(jsonTextWriter, value, type);
			}
			return stringWriter.ToString();
		}

		[DebuggerStepThrough]
		public static object? DeserializeObject(string value)
		{
			return DeserializeObject(value, (Type?)null, (JsonSerializerSettings?)null);
		}

		[DebuggerStepThrough]
		public static object? DeserializeObject(string value, JsonSerializerSettings settings)
		{
			return DeserializeObject(value, null, settings);
		}

		[DebuggerStepThrough]
		public static object? DeserializeObject(string value, Type type)
		{
			return DeserializeObject(value, type, (JsonSerializerSettings?)null);
		}

		[DebuggerStepThrough]
		public static T? DeserializeObject<T>(string value)
		{
			return JsonConvert.DeserializeObject<T>(value, (JsonSerializerSettings?)null);
		}

		[DebuggerStepThrough]
		public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject)
		{
			return DeserializeObject<T>(value);
		}

		[DebuggerStepThrough]
		public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject, JsonSerializerSettings settings)
		{
			return DeserializeObject<T>(value, settings);
		}

		[DebuggerStepThrough]
		public static T? DeserializeObject<T>(string value, params JsonConverter[] converters)
		{
			return (T)DeserializeObject(value, typeof(T), converters);
		}

		[DebuggerStepThrough]
		public static T? DeserializeObject<T>(string value, JsonSerializerSettings? settings)
		{
			return (T)DeserializeObject(value, typeof(T), settings);
		}

		[DebuggerStepThrough]
		public static object? DeserializeObject(string value, Type type, params JsonConverter[] converters)
		{
			JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings
			{
				Converters = converters
			} : null);
			return DeserializeObject(value, type, settings);
		}

		public static object? DeserializeObject(string value, Type? type, JsonSerializerSettings? settings)
		{
			ValidationUtils.ArgumentNotNull(value, "value");
			JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings);
			if (!jsonSerializer.IsCheckAdditionalContentSet())
			{
				jsonSerializer.CheckAdditionalContent = true;
			}
			using JsonTextReader reader = new JsonTextReader(new StringReader(value));
			return jsonSerializer.Deserialize(reader, type);
		}

		[DebuggerStepThrough]
		public static void PopulateObject(string value, object target)
		{
			PopulateObject(value, target, null);
		}

		public static void PopulateObject(string value, object target, JsonSerializerSettings? settings)
		{
			JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings);
			using JsonReader jsonReader = new JsonTextReader(new StringReader(value));
			jsonSerializer.Populate(jsonReader, target);
			if (settings == null || !settings.CheckAdditionalContent)
			{
				return;
			}
			while (jsonReader.Read())
			{
				if (jsonReader.TokenType != JsonToken.Comment)
				{
					throw JsonSerializationException.Create(jsonReader, "Additional text found in JSON string after finishing deserializing object.");
				}
			}
		}

		public static string SerializeXmlNode(XmlNode? node)
		{
			return SerializeXmlNode(node, Formatting.None);
		}

		public static string SerializeXmlNode(XmlNode? node, Formatting formatting)
		{
			XmlNodeConverter xmlNodeConverter = new XmlNodeConverter();
			return SerializeObject(node, formatting, xmlNodeConverter);
		}

		public static string SerializeXmlNode(XmlNode? node, Formatting formatting, bool omitRootObject)
		{
			XmlNodeConverter xmlNodeConverter = new XmlNodeConverter
			{
				OmitRootObject = omitRootObject
			};
			return SerializeObject(node, formatting, xmlNodeConverter);
		}

		public static XmlDocument? DeserializeXmlNode(string value)
		{
			return DeserializeXmlNode(value, null);
		}

		public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName)
		{
			return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute: false);
		}

		public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute)
		{
			return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false);
		}

		public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters)
		{
			XmlNodeConverter xmlNodeConverter = new XmlNodeConverter();
			xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName;
			xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute;
			xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters;
			return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), xmlNodeConverter);
		}

		public static string SerializeXNode(XObject? node)
		{
			return SerializeXNode(node, Formatting.None);
		}

		public static string SerializeXNode(XObject? node, Formatting formatting)
		{
			return SerializeXNode(node, formatting, omitRootObject: false);
		}

		public static string SerializeXNode(XObject? node, Formatting formatting, bool omitRootObject)
		{
			XmlNodeConverter xmlNodeConverter = new XmlNodeConverter
			{
				OmitRootObject = omitRootObject
			};
			return SerializeObject(node, formatting, xmlNodeConverter);
		}

		public static XDocument? DeserializeXNode(string value)
		{
			return DeserializeXNode(value, null);
		}

		public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName)
		{
			return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute: false);
		}

		public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute)
		{
			return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false);
		}

		public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			XmlNodeConverter xmlNodeConverter = new XmlNodeConverter();
			xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName;
			xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute;
			xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters;
			return (XDocument)DeserializeObject(value, typeof(XDocument), xmlNodeConverter);
		}
	}
	public abstract class JsonConverter
	{
		public virtual bool CanRead => true;

		public virtual bool CanWrite => true;

		public abstract void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer);

		public abstract object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer);

		public abstract bool CanConvert(Type objectType);
	}
	public abstract class JsonConverter<T> : JsonConverter
	{
		public sealed override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
		{
			if (!((value != null) ? (value is T) : ReflectionUtils.IsNullable(typeof(T))))
			{
				throw new JsonSerializationException("Converter cannot write specified value to JSON. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T)));
			}
			WriteJson(writer, (T)value, serializer);
		}

		public abstract void WriteJson(JsonWriter writer, T? value, JsonSerializer serializer);

		public sealed override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
		{
			bool flag = existingValue == null;
			if (!flag && !(existingValue is T))
			{
				throw new JsonSerializationException("Converter cannot read JSON with the specified existing value. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T)));
			}
			return ReadJson(reader, objectType, flag ? default(T) : ((T)existingValue), !flag, serializer);
		}

		public abstract T? ReadJson(JsonReader reader, Type objectType, T? existingValue, bool hasExistingValue, JsonSerializer serializer);

		public sealed override bool CanConvert(Type objectType)
		{
			return typeof(T).IsAssignableFrom(objectType);
		}
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter, AllowMultiple = false)]
	public sealed class JsonConverterAttribute : Attribute
	{
		private readonly Type _converterType;

		public Type ConverterType => _converterType;

		public object[]? ConverterParameters { get; }

		public JsonConverterAttribute(Type converterType)
		{
			if (converterType == null)
			{
				throw new ArgumentNullException("converterType");
			}
			_converterType = converterType;
		}

		public JsonConverterAttribute(Type converterType, params object[] converterParameters)
			: this(converterType)
		{
			ConverterParameters = converterParameters;
		}
	}
	public class JsonConverterCollection : Collection<JsonConverter>
	{
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)]
	public sealed class JsonDictionaryAttribute : JsonContainerAttribute
	{
		public JsonDictionaryAttribute()
		{
		}

		public JsonDictionaryAttribute(string id)
			: base(id)
		{
		}
	}
	[Serializable]
	public class JsonException : Exception
	{
		public JsonException()
		{
		}

		public JsonException(string message)
			: base(message)
		{
		}

		public JsonException(string message, Exception? innerException)
			: base(message, innerException)
		{
		}

		public JsonException(SerializationInfo info, StreamingContext context)
			: base(info, context)
		{
		}

		internal static JsonException Create(IJsonLineInfo lineInfo, string path, string message)
		{
			message = JsonPosition.FormatMessage(lineInfo, path, message);
			return new JsonException(message);
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
	public class JsonExtensionDataAttribute : Attribute
	{
		public bool WriteData { get; set; }

		public bool ReadData { get; set; }

		public JsonExtensionDataAttribute()
		{
			WriteData = true;
			ReadData = true;
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
	public sealed class JsonIgnoreAttribute : Attribute
	{
	}
	public abstract class JsonNameTable
	{
		public abstract string? Get(char[] key, int start, int length);
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false)]
	public sealed class JsonObjectAttribute : JsonContainerAttribute
	{
		private MemberSerialization _memberSerialization;

		internal MissingMemberHandling? _missingMemberHandling;

		internal Required? _itemRequired;

		internal NullValueHandling? _itemNullValueHandling;

		public MemberSerialization MemberSerialization
		{
			get
			{
				return _memberSerialization;
			}
			set
			{
				_memberSerialization = value;
			}
		}

		public MissingMemberHandling MissingMemberHandling
		{
			get
			{
				return _missingMemberHandling.GetValueOrDefault();
			}
			set
			{
				_missingMemberHandling = value;
			}
		}

		public NullValueHandling ItemNullValueHandling
		{
			get
			{
				return _itemNullValueHandling.GetValueOrDefault();
			}
			set
			{
				_itemNullValueHandling = value;
			}
		}

		public Required ItemRequired
		{
			get
			{
				return _itemRequired.GetValueOrDefault();
			}
			set
			{
				_itemRequired = value;
			}
		}

		public JsonObjectAttribute()
		{
		}

		public JsonObjectAttribute(MemberSerialization memberSerialization)
		{
			MemberSerialization = memberSerialization;
		}

		public JsonObjectAttribute(string id)
			: base(id)
		{
		}
	}
	internal enum JsonContainerType
	{
		None,
		Object,
		Array,
		Constructor
	}
	internal struct JsonPosition
	{
		private static readonly char[] SpecialCharacters = new char[18]
		{
			'.', ' ', '\'', '/', '"', '[', ']', '(', ')', '\t',
			'\n', '\r', '\f', '\b', '\\', '\u0085', '\u2028', '\u2029'
		};

		internal JsonContainerType Type;

		internal int Position;

		internal string? PropertyName;

		internal bool HasIndex;

		public JsonPosition(JsonContainerType type)
		{
			Type = type;
			HasIndex = TypeHasIndex(type);
			Position = -1;
			PropertyName = null;
		}

		internal int CalculateLength()
		{
			switch (Type)
			{
			case JsonContainerType.Object:
				return PropertyName.Length + 5;
			case JsonContainerType.Array:
			case JsonContainerType.Constructor:
				return MathUtils.IntLength((ulong)Position) + 2;
			default:
				throw new ArgumentOutOfRangeException("Type");
			}
		}

		internal void WriteTo(StringBuilder sb, ref StringWriter? writer, ref char[]? buffer)
		{
			switch (Type)
			{
			case JsonContainerType.Object:
			{
				string propertyName = PropertyName;
				if (propertyName.IndexOfAny(SpecialCharacters) != -1)
				{
					sb.Append("['");
					if (writer == null)
					{
						writer = new StringWriter(sb);
					}
					JavaScriptUtils.WriteEscapedJavaScriptString(writer, propertyName, '\'', appendDelimiters: false, JavaScriptUtils.SingleQuoteCharEscapeFlags, StringEscapeHandling.Default, null, ref buffer);
					sb.Append("']");
				}
				else
				{
					if (sb.Length > 0)
					{
						sb.Append('.');
					}
					sb.Append(propertyName);
				}
				break;
			}
			case JsonContainerType.Array:
			case JsonContainerType.Constructor:
				sb.Append('[');
				sb.Append(Position);
				sb.Append(']');
				break;
			}
		}

		internal static bool TypeHasIndex(JsonContainerType type)
		{
			if (type != JsonContainerType.Array)
			{
				return type == JsonContainerType.Constructor;
			}
			return true;
		}

		internal static string BuildPath(List<JsonPosition> positions, JsonPosition? currentPosition)
		{
			int num = 0;
			if (positions != null)
			{
				for (int i = 0; i < positions.Count; i++)
				{
					num += positions[i].CalculateLength();
				}
			}
			if (currentPosition.HasValue)
			{
				num += currentPosition.GetValueOrDefault().CalculateLength();
			}
			StringBuilder stringBuilder = new StringBuilder(num);
			StringWriter writer = null;
			char[] buffer = null;
			if (positions != null)
			{
				foreach (JsonPosition position in positions)
				{
					position.WriteTo(stringBuilder, ref writer, ref buffer);
				}
			}
			currentPosition?.WriteTo(stringBuilder, ref writer, ref buffer);
			return stringBuilder.ToString();
		}

		internal static string FormatMessage(IJsonLineInfo? lineInfo, string path, string message)
		{
			if (!message.EndsWith(Environment.NewLine, StringComparison.Ordinal))
			{
				message = message.Trim();
				if (!StringUtils.EndsWith(message, '.'))
				{
					message += ".";
				}
				message += " ";
			}
			message += "Path '{0}'".FormatWith(CultureInfo.InvariantCulture, path);
			if (lineInfo != null && lineInfo.HasLineInfo())
			{
				message += ", line {0}, position {1}".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition);
			}
			message += ".";
			return message;
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
	public sealed class JsonPropertyAttribute : Attribute
	{
		internal NullValueHandling? _nullValueHandling;

		internal DefaultValueHandling? _defaultValueHandling;

		internal ReferenceLoopHandling? _referenceLoopHandling;

		internal ObjectCreationHandling? _objectCreationHandling;

		internal TypeNameHandling? _typeNameHandling;

		internal bool? _isReference;

		internal int? _order;

		internal Required? _required;

		internal bool? _itemIsReference;

		internal ReferenceLoopHandling? _itemReferenceLoopHandling;

		internal TypeNameHandling? _itemTypeNameHandling;

		public Type? ItemConverterType { get; set; }

		public object[]? ItemConverterParameters { get; set; }

		public Type? NamingStrategyType { get; set; }

		public object[]? NamingStrategyParameters { get; set; }

		public NullValueHandling NullValueHandling
		{
			get
			{
				return _nullValueHandling.GetValueOrDefault();
			}
			set
			{
				_nullValueHandling = value;
			}
		}

		public DefaultValueHandling DefaultValueHandling
		{
			get
			{
				return _defaultValueHandling.GetValueOrDefault();
			}
			set
			{
				_defaultValueHandling = value;
			}
		}

		public ReferenceLoopHandling ReferenceLoopHandling
		{
			get
			{
				return _referenceLoopHandling.GetValueOrDefault();
			}
			set
			{
				_referenceLoopHandling = value;
			}
		}

		public ObjectCreationHandling ObjectCreationHandling
		{
			get
			{
				return _objectCreationHandling.GetValueOrDefault();
			}
			set
			{
				_objectCreationHandling = value;
			}
		}

		public TypeNameHandling TypeNameHandling
		{
			get
			{
				return _typeNameHandling.GetValueOrDefault();
			}
			set
			{
				_typeNameHandling = value;
			}
		}

		public bool IsReference
		{
			get
			{
				return _isReference.GetValueOrDefault();
			}
			set
			{
				_isReference = value;
			}
		}

		public int Order
		{
			get
			{
				return _order.GetValueOrDefault();
			}
			set
			{
				_order = value;
			}
		}

		public Required Required
		{
			get
			{
				return _required.GetValueOrDefault();
			}
			set
			{
				_required = value;
			}
		}

		public string? PropertyName { get; set; }

		public ReferenceLoopHandling ItemReferenceLoopHandling
		{
			get
			{
				return _itemReferenceLoopHandling.GetValueOrDefault();
			}
			set
			{
				_itemReferenceLoopHandling = value;
			}
		}

		public TypeNameHandling ItemTypeNameHandling
		{
			get
			{
				return _itemTypeNameHandling.GetValueOrDefault();
			}
			set
			{
				_itemTypeNameHandling = value;
			}
		}

		public bool ItemIsReference
		{
			get
			{
				return _itemIsReference.GetValueOrDefault();
			}
			set
			{
				_itemIsReference = value;
			}
		}

		public JsonPropertyAttribute()
		{
		}

		public JsonPropertyAttribute(string propertyName)
		{
			PropertyName = propertyName;
		}
	}
	public abstract class JsonReader : IDisposable
	{
		protected internal enum State
		{
			Start,
			Complete,
			Property,
			ObjectStart,
			Object,
			ArrayStart,
			Array,
			Closed,
			PostValue,
			ConstructorStart,
			Constructor,
			Error,
			Finished
		}

		private JsonToken _tokenType;

		private object? _value;

		internal char _quoteChar;

		internal State _currentState;

		private JsonPosition _currentPosition;

		private CultureInfo? _culture;

		private DateTimeZoneHandling _dateTimeZoneHandling;

		private int? _maxDepth;

		private bool _hasExceededMaxDepth;

		internal DateParseHandling _dateParseHandling;

		internal FloatParseHandling _floatParseHandling;

		private string? _dateFormatString;

		private List<JsonPosition>? _stack;

		protected State CurrentState => _currentState;

		public bool CloseInput { get; set; }

		public bool SupportMultipleContent { get; set; }

		public virtual char QuoteChar
		{
			get
			{
				return _quoteChar;
			}
			protected internal set
			{
				_quoteChar = value;
			}
		}

		public DateTimeZoneHandling DateTimeZoneHandling
		{
			get
			{
				return _dateTimeZoneHandling;
			}
			set
			{
				if (value < DateTimeZoneHandling.Local || value > DateTimeZoneHandling.RoundtripKind)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_dateTimeZoneHandling = value;
			}
		}

		public DateParseHandling DateParseHandling
		{
			get
			{
				return _dateParseHandling;
			}
			set
			{
				if (value < DateParseHandling.None || value > DateParseHandling.DateTimeOffset)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_dateParseHandling = value;
			}
		}

		public FloatParseHandling FloatParseHandling
		{
			get
			{
				return _floatParseHandling;
			}
			set
			{
				if (value < FloatParseHandling.Double || value > FloatParseHandling.Decimal)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_floatParseHandling = value;
			}
		}

		public string? DateFormatString
		{
			get
			{
				return _dateFormatString;
			}
			set
			{
				_dateFormatString = value;
			}
		}

		public int? MaxDepth
		{
			get
			{
				return _maxDepth;
			}
			set
			{
				if (value <= 0)
				{
					throw new ArgumentException("Value must be positive.", "value");
				}
				_maxDepth = value;
			}
		}

		public virtual JsonToken TokenType => _tokenType;

		public virtual object? Value => _value;

		public virtual Type? ValueType => _value?.GetType();

		public virtual int Depth
		{
			get
			{
				int num = _stack?.Count ?? 0;
				if (JsonTokenUtils.IsStartToken(TokenType) || _currentPosition.Type == JsonContainerType.None)
				{
					return num;
				}
				return num + 1;
			}
		}

		public virtual string Path
		{
			get
			{
				if (_currentPosition.Type == JsonContainerType.None)
				{
					return string.Empty;
				}
				JsonPosition? currentPosition = ((_currentState != State.ArrayStart && _currentState != State.ConstructorStart && _currentState != State.ObjectStart) ? new JsonPosition?(_currentPosition) : null);
				return JsonPosition.BuildPath(_stack, currentPosition);
			}
		}

		public CultureInfo Culture
		{
			get
			{
				return _culture ?? CultureInfo.InvariantCulture;
			}
			set
			{
				_culture = value;
			}
		}

		public virtual Task<bool> ReadAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<bool>() ?? Read().ToAsync();
		}

		public async Task SkipAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			if (TokenType == JsonToken.PropertyName)
			{
				await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
			}
			if (JsonTokenUtils.IsStartToken(TokenType))
			{
				int depth = Depth;
				while (await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false) && depth < Depth)
				{
				}
			}
		}

		internal async Task ReaderReadAndAssertAsync(CancellationToken cancellationToken)
		{
			if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
			{
				throw CreateUnexpectedEndException();
			}
		}

		public virtual Task<bool?> ReadAsBooleanAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<bool?>() ?? Task.FromResult(ReadAsBoolean());
		}

		public virtual Task<byte[]?> ReadAsBytesAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<byte[]>() ?? Task.FromResult(ReadAsBytes());
		}

		internal async Task<byte[]?> ReadArrayIntoByteArrayAsync(CancellationToken cancellationToken)
		{
			List<byte> buffer = new List<byte>();
			do
			{
				if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
				{
					SetToken(JsonToken.None);
				}
			}
			while (!ReadArrayElementIntoByteArrayReportDone(buffer));
			byte[] array = buffer.ToArray();
			SetToken(JsonToken.Bytes, array, updateIndex: false);
			return array;
		}

		public virtual Task<DateTime?> ReadAsDateTimeAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<DateTime?>() ?? Task.FromResult(ReadAsDateTime());
		}

		public virtual Task<DateTimeOffset?> ReadAsDateTimeOffsetAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<DateTimeOffset?>() ?? Task.FromResult(ReadAsDateTimeOffset());
		}

		public virtual Task<decimal?> ReadAsDecimalAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<decimal?>() ?? Task.FromResult(ReadAsDecimal());
		}

		public virtual Task<double?> ReadAsDoubleAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return Task.FromResult(ReadAsDouble());
		}

		public virtual Task<int?> ReadAsInt32Async(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<int?>() ?? Task.FromResult(ReadAsInt32());
		}

		public virtual Task<string?> ReadAsStringAsync(CancellationToken cancellationToken = default(CancellationToken))
		{
			return cancellationToken.CancelIfRequestedAsync<string>() ?? Task.FromResult(ReadAsString());
		}

		internal async Task<bool> ReadAndMoveToContentAsync(CancellationToken cancellationToken)
		{
			bool flag = await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
			if (flag)
			{
				flag = await MoveToContentAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
			}
			return flag;
		}

		internal Task<bool> MoveToContentAsync(CancellationToken cancellationToken)
		{
			JsonToken tokenType = TokenType;
			if (tokenType == JsonToken.None || tokenType == JsonToken.Comment)
			{
				return MoveToContentFromNonContentAsync(cancellationToken);
			}
			return AsyncUtils.True;
		}

		private async Task<bool> MoveToContentFromNonContentAsync(CancellationToken cancellationToken)
		{
			JsonToken tokenType;
			do
			{
				if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
				{
					return false;
				}
				tokenType = TokenType;
			}
			while (tokenType == JsonToken.None || tokenType == JsonToken.Comment);
			return true;
		}

		internal JsonPosition GetPosition(int depth)
		{
			if (_stack != null && depth < _stack.Count)
			{
				return _stack[depth];
			}
			return _currentPosition;
		}

		protected JsonReader()
		{
			_currentState = State.Start;
			_dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
			_dateParseHandling = DateParseHandling.DateTime;
			_floatParseHandling = FloatParseHandling.Double;
			_maxDepth = 64;
			CloseInput = true;
		}

		private void Push(JsonContainerType value)
		{
			UpdateScopeWithFinishedValue();
			if (_currentPosition.Type == JsonContainerType.None)
			{
				_currentPosition = new JsonPosition(value);
				return;
			}
			if (_stack == null)
			{
				_stack = new List<JsonPosition>();
			}
			_stack.Add(_currentPosition);
			_currentPosition = new JsonPosition(value);
			if (!_maxDepth.HasValue || !(Depth + 1 > _maxDepth) || _hasExceededMaxDepth)
			{
				return;
			}
			_hasExceededMaxDepth = true;
			throw JsonReaderException.Create(this, "The reader's MaxDepth of {0} has been exceeded.".FormatWith(CultureInfo.InvariantCulture, _maxDepth));
		}

		private JsonContainerType Pop()
		{
			JsonPosition currentPosition;
			if (_stack != null && _stack.Count > 0)
			{
				currentPosition = _currentPosition;
				_currentPosition = _stack[_stack.Count - 1];
				_stack.RemoveAt(_stack.Count - 1);
			}
			else
			{
				currentPosition = _currentPosition;
				_currentPosition = default(JsonPosition);
			}
			if (_maxDepth.HasValue && Depth <= _maxDepth)
			{
				_hasExceededMaxDepth = false;
			}
			return currentPosition.Type;
		}

		private JsonContainerType Peek()
		{
			return _currentPosition.Type;
		}

		public abstract bool Read();

		public virtual int? ReadAsInt32()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Integer:
			case JsonToken.Float:
			{
				object value = Value;
				if (value is int)
				{
					return (int)value;
				}
				int num;
				if (value is BigInteger bigInteger)
				{
					num = (int)bigInteger;
				}
				else
				{
					try
					{
						num = Convert.ToInt32(value, CultureInfo.InvariantCulture);
					}
					catch (Exception ex)
					{
						throw JsonReaderException.Create(this, "Could not convert to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex);
					}
				}
				SetToken(JsonToken.Integer, num, updateIndex: false);
				return num;
			}
			case JsonToken.String:
			{
				string s = (string)Value;
				return ReadInt32String(s);
			}
			default:
				throw JsonReaderException.Create(this, "Error reading integer. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal int? ReadInt32String(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (int.TryParse(s, NumberStyles.Integer, Culture, out var result))
			{
				SetToken(JsonToken.Integer, result, updateIndex: false);
				return result;
			}
			SetToken(JsonToken.String, s, updateIndex: false);
			throw JsonReaderException.Create(this, "Could not convert string to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		public virtual string? ReadAsString()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.String:
				return (string)Value;
			default:
				if (JsonTokenUtils.IsPrimitiveToken(contentToken))
				{
					object value = Value;
					if (value != null)
					{
						string text = ((!(value is IFormattable formattable)) ? ((value is Uri uri) ? uri.OriginalString : value.ToString()) : formattable.ToString(null, Culture));
						SetToken(JsonToken.String, text, updateIndex: false);
						return text;
					}
				}
				throw JsonReaderException.Create(this, "Error reading string. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		public virtual byte[]? ReadAsBytes()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.StartObject:
			{
				ReadIntoWrappedTypeObject();
				byte[] array2 = ReadAsBytes();
				ReaderReadAndAssert();
				if (TokenType != JsonToken.EndObject)
				{
					throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType));
				}
				SetToken(JsonToken.Bytes, array2, updateIndex: false);
				return array2;
			}
			case JsonToken.String:
			{
				string text = (string)Value;
				Guid g;
				byte[] array3 = ((text.Length == 0) ? CollectionUtils.ArrayEmpty<byte>() : ((!ConvertUtils.TryConvertGuid(text, out g)) ? Convert.FromBase64String(text) : g.ToByteArray()));
				SetToken(JsonToken.Bytes, array3, updateIndex: false);
				return array3;
			}
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Bytes:
				if (Value is Guid guid)
				{
					byte[] array = guid.ToByteArray();
					SetToken(JsonToken.Bytes, array, updateIndex: false);
					return array;
				}
				return (byte[])Value;
			case JsonToken.StartArray:
				return ReadArrayIntoByteArray();
			default:
				throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal byte[] ReadArrayIntoByteArray()
		{
			List<byte> list = new List<byte>();
			do
			{
				if (!Read())
				{
					SetToken(JsonToken.None);
				}
			}
			while (!ReadArrayElementIntoByteArrayReportDone(list));
			byte[] array = list.ToArray();
			SetToken(JsonToken.Bytes, array, updateIndex: false);
			return array;
		}

		private bool ReadArrayElementIntoByteArrayReportDone(List<byte> buffer)
		{
			switch (TokenType)
			{
			case JsonToken.None:
				throw JsonReaderException.Create(this, "Unexpected end when reading bytes.");
			case JsonToken.Integer:
				buffer.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture));
				return false;
			case JsonToken.EndArray:
				return true;
			case JsonToken.Comment:
				return false;
			default:
				throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType));
			}
		}

		public virtual double? ReadAsDouble()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Integer:
			case JsonToken.Float:
			{
				object value = Value;
				if (value is double)
				{
					return (double)value;
				}
				double num = ((!(value is BigInteger bigInteger)) ? Convert.ToDouble(value, CultureInfo.InvariantCulture) : ((double)bigInteger));
				SetToken(JsonToken.Float, num, updateIndex: false);
				return num;
			}
			case JsonToken.String:
				return ReadDoubleString((string)Value);
			default:
				throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal double? ReadDoubleString(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, Culture, out var result))
			{
				SetToken(JsonToken.Float, result, updateIndex: false);
				return result;
			}
			SetToken(JsonToken.String, s, updateIndex: false);
			throw JsonReaderException.Create(this, "Could not convert string to double: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		public virtual bool? ReadAsBoolean()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Integer:
			case JsonToken.Float:
			{
				bool flag = ((!(Value is BigInteger bigInteger)) ? Convert.ToBoolean(Value, CultureInfo.InvariantCulture) : (bigInteger != 0L));
				SetToken(JsonToken.Boolean, flag, updateIndex: false);
				return flag;
			}
			case JsonToken.String:
				return ReadBooleanString((string)Value);
			case JsonToken.Boolean:
				return (bool)Value;
			default:
				throw JsonReaderException.Create(this, "Error reading boolean. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal bool? ReadBooleanString(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (bool.TryParse(s, out var result))
			{
				SetToken(JsonToken.Boolean, result, updateIndex: false);
				return result;
			}
			SetToken(JsonToken.String, s, updateIndex: false);
			throw JsonReaderException.Create(this, "Could not convert string to boolean: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		public virtual decimal? ReadAsDecimal()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Integer:
			case JsonToken.Float:
			{
				object value = Value;
				if (value is decimal)
				{
					return (decimal)value;
				}
				decimal num;
				if (value is BigInteger bigInteger)
				{
					num = (decimal)bigInteger;
				}
				else
				{
					try
					{
						num = Convert.ToDecimal(value, CultureInfo.InvariantCulture);
					}
					catch (Exception ex)
					{
						throw JsonReaderException.Create(this, "Could not convert to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex);
					}
				}
				SetToken(JsonToken.Float, num, updateIndex: false);
				return num;
			}
			case JsonToken.String:
				return ReadDecimalString((string)Value);
			default:
				throw JsonReaderException.Create(this, "Error reading decimal. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal decimal? ReadDecimalString(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (decimal.TryParse(s, NumberStyles.Number, Culture, out var result))
			{
				SetToken(JsonToken.Float, result, updateIndex: false);
				return result;
			}
			if (ConvertUtils.DecimalTryParse(s.ToCharArray(), 0, s.Length, out result) == ParseResult.Success)
			{
				SetToken(JsonToken.Float, result, updateIndex: false);
				return result;
			}
			SetToken(JsonToken.String, s, updateIndex: false);
			throw JsonReaderException.Create(this, "Could not convert string to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		public virtual DateTime? ReadAsDateTime()
		{
			switch (GetContentToken())
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Date:
				if (Value is DateTimeOffset dateTimeOffset)
				{
					SetToken(JsonToken.Date, dateTimeOffset.DateTime, updateIndex: false);
				}
				return (DateTime)Value;
			case JsonToken.String:
				return ReadDateTimeString((string)Value);
			default:
				throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType));
			}
		}

		internal DateTime? ReadDateTimeString(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (DateTimeUtils.TryParseDateTime(s, DateTimeZoneHandling, _dateFormatString, Culture, out var dt))
			{
				dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling);
				SetToken(JsonToken.Date, dt, updateIndex: false);
				return dt;
			}
			if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt))
			{
				dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling);
				SetToken(JsonToken.Date, dt, updateIndex: false);
				return dt;
			}
			throw JsonReaderException.Create(this, "Could not convert string to DateTime: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		public virtual DateTimeOffset? ReadAsDateTimeOffset()
		{
			JsonToken contentToken = GetContentToken();
			switch (contentToken)
			{
			case JsonToken.None:
			case JsonToken.Null:
			case JsonToken.EndArray:
				return null;
			case JsonToken.Date:
				if (Value is DateTime dateTime)
				{
					SetToken(JsonToken.Date, new DateTimeOffset(dateTime), updateIndex: false);
				}
				return (DateTimeOffset)Value;
			case JsonToken.String:
			{
				string s = (string)Value;
				return ReadDateTimeOffsetString(s);
			}
			default:
				throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken));
			}
		}

		internal DateTimeOffset? ReadDateTimeOffsetString(string? s)
		{
			if (StringUtils.IsNullOrEmpty(s))
			{
				SetToken(JsonToken.Null, null, updateIndex: false);
				return null;
			}
			if (DateTimeUtils.TryParseDateTimeOffset(s, _dateFormatString, Culture, out var dt))
			{
				SetToken(JsonToken.Date, dt, updateIndex: false);
				return dt;
			}
			if (DateTimeOffset.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt))
			{
				SetToken(JsonToken.Date, dt, updateIndex: false);
				return dt;
			}
			SetToken(JsonToken.String, s, updateIndex: false);
			throw JsonReaderException.Create(this, "Could not convert string to DateTimeOffset: {0}.".FormatWith(CultureInfo.InvariantCulture, s));
		}

		internal void ReaderReadAndAssert()
		{
			if (!Read())
			{
				throw CreateUnexpectedEndException();
			}
		}

		internal JsonReaderException CreateUnexpectedEndException()
		{
			return JsonReaderException.Create(this, "Unexpected end when reading JSON.");
		}

		internal void ReadIntoWrappedTypeObject()
		{
			ReaderReadAndAssert();
			if (Value != null && Value.ToString() == "$type")
			{
				ReaderReadAndAssert();
				if (Value != null && Value.ToString().StartsWith("System.Byte[]", StringComparison.Ordinal))
				{
					ReaderReadAndAssert();
					if (Value.ToString() == "$value")
					{
						return;
					}
				}
			}
			throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, JsonToken.StartObject));
		}

		public void Skip()
		{
			if (TokenType == JsonToken.PropertyName)
			{
				Read();
			}
			if (JsonTokenUtils.IsStartToken(TokenType))
			{
				int depth = Depth;
				while (Read() && depth < Depth)
				{
				}
			}
		}

		protected void SetToken(JsonToken newToken)
		{
			SetToken(newToken, null, updateIndex: true);
		}

		protected void SetToken(JsonToken newToken, object? value)
		{
			SetToken(newToken, value, updateIndex: true);
		}

		protected void SetToken(JsonToken newToken, object? value, bool updateIndex)
		{
			_tokenType = newToken;
			_value = value;
			switch (newToken)
			{
			case JsonToken.StartObject:
				_currentState = State.ObjectStart;
				Push(JsonContainerType.Object);
				break;
			case JsonToken.StartArray:
				_currentState = State.ArrayStart;
				Push(JsonContainerType.Array);
				break;
			case JsonToken.StartConstructor:
				_currentState = State.ConstructorStart;
				Push(JsonContainerType.Constructor);
				break;
			case JsonToken.EndObject:
				ValidateEnd(JsonToken.EndObject);
				break;
			case JsonToken.EndArray:
				ValidateEnd(JsonToken.EndArray);
				break;
			case JsonToken.EndConstructor:
				ValidateEnd(JsonToken.EndConstructor);
				break;
			case JsonToken.PropertyName:
				_currentState = State.Property;
				_currentPosition.PropertyName = (string)value;
				break;
			case JsonToken.Raw:
			case JsonToken.Integer:
			case JsonToken.Float:
			case JsonToken.String:
			case JsonToken.Boolean:
			case JsonToken.Null:
			case JsonToken.Undefined:
			case JsonToken.Date:
			case JsonToken.Bytes:
				SetPostValueState(updateIndex);
				break;
			case JsonToken.Comment:
				break;
			}
		}

		internal void SetPostValueState(bool updateIndex)
		{
			if (Peek() != 0 || SupportMultipleContent)
			{
				_currentState = State.PostValue;
			}
			else
			{
				SetFinished();
			}
			if (updateIndex)
			{
				UpdateScopeWithFinishedValue();
			}
		}

		private void UpdateScopeWithFinishedValue()
		{
			if (_currentPosition.HasIndex)
			{
				_currentPosition.Position++;
			}
		}

		private void ValidateEnd(JsonToken endToken)
		{
			JsonContainerType jsonContainerType = Pop();
			if (GetTypeForCloseToken(endToken) != jsonContainerType)
			{
				throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, jsonContainerType));
			}
			if (Peek() != 0 || SupportMultipleContent)
			{
				_currentState = State.PostValue;
			}
			else
			{
				SetFinished();
			}
		}

		protected void SetStateBasedOnCurrent()
		{
			JsonContainerType jsonContainerType = Peek();
			switch (jsonContainerType)
			{
			case JsonContainerType.Object:
				_currentState = State.Object;
				break;
			case JsonContainerType.Array:
				_currentState = State.Array;
				break;
			case JsonContainerType.Constructor:
				_currentState = State.Constructor;
				break;
			case JsonContainerType.None:
				SetFinished();
				break;
			default:
				throw JsonReaderException.Create(this, "While setting the reader state back to current object an unexpected JsonType was encountered: {0}".FormatWith(CultureInfo.InvariantCulture, jsonContainerType));
			}
		}

		private void SetFinished()
		{
			_currentState = ((!SupportMultipleContent) ? State.Finished : State.Start);
		}

		private JsonContainerType GetTypeForCloseToken(JsonToken token)
		{
			return token switch
			{
				JsonToken.EndObject => JsonContainerType.Object, 
				JsonToken.EndArray => JsonContainerType.Array, 
				JsonToken.EndConstructor => JsonContainerType.Constructor, 
				_ => throw JsonReaderException.Create(this, "Not a valid close JsonToken: {0}".FormatWith(CultureInfo.InvariantCulture, token)), 
			};
		}

		void IDisposable.Dispose()
		{
			Dispose(disposing: true);
			GC.SuppressFinalize(this);
		}

		protected virtual void Dispose(bool disposing)
		{
			if (_currentState != State.Closed && disposing)
			{
				Close();
			}
		}

		public virtual void Close()
		{
			_currentState = State.Closed;
			_tokenType = JsonToken.None;
			_value = null;
		}

		internal void ReadAndAssert()
		{
			if (!Read())
			{
				throw JsonSerializationException.Create(this, "Unexpected end when reading JSON.");
			}
		}

		internal void ReadForTypeAndAssert(JsonContract? contract, bool hasConverter)
		{
			if (!ReadForType(contract, hasConverter))
			{
				throw JsonSerializationException.Create(this, "Unexpected end when reading JSON.");
			}
		}

		internal bool ReadForType(JsonContract? contract, bool hasConverter)
		{
			if (hasConverter)
			{
				return Read();
			}
			switch (contract?.InternalReadType ?? ReadType.Read)
			{
			case ReadType.Read:
				return ReadAndMoveToContent();
			case ReadType.ReadAsInt32:
				ReadAsInt32();
				break;
			case ReadType.ReadAsInt64:
			{
				bool result = ReadAndMoveToContent();
				if (TokenType == JsonToken.Undefined)
				{
					throw JsonReaderException.Create(this, "An undefined token is not a valid {0}.".FormatWith(CultureInfo.InvariantCulture, contract?.UnderlyingType ?? typeof(long)));
				}
				return result;
			}
			case ReadType.ReadAsDecimal:
				ReadAsDecimal();
				break;
			case ReadType.ReadAsDouble:
				ReadAsDouble();
				break;
			case ReadType.ReadAsBytes:
				ReadAsBytes();
				break;
			case ReadType.ReadAsBoolean:
				ReadAsBoolean();
				break;
			case ReadType.ReadAsString:
				ReadAsString();
				break;
			case ReadType.ReadAsDateTime:
				ReadAsDateTime();
				break;
			case ReadType.ReadAsDateTimeOffset:
				ReadAsDateTimeOffset();
				break;
			default:
				throw new ArgumentOutOfRangeException();
			}
			return TokenType != JsonToken.None;
		}

		internal bool ReadAndMoveToContent()
		{
			if (Read())
			{
				return MoveToContent();
			}
			return false;
		}

		internal bool MoveToContent()
		{
			JsonToken tokenType = TokenType;
			while (tokenType == JsonToken.None || tokenType == JsonToken.Comment)
			{
				if (!Read())
				{
					return false;
				}
				tokenType = TokenType;
			}
			return true;
		}

		private JsonToken GetContentToken()
		{
			JsonToken tokenType;
			do
			{
				if (!Read())
				{
					SetToken(JsonToken.None);
					return JsonToken.None;
				}
				tokenType = TokenType;
			}
			while (tokenType == JsonToken.Comment);
			return tokenType;
		}
	}
	[Serializable]
	public class JsonReaderException : JsonException
	{
		public int LineNumber { get; }

		public int LinePosition { get; }

		public string? Path { get; }

		public JsonReaderException()
		{
		}

		public JsonReaderException(string message)
			: base(message)
		{
		}

		public JsonReaderException(string message, Exception innerException)
			: base(message, innerException)
		{
		}

		public JsonReaderException(SerializationInfo info, StreamingContext context)
			: base(info, context)
		{
		}

		public JsonReaderException(string message, string path, int lineNumber, int linePosition, Exception? innerException)
			: base(message, innerException)
		{
			Path = path;
			LineNumber = lineNumber;
			LinePosition = linePosition;
		}

		internal static JsonReaderException Create(JsonReader reader, string message)
		{
			return Create(reader, message, null);
		}

		internal static JsonReaderException Create(JsonReader reader, string message, Exception? ex)
		{
			return Create(reader as IJsonLineInfo, reader.Path, message, ex);
		}

		internal static JsonReaderException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex)
		{
			message = JsonPosition.FormatMessage(lineInfo, path, message);
			int lineNumber;
			int linePosition;
			if (lineInfo != null && lineInfo.HasLineInfo())
			{
				lineNumber = lineInfo.LineNumber;
				linePosition = lineInfo.LinePosition;
			}
			else
			{
				lineNumber = 0;
				linePosition = 0;
			}
			return new JsonReaderException(message, path, lineNumber, linePosition, ex);
		}
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
	public sealed class JsonRequiredAttribute : Attribute
	{
	}
	[Serializable]
	public class JsonSerializationException : JsonException
	{
		public int LineNumber { get; }

		public int LinePosition { get; }

		public string? Path { get; }

		public JsonSerializationException()
		{
		}

		public JsonSerializationException(string message)
			: base(message)
		{
		}

		public JsonSerializationException(string message, Exception innerException)
			: base(message, innerException)
		{
		}

		public JsonSerializationException(SerializationInfo info, StreamingContext context)
			: base(info, context)
		{
		}

		public JsonSerializationException(string message, string path, int lineNumber, int linePosition, Exception? innerException)
			: base(message, innerException)
		{
			Path = path;
			LineNumber = lineNumber;
			LinePosition = linePosition;
		}

		internal static JsonSerializationException Create(JsonReader reader, string message)
		{
			return Create(reader, message, null);
		}

		internal static JsonSerializationException Create(JsonReader reader, string message, Exception? ex)
		{
			return Create(reader as IJsonLineInfo, reader.Path, message, ex);
		}

		internal static JsonSerializationException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex)
		{
			message = JsonPosition.FormatMessage(lineInfo, path, message);
			int lineNumber;
			int linePosition;
			if (lineInfo != null && lineInfo.HasLineInfo())
			{
				lineNumber = lineInfo.LineNumber;
				linePosition = lineInfo.LinePosition;
			}
			else
			{
				lineNumber = 0;
				linePosition = 0;
			}
			return new JsonSerializationException(message, path, lineNumber, linePosition, ex);
		}
	}
	public class JsonSerializer
	{
		internal TypeNameHandling _typeNameHandling;

		internal TypeNameAssemblyFormatHandling _typeNameAssemblyFormatHandling;

		internal PreserveReferencesHandling _preserveReferencesHandling;

		internal ReferenceLoopHandling _referenceLoopHandling;

		internal MissingMemberHandling _missingMemberHandling;

		internal ObjectCreationHandling _objectCreationHandling;

		internal NullValueHandling _nullValueHandling;

		internal DefaultValueHandling _defaultValueHandling;

		internal ConstructorHandling _constructorHandling;

		internal MetadataPropertyHandling _metadataPropertyHandling;

		internal JsonConverterCollection? _converters;

		internal IContractResolver _contractResolver;

		internal ITraceWriter? _traceWriter;

		internal IEqualityComparer? _equalityComparer;

		internal ISerializationBinder _serializationBinder;

		internal StreamingContext _context;

		private IReferenceResolver? _referenceResolver;

		private Formatting? _formatting;

		private DateFormatHandling? _dateFormatHandling;

		private DateTimeZoneHandling? _dateTimeZoneHandling;

		private DateParseHandling? _dateParseHandling;

		private FloatFormatHandling? _floatFormatHandling;

		private FloatParseHandling? _floatParseHandling;

		private StringEscapeHandling? _stringEscapeHandling;

		private CultureInfo _culture;

		private int? _maxDepth;

		private bool _maxDepthSet;

		private bool? _checkAdditionalContent;

		private string? _dateFormatString;

		private bool _dateFormatStringSet;

		public virtual IReferenceResolver? ReferenceResolver
		{
			get
			{
				return GetReferenceResolver();
			}
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value", "Reference resolver cannot be null.");
				}
				_referenceResolver = value;
			}
		}

		[Obsolete("Binder is obsolete. Use SerializationBinder instead.")]
		public virtual SerializationBinder Binder
		{
			get
			{
				if (_serializationBinder is SerializationBinder result)
				{
					return result;
				}
				if (_serializationBinder is SerializationBinderAdapter serializationBinderAdapter)
				{
					return serializationBinderAdapter.SerializationBinder;
				}
				throw new InvalidOperationException("Cannot get SerializationBinder because an ISerializationBinder was previously set.");
			}
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value", "Serialization binder cannot be null.");
				}
				_serializationBinder = (value as ISerializationBinder) ?? new SerializationBinderAdapter(value);
			}
		}

		public virtual ISerializationBinder SerializationBinder
		{
			get
			{
				return _serializationBinder;
			}
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value", "Serialization binder cannot be null.");
				}
				_serializationBinder = value;
			}
		}

		public virtual ITraceWriter? TraceWriter
		{
			get
			{
				return _traceWriter;
			}
			set
			{
				_traceWriter = value;
			}
		}

		public virtual IEqualityComparer? EqualityComparer
		{
			get
			{
				return _equalityComparer;
			}
			set
			{
				_equalityComparer = value;
			}
		}

		public virtual TypeNameHandling TypeNameHandling
		{
			get
			{
				return _typeNameHandling;
			}
			set
			{
				if (value < TypeNameHandling.None || value > TypeNameHandling.Auto)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_typeNameHandling = value;
			}
		}

		[Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")]
		public virtual FormatterAssemblyStyle TypeNameAssemblyFormat
		{
			get
			{
				return (FormatterAssemblyStyle)_typeNameAssemblyFormatHandling;
			}
			set
			{
				if (value < FormatterAssemblyStyle.Simple || value > FormatterAssemblyStyle.Full)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_typeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value;
			}
		}

		public virtual TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling
		{
			get
			{
				return _typeNameAssemblyFormatHandling;
			}
			set
			{
				if (value < TypeNameAssemblyFormatHandling.Simple || value > TypeNameAssemblyFormatHandling.Full)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_typeNameAssemblyFormatHandling = value;
			}
		}

		public virtual PreserveReferencesHandling PreserveReferencesHandling
		{
			get
			{
				return _preserveReferencesHandling;
			}
			set
			{
				if (value < PreserveReferencesHandling.None || value > PreserveReferencesHandling.All)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_preserveReferencesHandling = value;
			}
		}

		public virtual ReferenceLoopHandling ReferenceLoopHandling
		{
			get
			{
				return _referenceLoopHandling;
			}
			set
			{
				if (value < ReferenceLoopHandling.Error || value > ReferenceLoopHandling.Serialize)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_referenceLoopHandling = value;
			}
		}

		public virtual MissingMemberHandling MissingMemberHandling
		{
			get
			{
				return _missingMemberHandling;
			}
			set
			{
				if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_missingMemberHandling = value;
			}
		}

		public virtual NullValueHandling NullValueHandling
		{
			get
			{
				return _nullValueHandling;
			}
			set
			{
				if (value < NullValueHandling.Include || value > NullValueHandling.Ignore)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_nullValueHandling = value;
			}
		}

		public virtual DefaultValueHandling DefaultValueHandling
		{
			get
			{
				return _defaultValueHandling;
			}
			set
			{
				if (value < DefaultValueHandling.Include || value > DefaultValueHandling.IgnoreAndPopulate)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_defaultValueHandling = value;
			}
		}

		public virtual ObjectCreationHandling ObjectCreationHandling
		{
			get
			{
				return _objectCreationHandling;
			}
			set
			{
				if (value < ObjectCreationHandling.Auto || value > ObjectCreationHandling.Replace)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_objectCreationHandling = value;
			}
		}

		public virtual ConstructorHandling ConstructorHandling
		{
			get
			{
				return _constructorHandling;
			}
			set
			{
				if (value < ConstructorHandling.Default || value > ConstructorHandling.AllowNonPublicDefaultConstructor)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_constructorHandling = value;
			}
		}

		public virtual MetadataPropertyHandling MetadataPropertyHandling
		{
			get
			{
				return _metadataPropertyHandling;
			}
			set
			{
				if (value < MetadataPropertyHandling.Default || value > MetadataPropertyHandling.Ignore)
				{
					throw new ArgumentOutOfRangeException("value");
				}
				_metadataPropertyHandling = value;
			}
		}

		public virtual JsonConverterCollection Converters
		{
			get
			{
				if (_converters == null)
				{
					_converters = new JsonConverterCollection();
				}
				return _converters;
			}
		}

		public virtual IContractResolver ContractResolver
		{
			get
			{
				return _contractResolver;
			}
			set
			{
				_contractResolver = value ?? DefaultContractResolver.Instance;
			}
		}

		public virtual StreamingContext Context
		{
			get
			{
				return _context;
			}
			set
			{
				_context = value;
			}
		}

		public virtual Formatting Formatting
		{
			get
			{
				return _formatting.GetValueOrDefault();
			}
			set
			{
				_formatting = value;
			}
		}

		public virtual DateFormatHandling DateFormatHandling
		{
			get
			{
				return _dateFormatHandling.GetValueOrDefault();
			}
			set
			{
				_dateFormatHandling = value;
			}
		}

		public virtual DateTimeZoneHandling DateTimeZoneHandling
		{
			get
			{
				return _dateTimeZoneHandling ?? DateTimeZoneHandling.RoundtripKind;
			}
			set
			{
				_dateTimeZoneHandling = value;
			}
		}

		public virtual DateParseHandling DateParseHandling
		{
			get
			{
				return _dateParseHandling ?? DateParseHandling.DateTime;
			}
			set
			{
				_dateParseHandling = value;
			}
		}

		public virtual FloatParseHandling FloatParseHandling
		{
			get
			{
				return _floatParseHandling.GetValueOrDefault();
			}
			set
			{
				_floatParseHandling = value;
			}
		}

		public virtual FloatFormatHandling FloatFormatHandling
		{
			get
			{
				return _floatFormatHandling.GetValueOrDefault();
			}
			set
			{
				_floatFormatHandling = value;
			}
		}

		public virtual StringEscapeHandling StringEscapeHandling
		{
			get
			{
				return _stringEscapeHandling.GetValueOrDefault();
			}
			set
			{
				_stringEscapeHandling = value;
			}
		}

		public virtual string DateFormatString
		{
			get
			{
				return _dateFormatString ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK";
			}
			set
			{
				_dateFormatString = value;
				_dateFormatStringSet = true;
			}
		}

		public virtual CultureInfo Culture
		{
			get
			{
				return _culture ?? JsonSerializerSettings.DefaultCulture;
			}
			set
			{
				_culture = value;
			}
		}

		public virtual int? MaxDepth
		{
			get
			{
				return _maxDepth;
			}
			set
			{
				if (value <= 0)
				{
					throw new ArgumentException("Value must be positive.", "value");
				}
				_maxDepth = value;
				_maxDepthSet = true;
			}
		}

		public virtual bool CheckAdditionalContent
		{
			get
			{
				return _checkAdditionalContent.GetValueOrDefault();
			}
			set
			{
				_checkAdditionalContent = value;
			}
		}

		public virtual event EventHandler<Newtonsoft.Json.Serialization.ErrorEventArgs>? Error;

		internal bool IsCheckAdditionalContentSet()
		{
			return _checkAdditionalContent.HasValue;
		}

		public JsonSerializer()
		{
			_referenceLoopHandling = ReferenceLoopHandling.Error;
			_missingMemberHandling = MissingMemberHandling.Ignore;
			_nullValueHandling = NullValueHandling.Include;
			_defaultValueHandling = DefaultValueHandling.Include;
			_objectCreationHandling = ObjectCreationHandling.Auto;
			_preserveReferencesHandling = PreserveReferencesHandling.None;
			_constructorHandling = ConstructorHandling.Default;
			_typeNameHandling = TypeNameHandling.None;
			_metadataPropertyHandling = MetadataPropertyHandling.Default;
			_context = JsonSerializerSettings.DefaultContext;
			_serializationBinder = DefaultSerializationBinder.Instance;
			_culture = JsonSerializerSettings.DefaultCulture;
			_contractResolver = DefaultContractResolver.Instance;
		}

		public static JsonSerializer Create()
		{
			return new JsonSerializer();
		}

		public static JsonSerializer Create(JsonSerializerSettings? settings)
		{
			JsonSerializer jsonSerializer = Create();
			if (settings != null)
			{
				ApplySerializerSettings(jsonSerializer, settings);
			}
			return jsonSerializer;
		}

		public static JsonSerializer CreateDefault()
		{
			return Create(JsonConvert.DefaultSettings?.Invoke());
		}

		public static JsonSerializer CreateDefault(JsonSerializerSettings? settings)
		{
			JsonSerializer jsonSerializer = CreateDefault();
			if (settings != null)
			{
				ApplySerializerSettings(jsonSerializer, settings);
			}
			return jsonSerializer;
		}

		private static void ApplySerializerSettings(JsonSerializer serializer, JsonSerializerSettings settings)
		{
			if (!CollectionUtils.IsNullOrEmpty(settings.Converters))
			{
				for (int i = 0; i < settings.Converters.Count; i++)
				{
					serializer.Converters.Insert(i, settings.Converters[i]);
				}
			}
			if (settings._typeNameHandling.HasValue)
			{
				serializer.TypeNameHandling = settings.TypeNameHandling;
			}
			if (settings._metadataPropertyHandling.HasValue)
			{
				serializer.MetadataPropertyHandling = settings.MetadataPropertyHandling;
			}
			if (settings._typeNameAssemblyFormatHandling.HasValue)
			{
				serializer.TypeNameAssemblyFormatHandling = settings.TypeNameAssemblyFormatHandling;
			}
			if (settings._preserveReferencesHandling.HasValue)
			{
				serializer.PreserveReferencesHandling = settings.PreserveReferencesHandling;
			}
			if (settings._referenceLoopHandling.HasValue)
			{
				serializer.ReferenceLoopHandling = settings.ReferenceLoopHandling;
			}
			if (settings._missingMemberHandling.HasValue)
			{
				serializer.MissingMemberHandling = settings.MissingMemberHandling;
			}
			if (settings._objectCreationHandling.HasValue)
			{
				serializer.ObjectCreationHandling = settings.ObjectCreationHandling;
			}
			if (settings._nullValueHandling.HasValue)
			{
				serializer.NullValueHandling = settings.NullValueHandling;
			}
			if (settings._defaultValueHandling.HasValue)
			{
				serializer.DefaultValueHandling = settings.DefaultValueHandling;
			}
			if (settings._constructorHandling.HasValue)
			{
				serializer.ConstructorHandling = settings.ConstructorHandling;
			}
			if (settings._context.HasValue)
			{
				serializer.Context = settings.Context;
			}
			if (settings._checkAdditionalContent.HasValue)
			{
				serializer._checkAdditionalContent = settings._checkAdditionalContent;
			}
			if (settings.Error != null)
			{
				serializer.Error += settings.Error;
			}
			if (settings.ContractResolver != null)
			{
				serializer.ContractResolver = settings.ContractResolver;
			}
			if (settings.ReferenceResolverProvider != null)
			{
				serializer.ReferenceResolver = settings.ReferenceResolverProvider();
			}
			if (settings.TraceWriter != null)
			{
				serializer.TraceWriter = settings.TraceWriter;
			}
			if (settings.EqualityComparer != null)
			{
				serializer.EqualityComparer = settings.EqualityComparer;
			}
			if (settings.SerializationBinder != null)
			{
				serializer.SerializationBinder = settings.SerializationBinder;
			}
			if (settings._formatting.HasValue)
			{
				serializer._formatting = settings._formatting;
			}
			if (settings._dateFormatHandling.HasValue)
			{
				serializer._dateFormatHandling = settings._dateFormatHandling;
			}
			if (settings._dateTimeZoneHandling.HasValue)
			{
				serializer._dateTimeZoneHandling = settings._dateTimeZoneHandling;
			}
			if (settings._dateParseHandling.HasValue)
			{
				serializer._dateParseHandling = settings._dateParseHandling;
			}
			if (settings._dateFormatStringSet)
			{
				serializer._dateFormatString = settings._dateFormatString;
				serializer._dateFormatStringSet = settings._dateFormatStringSet;
			}
			if (settings._floatFormatHandling.HasValue)
			{
				serializer._floatFormatHandling = settings._floatFormatHandling;
			}
			if (settings._floatParseHandling.HasValue)
			{
				serializer._floatParseHandling = settings._floatParseHandling;
			}
			if (settings._stringEscapeHandling.HasValue)
			{
				serializer._stringEscapeHandling = settings._stringEscapeHandling;
			}
			if (settings._culture != null)
			{
				serializer._culture = settings._culture;
			}
			if (settings._maxDepthSet)
			{
				serializer._maxDepth = settings._maxDepth;
				serializer._maxDepthSet = settings._maxDepthSet;
			}
		}

		[DebuggerStepThrough]
		public void Populate(TextReader reader, object target)
		{
			Populate(new JsonTextReader(reader), target);
		}

		[DebuggerStepThrough]
		public void Populate(JsonReader reader, object target)
		{
			PopulateInternal(reader, target);
		}

		internal virtual void PopulateInternal(JsonReader reader, object target)
		{
			ValidationUtils.ArgumentNotNull(reader, "reader");
			ValidationUtils.ArgumentNotNull(target, "target");
			SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString);
			TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null);
			new JsonSerializerInternalReader(this).Populate(traceJsonReader ?? reader, target);
			if (traceJsonReader != null)
			{
				TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null);
			}
			ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString);
		}

		[DebuggerStepThrough]
		public object? Deserialize(JsonReader reader)
		{
			return Deserialize(reader, null);
		}

		[DebuggerStepThrough]
		public object? Deserialize(TextReader reader, Type objectType)
		{
			return Deserialize(new JsonTextReader(reader), objectType);
		}

		[DebuggerStepThrough]
		public T? Deserialize<T>(JsonReader reader)
		{
			return (T)Deserialize(reader, typeof(T));
		}

		[DebuggerStepThrough]
		public object? Deserialize(JsonReader reader, Type? objectType)
		{
			return DeserializeInternal(reader, objectType);
		}

		internal virtual object? DeserializeInternal(JsonReader reader, Type? objectType)
		{
			ValidationUtils.ArgumentNotNull(reader, "reader");
			SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString);
			TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null);
			object? result = new JsonSerializerInternalReader(this).Deserialize(traceJsonReader ?? reader, objectType, CheckAdditionalContent);
			if (traceJsonReader != null)
			{
				TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null);
			}
			ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString);
			return result;
		}

		internal void SetupReader(JsonReader reader, out CultureInfo? previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string? previousDateFormatString)
		{
			if (_culture != null && !_culture.Equals(reader.Culture))
			{
				previousCulture = reader.Culture;
				reader.Culture = _culture;
			}
			else
			{
				previousCulture = null;
			}
			if (_dateTimeZoneHandling.HasValue && reader.DateTimeZoneHandling != _dateTimeZoneHandling)
			{
				previousDateTimeZoneHandling = reader.DateTimeZoneHandling;
				reader.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault();
			}
			else
			{
				previousDateTimeZoneHandling = null;
			}
			if (_dateParseHandling.HasValue && reader.DateParseHandling != _dateParseHandling)
			{
				previousDateParseHandling = reader.DateParseHandling;
				reader.DateParseHandling = _dateParseHandling.GetValueOrDefault();
			}
			else
			{
				previousDateParseHandling = null;
			}
			if (_floatParseHandling.HasValue && reader.FloatParseHandling != _floatParseHandling)
			{
				previousFloatParseHandling = reader.FloatParseHandling;
				reader.FloatParseHandling = _floatParseHandling.GetValueOrDefault();
			}
			else
			{
				previousFloatParseHandling = null;
			}
			if (_maxDepthSet && reader.MaxDepth != _maxDepth)
			{
				previousMaxDepth = reader.MaxDepth;
				reader.MaxDepth = _maxDepth;
			}
			else
			{
				previousMaxDepth = null;
			}
			if (_dateFormatStringSet && reader.DateFormatString != _dateFormatString)
			{
				previousDateFormatString = reader.DateFormatString;
				reader.DateFormatString = _dateFormatString;
			}
			else
			{
				previousDateFormatString = null;
			}
			if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable == null && _contractResolver is DefaultContractResolver defaultContractResolver)
			{
				jsonTextReader.PropertyNameTable = defaultContractResolver.GetNameTable();
			}
		}

		private void ResetReader(JsonReader reader, CultureInfo? previousCulture, DateTimeZoneHandling? previousDateTimeZoneHandling, DateParseHandling? previousDateParseHandling, FloatParseHandling? previousFloatParseHandling, int? previousMaxDepth, string? previousDateFormatString)
		{
			if (previousCulture != null)
			{
				reader.Culture = previousCulture;
			}
			if (previousDateTimeZoneHandling.HasValue)
			{
				reader.DateTimeZoneHandling = previousDateTimeZoneHandling.GetValueOrDefault();
			}
			if (previousDateParseHandling.HasValue)
			{
				reader.DateParseHandling = previousDateParseHandling.GetValueOrDefault();
			}
			if (previousFloatParseHandling.HasValue)
			{
				reader.FloatParseHandling = previousFloatParseHandling.GetValueOrDefault();
			}
			if (_maxDepthSet)
			{
				reader.MaxDepth = previousMaxDepth;
			}
			if (_dateFormatStringSet)
			{
				reader.DateFormatString = previousDateFormatString;
			}
			if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable != null && _contractResolver is DefaultContractResolver defaultContractResolver && jsonTextReader.PropertyNameTable == defaultContractResolver.GetNameTable())
			{
				jsonTextReader.PropertyNameTable = null;
			}
		}

		public void Serialize(TextWriter textWriter, object? value)
		{
			Serialize(new JsonTextWriter(textWriter), value);
		}

		public void Serialize(JsonWriter jsonWriter, object? value, Type? objectType)
		{
			SerializeInternal(jsonWriter, value, objectType);
		}

		public void Serialize(TextWriter textWriter, object? value, Type objectType)
		{
			Serialize(new JsonTextWriter(textWriter), value, objectType);
		}

		public void Serialize(JsonWriter jsonWriter, object? value)
		{
			SerializeInternal(jsonWriter, value, null);
		}

		private TraceJsonReader CreateTraceJsonReader(JsonReader reader)
		{
			TraceJsonReader traceJsonReader = new TraceJsonReader(reader);
			if (reader.TokenType != 0)
			{
				traceJsonReader.WriteCurrentToken();
			}
			return traceJsonReader;
		}

		internal virtual void SerializeInternal(JsonWriter jsonWriter, object? value, Type? objectType)
		{
			ValidationUtils.ArgumentNotNull(jsonWriter, "jsonWriter");
			Formatting? formatting = null;
			if (_formatting.HasValue && jsonWriter.Formatting != _formatting)
			{
				formatting = jsonWriter.Formatting;
				jsonWriter.Formatting = _formatting.GetValueOrDefault();
			}
			DateFormatHandling? dateFormatHandling = null;
			if (_dateFormatHandling.HasValue && jsonWriter.DateFormatHandling != _dateFormatHandling)
			{
				dateFormatHandling = jsonWriter.DateFormatHandling;
				jsonWriter.DateFormatHandling = _dateFormatHandling.GetValueOrDefault();
			}
			DateTimeZoneHandling? dateTimeZoneHandling = null;
			if (_dateTimeZoneHandling.HasValue && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling)
			{
				dateTimeZoneHandling = jsonWriter.DateTimeZoneHandling;
				jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault();
			}
			FloatFormatHandling? floatFormatHandling = null;
			if (_floatFormatHandling.HasValue && jsonWriter.FloatFormatHandling != _floatFormatHandling)
			{
				floatFormatHandling = jsonWriter.FloatFormatHandling;
				jsonWriter.FloatFormatHandling = _floatFormatHandling.GetValueOrDefault();
			}
			StringEscapeHandling? stringEscapeHandling = null;
			if (_stringEscapeHandling.HasValue && jsonWriter.StringEscapeHandling != _stringEscapeHandling)
			{
				stringEscapeHandling = jsonWriter.StringEscapeHandling;
				jsonWriter.StringEscapeHandling = _stringEscapeHandling.GetValueOrDefault();
			}
			CultureInfo cultureInfo = null;
			if (_culture != null && !_culture.Equals(jsonWriter.Culture))
			{
				cultureInfo = jsonWriter.Culture;
				jsonWriter.Culture = _culture;
			}
			string dateFormatString = null;
			if (_dateFormatStringSet && jsonWriter.DateFormatString != _dateFormatString)
			{
				dateFormatString = jsonWriter.DateFormatString;
				jsonWriter.DateFormatString = _dateFormatString;
			}
			TraceJsonWriter traceJsonWriter = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? new TraceJsonWriter(jsonWriter) : null);
			new JsonSerializerInternalWriter(this).Serialize(traceJsonWriter ?? jsonWriter, value, objectType);
			if (traceJsonWriter != null)
			{
				TraceWriter.Trace(TraceLevel.Verbose, traceJsonWriter.GetSerializedJsonMessage(), null);
			}
			if (formatting.HasValue)
			{
				jsonWriter.Formatting = formatting.GetValueOrDefault();
			}
			if (dateFormatHandling.HasValue)
			{
				jsonWriter.DateFormatHandling = dateFormatHandling.GetValueOrDefault();
			}
			if (dateTimeZoneHandling.HasValue)
			{
				jsonWriter.DateTimeZoneHandling = dateTimeZoneHandling.GetValueOrDefault();
			}
			if (floatFormatHandling.HasValue)
			{
				jsonWriter.FloatFormatHandling = floatFormatHandling.GetValueOrDefault();
			}
			if (stringEscapeHandling.HasValue)
			{
				jsonWriter.StringEscapeHandling = stringEscapeHandling.GetValueOrDefault();
			}
			if (_dateFormatStringSet)
			{
				jsonWriter.DateFormatString = dateFormatString;
			}
			if (cultureInfo != null)
			{
				jsonWriter.Culture = cultureInfo;
			}
		}

		internal IReferenceResolver GetReferenceResolver()
		{
			if (_referenceResolver == null)
			{
				_referenceResolver = new DefaultReferenceResolver();
			}
			return _referenceResolver;
		}

		internal JsonConverter? GetMatchingConverter(Type type)
		{
			return GetMatchingConverter(_converters, type);
		}

		internal static JsonConverter? GetMatchingConverter(IList<JsonConverter>? converters, Type objectType)
		{
			if (converters != null)
			{
				for (int i = 0; i < converters.Count; i++)
				{
					JsonConverter jsonConverter = converters[i];
					if (jsonConverter.CanConvert(objectType))
					{
						return jsonConverter;
					}
				}
			}
			return null;
		}

		internal void OnError(Newtonsoft.Json.Serialization.ErrorEventArgs e)
		{
			this.Error?.Invoke(this, e);
		}
	}
	public class JsonSerializerSettings
	{
		internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error;

		internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore;

		internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include;

		internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include;

		internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto;

		internal const PreserveReferencesHandling DefaultPreserveReferencesHandling = PreserveReferencesHandling.None;

		internal const ConstructorHandling DefaultConstructorHandling = ConstructorHandling.Default;

		internal const TypeNameHandling DefaultTypeNameHandling = TypeNameHandling.None;

		internal const MetadataPropertyHandling DefaultMetadataPropertyHandling = MetadataPropertyHandling.Default;

		internal static readonly StreamingContext DefaultContext;

		internal const Formatting DefaultFormatting = Formatting.None;

		internal const DateFormatHandling DefaultDateFormatHandling = DateFormatHandling.IsoDateFormat;

		internal const DateTimeZoneHandling DefaultDateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;

		internal const DateParseHandling DefaultDateParseHandling = DateParseHandling.DateTime;

		internal const FloatParseHandling DefaultFloatParseHandling = FloatParseHandling.Double;

		internal const FloatFormatHandling DefaultFloatFormatHandling = FloatFormatHandling.String;

		internal const StringEscapeHandling DefaultStringEscapeHandling = StringEscapeHandling.Default;

		internal const TypeNameAssemblyFormatHandling DefaultTypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple;

		internal static readonly CultureInfo DefaultCulture;

		internal const bool DefaultCheckAdditionalContent = false;

		internal const string DefaultDateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK";

		internal const int DefaultMaxDepth = 64;

		internal Formatting? _formatting;

		internal DateFormatHandling? _dateFormatHandling;

		internal DateTimeZoneHandling? _dateTimeZoneHandling;

		internal DateParseHandling? _dateParseHandling;

		internal FloatFormatHandling? _floatFormatHandling;

		internal FloatParseHandling? _floatParseHandling;

		internal StringEscapeHandling? _stringEscapeHandling;

		internal CultureInfo? _culture;

		internal bool? _checkAdditionalContent;

		internal int? _maxDepth;

		internal bool _maxDepthSet;

		internal string? _dateFormatString;

		internal bool _dateFormatStringSet;

		internal TypeNameAssemblyFormatHandling? _typeNameAssemblyFormatHandling;

		internal DefaultValueHandling? _defaultValueHandling;

		internal PreserveReferencesHandling? _preserveReferencesHandling;

		internal NullValueHandling? _nullValueHandling;

		internal ObjectCreationHandling? _objectCreationHandling;

		internal MissingMemberHandling? _missingMemberHandling;

		internal ReferenceLoopHandling? _referenceLoopHandling;

		internal StreamingContext? _context;

		internal ConstructorHandling? _constructorHandling;

		internal TypeNameHandling? _typeNameHandling;

		internal MetadataPropertyHandling? _metadataPropertyHandling;

		public ReferenceLoopHandling ReferenceLoopHandling
		{
			get
			{
				return _referenceLoopHandling.GetValueOrDefault();
			}
			set
			{
				_referenceLoopHandling = value;
			}
		}

		public MissingMemberHandling MissingMemberHandling
		{
			get
			{
				return _missingMemberHandling.GetValueOrDefault();
			}
			set
			{
				_missingMemberHandling = value;
			}
		}

		public ObjectCreationHandling ObjectCreationHandling
		{
			get
			{
				return _objectCreationHandling.GetValueOrDefault();
			}
			set
			{
				_objectCreationHandling = value;
			}
		}

		public NullValueHandling NullValueHandling
		{
			get
			{
				return _nullValueHandling.GetValueOrDefault();
			}
			set
			{
				_nullValueHandling = value;
			}
		}

		public DefaultValueHandling DefaultValueHandling
		{
			get
			{
				return _defaultValueHandling.GetValueOrDefault();
			}
			set
			{
				_defaultValueHandling = value;
			}
		}

		public IList<JsonConverter> Converters { get; set; }

		public PreserveReferencesHandling PreserveReferencesHandling
		{
			get
			{
				return _preserveReferencesHandling.GetValueOrDef

plugins/TrophyHuntMod.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using HarmonyLib;
using Newtonsoft.Json;
using Splatform;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("TrophyHuntMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TrophyHuntMod")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("93c3a5ae-6334-4635-88ba-d61d730b4124")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
public class DiscordOAuthFlow
{
	public delegate void StatusCallback();

	private const string TokenEndpoint = "https://discord.com/api/oauth2/token";

	private const string UserEndpoint = "https://discord.com/api/users/@me";

	private HttpListener httpListener;

	private string m_clientId = string.Empty;

	private string m_redirectUri = string.Empty;

	private string m_code = string.Empty;

	private DiscordUserResponse m_userInfo;

	private bool VERBOSE;

	private StatusCallback m_statusCallback;

	public DiscordUserResponse GetUserResponse()
	{
		return m_userInfo;
	}

	public void ClearUserResponse()
	{
		m_userInfo = null;
	}

	public void StartOAuthFlow(string clientId, string redirectUri, StatusCallback callback)
	{
		m_clientId = clientId;
		m_redirectUri = redirectUri;
		m_statusCallback = callback;
		_ = VERBOSE;
		StartServer(redirectUri);
		OpenDiscordAuthorization(clientId, redirectUri);
	}

	private void OpenDiscordAuthorization(string clientId, string redirectUri)
	{
		_ = VERBOSE;
		string text = "identify";
		_ = VERBOSE;
		string fileName = "https://discord.com/oauth2/authorize?client_id=" + clientId + "&redirect_uri=" + Uri.EscapeDataString(redirectUri) + "&response_type=token&scope=" + text;
		Process.Start(new ProcessStartInfo
		{
			FileName = fileName,
			UseShellExecute = true
		});
	}

	private void StartServer(string redirectUri)
	{
		_ = VERBOSE;
		if (httpListener != null)
		{
			httpListener.Stop();
		}
		else
		{
			httpListener = new HttpListener();
			httpListener.Prefixes.Add("http://localhost:5000/");
		}
		httpListener.Start();
		Task.Run(() => ImplicitGrantWaitForCallback());
	}

	private void StopServer()
	{
		_ = VERBOSE;
		httpListener.Stop();
	}

	private async Task ImplicitGrantWaitForCallback()
	{
		_ = VERBOSE;
		HttpListenerRequest request;
		HttpListenerResponse response;
		while (true)
		{
			HttpListenerContext httpListenerContext = await httpListener.GetContextAsync();
			request = httpListenerContext.Request;
			response = httpListenerContext.Response;
			if (request.Url.AbsolutePath == "/callback" && string.IsNullOrEmpty(request.QueryString["token"]))
			{
				string callbackHtml = GetCallbackHtml();
				byte[] bytes = Encoding.UTF8.GetBytes(callbackHtml);
				response.ContentLength64 = bytes.Length;
				response.ContentType = "text/html";
				await response.OutputStream.WriteAsync(bytes, 0, bytes.Length);
				response.OutputStream.Close();
			}
			else if (request.QueryString["token"] != null)
			{
				break;
			}
		}
		string accessToken = request.QueryString["token"];
		_ = VERBOSE;
		string s = "<html>\r\n\r\n<body style=\"background-color:#202020;\\\">\r\n    <center>\r\n        <figure class=\"image image-style-align-left\\\"><img style=\"aspect-ratio:256/256;\" src=\"https://gcdn.thunderstore.io/live/repository/icons/oathorse-TrophyHuntMod-0.8.8.png.256x256_q95_crop.jpg\" width=\"256\\\" height=\"256\\\"></figure>\r\n        <p>&nbsp;</p>\r\n        <p><span style=\"color:#f0e080;font-size:22px;\"><strong>Congratulations! You've connected Discord to the TrophyHuntMod and have enabled online reporting!</p></strong></span>\r\n        \r\n        <p><span style=\"color:#e0e0e0;font-size:20px;\"><strong>Data reported by the mod can now be used in official Trophy Hunt Tournaments.</strong></span></p>\r\n        <p>&nbsp;</p>\r\n        <p><span style=\"color:#e0e0e0;font-size:22px;\"><strong>Only your Discord id and username are used, and not for anything but Trophy Hunt event leaderboards.</strong></span></p>\r\n        <p><span style=\"color:#e04040;font-size:20px;\"><strong>They will not be shared with anyone else.</strong></span></p>\r\n        <p>&nbsp;</p>\r\n        <p>&nbsp;</p>\r\n        <p><span style=\"color:#e0e0e0;font-size:24px;\\\"><strong>You can now close this window.</strong></span></p>\r\n    </center>\r\n</body>\r\n\r\n</html>";
		byte[] bytes2 = Encoding.UTF8.GetBytes(s);
		response.ContentLength64 = bytes2.Length;
		response.ContentType = "text/html";
		await response.OutputStream.WriteAsync(bytes2, 0, bytes2.Length);
		response.OutputStream.Close();
		StopServer();
		await ImplicitGrantGetDiscordUserInfo(accessToken);
		m_statusCallback();
	}

	private async Task ImplicitGrantGetDiscordUserInfo(string accessToken)
	{
		HttpClient client = new HttpClient();
		try
		{
			((HttpHeaders)client.DefaultRequestHeaders).Add("Authorization", "Bearer " + accessToken);
			HttpResponseMessage response = await client.GetAsync("https://discord.com/api/users/@me");
			string text = await response.Content.ReadAsStringAsync();
			_ = VERBOSE;
			if (response.IsSuccessStatusCode)
			{
				m_userInfo = JsonConvert.DeserializeObject<DiscordUserResponse>(text);
			}
			else
			{
				_ = VERBOSE;
			}
		}
		finally
		{
			((IDisposable)client)?.Dispose();
		}
	}

	private string GetCallbackHtml()
	{
		return "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <title>Discord Auth</title>\r\n    <script>\r\n        window.onload = function() {\r\n            const params = new URLSearchParams(window.location.hash.substr(1));\r\n            const accessToken = params.get('access_token');\r\n            if (accessToken) {\r\n                window.location.href = 'http://localhost:5000/callback?token=' + encodeURIComponent(accessToken);\r\n            } else {\r\n                document.body.innerHTML = '<h2>Error: No access token found.</h2>';\r\n            }\r\n        };\r\n    </script>\r\n</head>\r\n<body>\r\n    <h2>Authenticating...</h2>\r\n</body>\r\n</html>";
	}
}
public class DiscordUserResponse
{
	public Sprite avatarSprite;

	public string id { get; set; }

	public string username { get; set; }

	public string discriminator { get; set; }

	public string avatar { get; set; }

	public string global_name { get; set; }
}
public class MainThreadDispatcher : MonoBehaviour
{
	private static MainThreadDispatcher _instance;

	private readonly Queue<Action> _actions = new Queue<Action>();

	public static MainThreadDispatcher Instance
	{
		get
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			if ((Object)(object)_instance == (Object)null)
			{
				GameObject val = new GameObject("MainThreadDispatcher");
				_instance = val.AddComponent<MainThreadDispatcher>();
				Object.DontDestroyOnLoad((Object)val);
			}
			return _instance;
		}
	}

	private void Update()
	{
		lock (_actions)
		{
			while (_actions.Count > 0)
			{
				_actions.Dequeue()?.Invoke();
			}
		}
	}

	public void Enqueue(Action action)
	{
		if (action == null)
		{
			return;
		}
		lock (_actions)
		{
			_actions.Enqueue(action);
		}
	}
}
namespace TrophyHuntMod;

[BepInPlugin("com.oathorse.TrophyHuntMod", "TrophyHuntMod", "0.9.14")]
public class TrophyHuntMod : BaseUnityPlugin
{
	public enum Biome
	{
		Meadows,
		Forest,
		Swamp,
		Mountains,
		Plains,
		Mistlands,
		Ashlands,
		Ocean,
		Hildir,
		Bogwitch
	}

	public struct TrophyHuntDataScoreOverride
	{
		public TrophyGameMode m_gameMode;

		public string m_trophyName;

		public int m_score;

		public TrophyHuntDataScoreOverride(TrophyGameMode gameMode, string trophyName, int score)
		{
			m_gameMode = gameMode;
			m_trophyName = trophyName;
			m_score = score;
		}
	}

	public struct TrophyHuntData
	{
		public string m_name;

		public string m_prettyName;

		public Biome m_biome;

		private int m_value;

		public float m_dropPercent;

		public List<string> m_enemies;

		public TrophyHuntData(string name, string prettyName, Biome biome, int value, float dropPercent, List<string> enemies)
		{
			m_name = name;
			m_prettyName = prettyName;
			m_biome = biome;
			m_value = value;
			m_dropPercent = dropPercent;
			m_enemies = enemies;
		}

		public int GetCurGameModeTrophyScoreValue()
		{
			int result = m_value;
			TrophyHuntDataScoreOverride[] _m_trophyHuntScoreOverrides = __m_trophyHuntScoreOverrides;
			for (int i = 0; i < _m_trophyHuntScoreOverrides.Length; i++)
			{
				TrophyHuntDataScoreOverride trophyHuntDataScoreOverride = _m_trophyHuntScoreOverrides[i];
				if (trophyHuntDataScoreOverride.m_gameMode == GetGameMode() && trophyHuntDataScoreOverride.m_trophyName == m_name)
				{
					result = trophyHuntDataScoreOverride.m_score;
					break;
				}
			}
			return result;
		}
	}

	public struct BiomeBonus
	{
		public Biome m_biome;

		public string m_biomeName;

		public int m_bonus;

		public List<string> m_trophies;

		public BiomeBonus(Biome biome, string biomeName, int bonus, List<string> trophies)
		{
			m_biome = biome;
			m_biomeName = biomeName;
			m_bonus = bonus;
			m_trophies = trophies;
		}
	}

	public enum TrophyGameMode
	{
		TrophyHunt,
		TrophyRush,
		TrophySaga,
		CulinarySaga,
		CasualSaga,
		TrophyFiesta,
		Max
	}

	public struct DropInfo
	{
		public int m_numKilled;

		public int m_trophies;

		public DropInfo()
		{
			m_numKilled = 0;
			m_trophies = 0;
			m_numKilled = 0;
			m_trophies = 0;
		}
	}

	[HarmonyPatch(typeof(Game), "SavePlayerProfile")]
	public class Game_SavePlayerProfile_Patch
	{
		private static void Prefix(PlayerProfile __instance, bool setLogoutPoint)
		{
			SavePersistentData();
		}
	}

	public class THMSaveData
	{
		public class THMSaveDataDropInfo
		{
			public string m_name;

			public DropInfo m_dropInfo;
		}

		public class THMSaveDataSpecialSagaDropCount
		{
			public string m_name;

			public int m_dropCount;

			public int m_numPickedUp;
		}

		public List<THMSaveDataDropInfo> m_playerTrophyDropInfos;

		public List<THMSaveDataDropInfo> m_allTrophyDropInfos;

		public List<Vector3> m_playerPathData;

		public long m_gameTimerElapsedSeconds;

		public bool m_gameTimerActive;

		public bool m_gameTimerVisible;

		public bool m_gameTimerCountdown;

		public int m_slashDieCount;

		public int m_logoutCount;

		public List<THMSaveDataSpecialSagaDropCount> m_specialSagaDropCounts;

		public long m_storedPlayerID;

		public TrophyGameMode m_storedGameMode;

		public string m_storedWorldSeed;

		public List<string> m_cookedFoods;

		public List<PlayerEventLog> m_playerEventLog;
	}

	[HarmonyPatch(typeof(Player), "OnSpawned")]
	public class Player_OnSpawned_Patch
	{
		private static void Postfix(Player __instance)
		{
			if (!((Object)(object)__instance != (Object)(object)Player.m_localPlayer))
			{
				Array.Sort(__m_trophyHuntData, (TrophyHuntData x, TrophyHuntData y) => x.m_biome.CompareTo(y.m_biome) * 100000 + x.GetCurGameModeTrophyScoreValue().CompareTo(y.GetCurGameModeTrophyScoreValue()) * 10000 + x.m_name.CompareTo(y.m_name));
				__m_trophyCache = Player.m_localPlayer.GetTrophies();
				if (__m_showAllTrophyStats || __m_ignoreLogouts || GetGameMode() == TrophyGameMode.TrophyFiesta || GetGameMode() == TrophyGameMode.CulinarySaga || GetGameMode() == TrophyGameMode.CasualSaga || Game.instance.GetPlayerProfile().m_usedCheats || Game.instance.GetPlayerProfile().m_playerStats[(PlayerStatType)4] > 0f)
				{
					__m_invalidForTournamentPlay = true;
				}
				__m_fiestaFlashing = false;
				BuildUIElements();
				if (GetTotalOnFootDistance(Game.instance) < 10f)
				{
					__m_logoutCount = 0;
				}
				if (__m_storedPlayerID != Player.m_localPlayer.GetPlayerID() || __m_storedGameMode != __m_trophyGameMode || __m_storedWorldSeed != WorldGenerator.instance.m_world.m_seedName)
				{
					InitializeTrackedDataForNewPlayer();
				}
				string currentDirectory = Directory.GetCurrentDirectory();
				Debug.Log((object)("Working Directory for Trophy Hunt Mod: " + currentDirectory));
				__m_storedPlayerID = Player.m_localPlayer.GetPlayerID();
				__m_storedGameMode = __m_trophyGameMode;
				__m_storedWorldSeed = WorldGenerator.instance.m_world.m_seedName;
				if (!IsSagaMode())
				{
					__m_gameTimerVisible = false;
				}
				else
				{
					__m_gameTimerVisible = false;
				}
				LoadPersistentData();
				UpdateModUI(Player.m_localPlayer);
				ShowPlayerPath(showPlayerPath: false);
				StopCollectingPlayerPath();
				StartCollectingPlayerPath();
				GetGameMode();
				_ = 5;
				__m_refreshLogsAndStandings = true;
				PostStandingsRequest();
			}
		}
	}

	[HarmonyPatch(typeof(Skills), "GetSkill")]
	public class Skills_Learn_Patch
	{
		private static void Postfix(Skill __instance, SkillType skillType, ref Skill __result)
		{
			if (IsSagaMode() && __result.m_level < 20f)
			{
				__result.m_level = 20f;
				__result.m_accumulator = 0f;
			}
		}
	}

	[HarmonyPatch(typeof(Player), "AddTrophy", new Type[] { typeof(ItemData) })]
	public static class Player_AddTrophy_Patch
	{
		public static void Postfix(Player __instance, ItemData item)
		{
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)__instance != (Object)null) || item == null)
			{
				return;
			}
			string name = ((Object)item.m_dropPrefab).name;
			if (!(__m_trophyCache.Find((string trophyName) => trophyName == name) != name))
			{
				return;
			}
			FlashTrophy(name);
			__m_trophyCache = __instance.GetTrophies();
			if (GetGameMode() == TrophyGameMode.TrophyRush)
			{
				if (UpdateBiomeBonusTrophies(name))
				{
					MessageHud.instance.ShowBiomeFoundMsg("Biome Bonus", true);
					FlashBiomeTrophies(name);
				}
			}
			else if (GetGameMode() == TrophyGameMode.TrophySaga && __m_trophyCache.Count == __m_trophyHuntData.Length)
			{
				MessageHud.instance.ShowBiomeFoundMsg("Odin is Pleased", true);
			}
			UpdateModUI(__instance);
			AddPlayerEvent(PlayerEventType.Trophy, name, ((Component)__instance).transform.position);
		}
	}

	[Serializable]
	public class LeaderboardDataEx
	{
		public string event_name;

		public string event_data;
	}

	[Serializable]
	public class LeaderboardData
	{
		public string player_name;

		public int current_score;

		public string session_id;

		public string player_location;

		public string trophies;

		public int deaths;

		public int logouts;

		public string gamemode;
	}

	[HarmonyPatch(typeof(Game), "Logout", new Type[]
	{
		typeof(bool),
		typeof(bool)
	})]
	public static class Game_Logout_Patch
	{
		public static void Postfix(Game __instance, bool save, bool changeToStartScene)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)Player.m_localPlayer == (Object)null)
			{
				return;
			}
			float totalOnFootDistance = GetTotalOnFootDistance(__instance);
			if ((__m_logoutCount >= 1 || !(totalOnFootDistance < 50f)) && !__m_ignoreLogouts)
			{
				__m_logoutCount++;
				AddPlayerEvent(PlayerEventType.Misc, "PenaltyLogout", ((Component)Player.m_localPlayer).transform.position);
				if ((Object)(object)Game.instance != (Object)null)
				{
					Game.instance.SavePlayerProfile(true);
				}
			}
		}
	}

	public struct LuckRating
	{
		public float m_percent;

		public string m_luckString;

		public string m_colorString;

		public LuckRating(float percent, string luckString, string colorStr)
		{
			m_percent = 0f;
			m_luckString = "<n/a>";
			m_colorString = "white";
			m_percent = percent;
			m_luckString = luckString;
			m_colorString = colorStr;
		}
	}

	public struct SpecialSagaDrop
	{
		public string m_itemName;

		public float m_dropPercent;

		public int m_dropAmountMin;

		public int m_dropAmountMax;

		public bool m_dropOnlyOne;

		public bool m_stopDroppingOnPickup;

		public TrophyGameMode m_onlyInMode;

		public int m_numDropped;

		public int m_numPickedUp;

		public SpecialSagaDrop(string itemName, float dropPercent, int dropAmountMin, int dropAmountMax, bool dropOnlyOne = false, bool stopDroppingOnPickup = false, TrophyGameMode onlyInMode = TrophyGameMode.Max)
		{
			m_itemName = itemName;
			m_dropPercent = dropPercent;
			m_dropAmountMin = dropAmountMin;
			m_dropAmountMax = dropAmountMax;
			m_dropOnlyOne = dropOnlyOne;
			m_stopDroppingOnPickup = stopDroppingOnPickup;
			m_numDropped = 0;
			m_numPickedUp = 0;
			m_onlyInMode = onlyInMode;
		}
	}

	[HarmonyPatch(typeof(CharacterDrop), "GenerateDropList")]
	private class CharacterDrop_GenerateDropList_Patch
	{
		private static void Postfix(CharacterDrop __instance, ref List<KeyValuePair<GameObject, int>> __result)
		{
			if (!((Object)(object)__instance != (Object)null))
			{
				return;
			}
			string name = ((Component)__instance).GetComponent<Character>().m_name;
			Debug.LogError((object)$"CharacterDrop_GenerateDropList_Patch: {name} has dropped items: {__result?.Count}");
			if (CharacterCanDropTrophies(name))
			{
				RecordTrophyCapableKill(name, killedByPlayer: false);
				bool flag = false;
				if (__result != null)
				{
					foreach (KeyValuePair<GameObject, int> item3 in __result)
					{
						string name2 = ((Object)item3.Key).name;
						if (name2.Contains("Trophy"))
						{
							RecordDroppedTrophy(name, name2);
							flag = true;
							break;
						}
					}
				}
				else
				{
					Debug.Log((object)("Trophy-capable character " + name + " had null drop list"));
				}
				if (!flag)
				{
					float num = 0f;
					if (GetGameMode() == TrophyGameMode.TrophyRush || (IsSagaMode() && GetGameMode() != TrophyGameMode.CasualSaga))
					{
						string text = EnemyNameToTrophyName(name);
						if (!__m_trophyCache.Contains(text) || text == "TrophyDeer")
						{
							num = 100f;
						}
					}
					if ((float)new Random().NextDouble() * 100f < num)
					{
						string trophyName = EnemyNameToTrophyName(name);
						Drop val = __instance.m_drops.Find((Drop theDrop) => ((Object)theDrop.m_prefab).name == trophyName);
						if (val != null)
						{
							KeyValuePair<GameObject, int> item = new KeyValuePair<GameObject, int>(val.m_prefab, 1);
							if (__result == null)
							{
								__result = new List<KeyValuePair<GameObject, int>>();
							}
							__result.Add(item);
							RecordDroppedTrophy(name, trophyName);
						}
					}
				}
			}
			if (!IsSagaMode() || !__m_specialSagaDrops.ContainsKey(name))
			{
				return;
			}
			List<SpecialSagaDrop> list = __m_specialSagaDrops[name];
			Random random = new Random(Guid.NewGuid().GetHashCode());
			for (int i = 0; i < list.Count; i++)
			{
				SpecialSagaDrop value = list[i];
				if (value.m_onlyInMode != TrophyGameMode.Max && GetGameMode() != value.m_onlyInMode)
				{
					Debug.LogWarning((object)(value.m_itemName + " Ignored"));
					continue;
				}
				bool flag2 = false;
				if (value.m_dropOnlyOne)
				{
					flag2 = HasAnyoneDropped(value.m_itemName);
				}
				if (value.m_stopDroppingOnPickup)
				{
					flag2 = HasBeenPickedUp(value.m_itemName);
				}
				if (flag2 || !((float)random.NextDouble() * 100f < value.m_dropPercent))
				{
					continue;
				}
				GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(value.m_itemName);
				if ((Object)(object)itemPrefab != (Object)null)
				{
					int num2 = random.Next(value.m_dropAmountMin, value.m_dropAmountMax);
					KeyValuePair<GameObject, int> item2 = new KeyValuePair<GameObject, int>(itemPrefab, num2);
					if (__result != null)
					{
						__result.Add(item2);
						Debug.LogWarning((object)$"{name} dropping {num2} {value.m_itemName}");
						value.m_numDropped += num2;
						list[i] = value;
					}
				}
			}
		}
	}

	[HarmonyPatch(typeof(Character), "OnDeath")]
	public class Character_OnDeath_Patch
	{
		private static void Postfix(Character __instance)
		{
			if (GetGameMode() == TrophyGameMode.CulinarySaga)
			{
				return;
			}
			bool flag = false;
			if ((Object)(object)Player.m_localPlayer != (Object)null && __instance.m_lastHit != null && (Object)(object)__instance.m_lastHit.GetAttacker() == (Object)(object)Player.m_localPlayer)
			{
				flag = true;
			}
			if (flag)
			{
				string name = __instance.m_name;
				if (CharacterCanDropTrophies(name))
				{
					RecordTrophyCapableKill(name, killedByPlayer: true);
				}
			}
		}
	}

	[HarmonyPatch(typeof(ItemData), "GetWeight")]
	public class Humanoid_ItemDrop_ItemData_GetWeight_Patch
	{
		private static bool Prefix(ItemData __instance, ref float __result)
		{
			if (!IsSagaMode())
			{
				return true;
			}
			if (__instance == null)
			{
				return true;
			}
			if ((Object)(object)__instance.m_dropPrefab == (Object)null)
			{
				return true;
			}
			if (__m_oreNameToBarPrefabName.TryGetValue(((Object)__instance.m_dropPrefab).name, out var value))
			{
				ItemData itemData = ZNetScene.instance.GetPrefab(value).GetComponent<ItemDrop>().m_itemData;
				if (itemData != null)
				{
					__result = itemData.m_shared.m_weight * (float)__instance.m_stack;
				}
				return false;
			}
			return true;
		}
	}

	[HarmonyPatch(typeof(ItemData), "GetNonStackedWeight")]
	public class Humanoid_ItemDrop_ItemData_GetNonStackedWeight_Patch
	{
		private static bool Prefix(ItemData __instance, ref float __result)
		{
			if (!IsSagaMode())
			{
				return true;
			}
			if (__instance == null)
			{
				return true;
			}
			if ((Object)(object)__instance.m_dropPrefab == (Object)null)
			{
				return true;
			}
			if (__m_oreNameToBarPrefabName.TryGetValue(((Object)__instance.m_dropPrefab).name, out var value))
			{
				ItemData itemData = ZNetScene.instance.GetPrefab(value).GetComponent<ItemDrop>().m_itemData;
				if (itemData != null)
				{
					__result = itemData.m_shared.m_weight;
				}
				return false;
			}
			return true;
		}
	}

	[HarmonyPatch(typeof(Inventory), "AddItem", new Type[] { typeof(ItemData) })]
	public static class Inventory_AddItem_Patch
	{
		private static void Prefix(Inventory __instance, ref ItemData item, bool __result)
		{
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			if (__instance == null || !((Object)(object)Player.m_localPlayer != (Object)null) || __instance != ((Humanoid)Player.m_localPlayer).GetInventory())
			{
				return;
			}
			if (IsSagaMode())
			{
				if (__m_instaSmelt)
				{
					ConvertMetal(ref item);
				}
				if (GetGameMode() == TrophyGameMode.CulinarySaga)
				{
					bool flag = false;
					ConsumableData[] _m_cookedFoodData = __m_cookedFoodData;
					for (int i = 0; i < _m_cookedFoodData.Length; i++)
					{
						if (_m_cookedFoodData[i].m_prefabName == ((Object)item.m_dropPrefab).name)
						{
							flag = true;
							break;
						}
					}
					if (flag && !__m_cookedFoods.Contains(((Object)item.m_dropPrefab).name))
					{
						FlashTrophy(((Object)item.m_dropPrefab).name);
						__m_cookedFoods.Add(((Object)item.m_dropPrefab).name);
						if (__m_cookedFoods.Count == __m_cookedFoodData.Length)
						{
							MessageHud.instance.ShowBiomeFoundMsg("Odin is Sated", true);
						}
					}
					UpdateModUI(Player.m_localPlayer);
				}
			}
			string text = ((Object)item.m_dropPrefab).name;
			if (item.m_quality > 1)
			{
				text += item.m_quality;
			}
			AddPlayerEvent(PlayerEventType.Item, text, ((Component)Player.m_localPlayer).transform.position);
		}
	}

	[HarmonyPatch(typeof(Inventory), "AddItem", new Type[]
	{
		typeof(string),
		typeof(int),
		typeof(int),
		typeof(int),
		typeof(long),
		typeof(string),
		typeof(Vector2i),
		typeof(bool)
	})]
	public class UpgradeItemPatch
	{
		private static void Postfix(Inventory __instance, string name, int stack, int quality, int variant, long crafterID, string crafterName, Vector2i position, bool pickedUp)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			if (__instance != null)
			{
				string text = name;
				if (quality > 1)
				{
					text += quality;
				}
				AddPlayerEvent(PlayerEventType.Item, text, ((Component)Player.m_localPlayer).transform.position);
			}
		}
	}

	[HarmonyPatch(typeof(Inventory), "CanAddItem", new Type[]
	{
		typeof(ItemData),
		typeof(int)
	})]
	public static class Inventory_CanAddItem_Patch
	{
		private static bool Prefix(Inventory __instance, ref ItemData item, int stack, ref bool __result)
		{
			if (__instance != null && (Object)(object)Player.m_localPlayer != (Object)null && __instance == ((Humanoid)Player.m_localPlayer).GetInventory() && IsSagaMode() && __m_instaSmelt && item != null && (Object)(object)item.m_dropPrefab != (Object)null)
			{
				string name = ((Object)item.m_dropPrefab).name;
				if (__m_oreNameToBarItemName.TryGetValue(name, out var value))
				{
					if (stack <= 0)
					{
						stack = item.m_stack;
					}
					__result = __instance.FindFreeStackSpace(value, 0f) + (__instance.m_width * __instance.m_height - __instance.m_inventory.Count) * item.m_shared.m_maxStackSize >= stack;
					return false;
				}
			}
			return true;
		}
	}

	[HarmonyPatch(typeof(Humanoid), "Pickup")]
	public class Humanoid_Pickup_Patch
	{
		private static void Prefix(Humanoid __instance, GameObject go, bool autoequip, bool autoPickupDelay, bool __result)
		{
			if ((Object)(object)__instance == (Object)null || (Object)(object)__instance != (Object)(object)Player.m_localPlayer)
			{
				return;
			}
			ItemDrop component = go.GetComponent<ItemDrop>();
			if (!((Object)(object)component != (Object)null) || !IsSagaMode())
			{
				return;
			}
			if (__m_instaSmelt)
			{
				ConvertMetal(ref component.m_itemData);
			}
			if (component.m_itemData == null || !((Object)(object)component.m_itemData.m_dropPrefab != (Object)null))
			{
				return;
			}
			string name = ((Object)component.m_itemData.m_dropPrefab).name;
			foreach (KeyValuePair<string, List<SpecialSagaDrop>> _m_specialSagaDrop in __m_specialSagaDrops)
			{
				string key = _m_specialSagaDrop.Key;
				List<SpecialSagaDrop> list = __m_specialSagaDrops[key];
				for (int i = 0; i < list.Count; i++)
				{
					SpecialSagaDrop value = list[i];
					if (value.m_itemName == name && value.m_stopDroppingOnPickup)
					{
						Debug.LogError((object)("Humanoid.Pickup() SpecialSagaDrop for " + name + " found in list for " + key));
						Debug.LogError((object)$"Player has picked up {value.m_numPickedUp} {name}");
						value.m_numPickedUp++;
					}
					list[i] = value;
				}
				foreach (SpecialSagaDrop item in __m_specialSagaDrops[key])
				{
					if (item.m_itemName == name && item.m_stopDroppingOnPickup)
					{
						Debug.LogError((object)$"{key} m_numPickedUp for {item.m_itemName} is {item.m_numPickedUp}");
					}
				}
			}
		}

		private static void Postfix(Humanoid __instance, GameObject go, bool autoequip, bool autoPickupDelay, bool __result)
		{
			if (!((Object)(object)__instance == (Object)null) && !((Object)(object)go == (Object)null) && GetGameMode() != TrophyGameMode.CulinarySaga)
			{
				ItemData itemData = go.GetComponent<ItemDrop>().m_itemData;
				if (__result && itemData != null && (Object)(object)itemData.m_dropPrefab != (Object)null)
				{
					RecordPlayerPickedUpTrophy(((Object)itemData.m_dropPrefab).name);
				}
			}
		}
	}

	[HarmonyPatch(typeof(Player), "PlacePiece")]
	public class PlacePiecePatch
	{
		private static void Postfix(Player __instance, Piece piece)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)__instance == (Object)null) && (Object)(object)piece != (Object)null)
			{
				AddPlayerEvent(PlayerEventType.Build, piece.m_name, ((Component)__instance).transform.position);
			}
		}
	}

	public enum PlayerEventType
	{
		None,
		Trophy,
		Build,
		Item,
		Misc,
		Max
	}

	[Serializable]
	public class PlayerEventLog
	{
		public PlayerEventType eventType;

		public string eventName = "";

		public Vector3 eventPos = Vector3.zero;

		public DateTime eventTime = DateTime.MinValue;

		public PlayerEventLog()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			eventType = PlayerEventType.None;
			eventName = "";
			eventPos = Vector3.zero;
			eventTime = DateTime.MinValue;
		}

		public PlayerEventLog(PlayerEventType _eventType, string _eventName, Vector3 _eventPos, DateTime _eventTime)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			eventType = _eventType;
			eventName = _eventName;
			eventPos = _eventPos;
			eventTime = _eventTime;
		}
	}

	public struct EventDescription
	{
		public PlayerEventType eventType;

		public List<string> legalEvents;

		public EventDescription(PlayerEventType _eventType, List<string> _legalEvents)
		{
			eventType = _eventType;
			legalEvents = _legalEvents;
		}
	}

	[Serializable]
	public class TrackLogEntry
	{
		public string id;

		public string seed;

		public int score;

		public string code;
	}

	[Serializable]
	public class TrackLogs
	{
		public string id;

		public string user;

		public string seed;

		public string mode;

		public int score;

		public List<TrackLogsElement> logs;
	}

	[Serializable]
	public class TrackLogsElement
	{
		public string code;

		public string at;
	}

	[Serializable]
	public class TrackHunt
	{
		public string id;

		public string user;

		public string seed;

		public string mode;

		public int score;

		public int deaths;

		public int relogs;

		public int slashdies;

		public List<string> trophies;
	}

	public enum TournamentStatus
	{
		NotRunning = 0,
		Live = 20,
		Over = 30
	}

	public class TournamentPlayerInfo
	{
		public string name;

		public int score;

		public string id;

		public TournamentPlayerInfo(string _name, int _score, string _id)
		{
			name = _name;
			score = _score;
			id = _id;
		}
	}

	[Serializable]
	public class TrackStandingsPlayer
	{
		public string name = "";

		public string id = "";

		public string avatarUrl = "";

		public int score;
	}

	[Serializable]
	public class TrackStandings
	{
		public string name = "";

		public string mode = "";

		public string startAt = "";

		public string endAt = "";

		public int status;

		public List<TrackStandingsPlayer> players = new List<TrackStandingsPlayer>();
	}

	[HarmonyPatch(typeof(FejdStartup), "Start")]
	public class FejdStartup_Start_Patch
	{
		private static void Postfix()
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Expected O, but got Unknown
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = GameObject.Find("Menu");
			if ((Object)(object)val != (Object)null)
			{
				GameObject obj = GameObject.Find("Topic");
				__m_globalFontObject = ((TMP_Text)((obj != null) ? obj.GetComponent<TextMeshProUGUI>() : null)).font;
				Transform val2 = val.transform.Find("Logo");
				if ((Object)(object)val2 != (Object)null)
				{
					GameObject val3 = new GameObject("TrophyHuntModLogoText");
					val3.transform.SetParent(val2.parent);
					RectTransform obj2 = val3.AddComponent<RectTransform>();
					((Transform)obj2).localScale = Vector3.one;
					obj2.anchorMin = new Vector2(0.5f, 0.6f);
					obj2.anchorMax = new Vector2(1f, 0.6f);
					obj2.pivot = new Vector2(1f, 1f);
					obj2.anchoredPosition = new Vector2(-20f, 20f);
					obj2.sizeDelta = new Vector2(-650f, 185f);
					__m_trophyHuntMainMenuText = AddTextMeshProComponent(val3);
					((TMP_Text)__m_trophyHuntMainMenuText).font = __m_globalFontObject;
					((TMP_Text)__m_trophyHuntMainMenuText).fontMaterial = ((TMP_Asset)__m_globalFontObject).material;
					((TMP_Text)__m_trophyHuntMainMenuText).fontStyle = (FontStyles)1;
					((TMP_Text)__m_trophyHuntMainMenuText).text = GetTrophyHuntMainMenuText();
					((TMP_Text)__m_trophyHuntMainMenuText).alignment = (TextAlignmentOptions)513;
					((TMP_Text)__m_trophyHuntMainMenuText).lineSpacingAdjustment = -5f;
					AddToggleGameModeButton(val3.transform);
					AddLoginWithDiscordButton(val3.transform);
				}
				else
				{
					Debug.LogWarning((object)"Valheim logo not found!");
				}
			}
			else
			{
				Debug.LogWarning((object)"Main menu not found!");
			}
		}
	}

	[HarmonyPatch(typeof(FejdStartup), "OnNewWorldDone", new Type[] { typeof(bool) })]
	public class FejdStartup_OnNewWorldDone_Patch
	{
		private static void Postfix(FejdStartup __instance, bool forceLocal)
		{
			if (FejdStartup.m_instance.m_world != null)
			{
				if (GetGameMode() == TrophyGameMode.TrophyRush)
				{
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Clear();
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("playerdamage 70");
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("enemydamage 200");
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("enemyspeedsize 120");
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("enemyleveluprate 140");
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("resourcerate 200");
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("preset combat_veryhard:deathpenalty_default: resources_muchmore: raids_default: portals_default");
					FejdStartup.m_instance.m_world.SaveWorldMetaData(DateTime.Now);
					__instance.UpdateWorldList(true);
				}
				else if (IsSagaMode())
				{
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Clear();
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("resourcerate 200");
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("eventrate 0");
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("teleportall");
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("preset combat_default:deathpenalty_default:resources_muchmore:raids_none:portals_casual");
					FejdStartup.m_instance.m_world.SaveWorldMetaData(DateTime.Now);
					__instance.UpdateWorldList(true);
				}
				else if (GetGameMode() == TrophyGameMode.TrophyFiesta)
				{
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Clear();
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("enemyspeedsize 200");
					FejdStartup.m_instance.m_world.m_startingGlobalKeys.Add("enemyleveluprate 300");
					FejdStartup.m_instance.m_world.SaveWorldMetaData(DateTime.Now);
					__instance.UpdateWorldList(true);
				}
			}
		}
	}

	[HarmonyPatch(typeof(ConsoleCommand), "RunAction", new Type[] { typeof(ConsoleEventArgs) })]
	public static class ConsoleCommand_RunAction_Patch
	{
		private static void Postfix(ConsoleEventArgs args)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)Player.m_localPlayer != (Object)null))
			{
				return;
			}
			if (args.Length > 0 && args[0] == "die")
			{
				__m_slashDieCount++;
				AddPlayerEvent(PlayerEventType.Misc, "PenaltySlashDie", ((Component)Player.m_localPlayer).transform.position);
			}
			if (args.Length > 0 && args[0] == "devcommands")
			{
				__m_invalidForTournamentPlay = true;
				if ((Object)(object)__m_scoreTextElement != (Object)null)
				{
					((Graphic)__m_scoreTextElement.GetComponent<TextMeshProUGUI>()).color = Color.green;
				}
				UpdateModUI(Player.m_localPlayer);
			}
		}
	}

	[HarmonyPatch(typeof(Player), "OnDeath")]
	public static class Patch_Player_OnDeath
	{
		private static void Prefix(Player __instance)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance != (Object)null)
			{
				AddPlayerEvent(PlayerEventType.Misc, "PenaltyDeath", ((Component)__instance).transform.position);
			}
		}
	}

	[HarmonyPatch(typeof(Ship), "GetSailForce")]
	public class Ship_GetSailForce_Patch
	{
		private static void Postfix(ref Vector3 __result)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			if (IsSagaMode())
			{
				__result *= __m_sagaSailingSpeedMultiplier;
			}
		}
	}

	[HarmonyPatch(typeof(Ship), "Awake")]
	public class Ship_Awake_Patch
	{
		private static void Postfix(Ship __instance)
		{
			if (IsSagaMode())
			{
				__instance.m_backwardForce *= __m_sagaPaddlingSpeedMultiplier;
			}
		}
	}

	[HarmonyPatch(typeof(TreeBase), "Damage")]
	public static class TreeBase_Damage_Patch
	{
		private static void Prefix(TreeBase __instance, ref HitData hit)
		{
			if (__m_elderPowerCutsAllTrees)
			{
				Player localPlayer = Player.m_localPlayer;
				if ((Object)(object)localPlayer != (Object)null && localPlayer.GetGuardianPowerName() == "GP_TheElder" && localPlayer.m_guardianPowerCooldown > 0f)
				{
					hit.m_toolTier = (short)__instance.m_minToolTier;
				}
			}
		}
	}

	[HarmonyPatch(typeof(TreeLog), "Damage")]
	public static class TreeLog_Damage_Patch
	{
		private static void Prefix(TreeLog __instance, ref HitData hit)
		{
			if (__m_elderPowerCutsAllTrees)
			{
				Player localPlayer = Player.m_localPlayer;
				if ((Object)(object)localPlayer != (Object)null && localPlayer.GetGuardianPowerName() == "GP_TheElder" && localPlayer.m_guardianPowerCooldown > 0f)
				{
					hit.m_toolTier = (short)__instance.m_minToolTier;
				}
			}
		}
	}

	[HarmonyPatch(typeof(Fermenter), "Awake")]
	public static class Fermenter_AddItem_Patch
	{
		private static void Postfix(Fermenter __instance)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode())
			{
				__instance.m_fermentationDuration = 10f;
			}
		}
	}

	[HarmonyPatch(typeof(Fermenter), "DelayedTap")]
	public static class Fermenter_DelayedTap_Patch
	{
		private static void Prefix(Fermenter __instance)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode())
			{
				ItemConversion itemConversion = __instance.GetItemConversion(__instance.m_delayedTapItem);
				if (itemConversion != null)
				{
					itemConversion.m_producedItems = 9;
				}
			}
		}
	}

	[HarmonyPatch(typeof(Plant), "TimeSincePlanted")]
	public static class Plant_GetGrowTime_Patch
	{
		private static void Postfix(Plant __instance, ref double __result)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode())
			{
				__result = (double)__instance.m_growTimeMax + 1.0;
			}
		}
	}

	[HarmonyPatch(typeof(Smelter), "Awake")]
	public static class Smelter_Awake_Patch
	{
		private static void Postfix(Smelter __instance)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode())
			{
				if (__instance.m_name.Contains("eitr"))
				{
					__instance.m_secPerProduct = 1f;
				}
				else if (!__instance.m_name.Contains("bathtub") && !__instance.m_name.Contains("batteringram"))
				{
					__instance.m_secPerProduct = 0.03f;
				}
			}
		}
	}

	[HarmonyPatch(typeof(Smelter), "OnAddFuel")]
	public static class Smelter_OnAddFuel_Patch
	{
		private static void Postfix(Smelter __instance, Switch sw, Humanoid user, ItemData item, bool __result)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode() && __instance.m_name.Contains("eitr") && __instance.GetQueueSize() < __instance.m_maxOre)
			{
				__instance.m_nview.InvokeRPC("RPC_AddOre", new object[1] { "Softtissue" });
			}
		}
	}

	[HarmonyPatch(typeof(SapCollector), "Awake")]
	public static class SapCollector_Awake_Patch
	{
		private static void Postfix(SapCollector __instance)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode())
			{
				__instance.m_secPerUnit = 0.1f;
			}
		}
	}

	[HarmonyPatch(typeof(Beehive), "Awake")]
	public static class Beehive_Awake_Patch
	{
		private static void Postfix(Beehive __instance)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode())
			{
				__instance.m_secPerUnit = 5f;
				__instance.m_maxHoney = 4;
			}
		}
	}

	[HarmonyPatch(typeof(MineRock5), "Awake")]
	public static class MineRock5_Awake_Patch
	{
		private static void Postfix(MineRock5 __instance)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode())
			{
				DropTable dropItems = __instance.m_dropItems;
				dropItems.m_dropMin *= 2;
				DropTable dropItems2 = __instance.m_dropItems;
				dropItems2.m_dropMax *= 3;
			}
		}
	}

	[HarmonyPatch(typeof(LoadingIndicator), "Awake")]
	public static class LoadingIndicator_Awake_Patch
	{
		private static void Postfix(LoadingIndicator __instance)
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)__instance != (Object)null))
			{
				return;
			}
			foreach (AssetBundle allLoadedAssetBundle in AssetBundle.GetAllLoadedAssetBundles())
			{
				string text = "Assets/UI/textures/small/trophies.png";
				if (allLoadedAssetBundle.Contains(text))
				{
					Object obj = allLoadedAssetBundle.LoadAsset(text);
					Texture2D val = (Texture2D)(object)((obj is Texture2D) ? obj : null);
					if (val != null)
					{
						Sprite val2 = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
						__instance.m_spinner.sprite = val2;
						((Graphic)__instance.m_spinner).color = new Color(1f, 43f / 51f, 0f, 1f);
						__instance.m_spinnerOriginalColor = ((Graphic)__instance.m_spinner).color;
						__m_trophySprite = val2;
					}
					break;
				}
			}
		}
	}

	[HarmonyPatch(typeof(EggGrow), "Start")]
	public static class EggGrow_Start_Patch
	{
		private static void Postfix(EggGrow __instance)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode())
			{
				__instance.m_growTime = 2f;
			}
		}
	}

	[HarmonyPatch(typeof(Growup), "Start")]
	public static class Growup_Start_Patch
	{
		private static void Postfix(Growup __instance)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode())
			{
				__instance.m_growTime = 1f;
			}
		}
	}

	[HarmonyPatch(typeof(Procreation), "Awake")]
	public static class Procreation_Awake_Patch
	{
		private static void Postfix(Procreation __instance)
		{
			if ((Object)(object)__instance != (Object)null && IsSagaMode() && ((Object)__instance).name.Contains("Hen"))
			{
				Debug.LogWarning((object)("Procreation.Start: " + ((Object)__instance).name + " " + ((Object)__instance.m_character).name));
				__instance.m_pregnancyDuration = 0.1f;
				__instance.m_pregnancyChance = 0f;
				__instance.m_updateInterval = 1f;
			}
		}
	}

	public class ConsumableData
	{
		public string m_prefabName;

		public string m_itemName;

		public string m_displayName;

		public Biome m_biome;

		public int m_points;

		public float m_health;

		public float m_stamina;

		public float m_eitr;

		public float m_regen;

		public ConsumableData(string prefab, string item, string display, Biome biome, int points, float health, float stamina, float eitr, float regen)
		{
			m_prefabName = prefab;
			m_itemName = item;
			m_displayName = display;
			m_biome = biome;
			m_points = points;
			m_health = health;
			m_stamina = stamina;
			m_eitr = eitr;
			m_regen = regen;
		}
	}

	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static ConsoleEventFailable <>9__1_0;

		public static ConsoleEvent <>9__1_1;

		public static ConsoleEvent <>9__1_2;

		public static ConsoleEvent <>9__1_3;

		public static ConsoleEvent <>9__1_4;

		public static ConsoleEvent <>9__1_5;

		public static ConsoleEvent <>9__1_6;

		public static ConsoleEvent <>9__1_7;

		public static ConsoleEvent <>9__1_8;

		public static ConsoleEvent <>9__1_9;

		public static ConsoleEvent <>9__1_10;

		public static ConsoleEvent <>9__1_11;

		public static ConsoleEvent <>9__1_12;

		public static ConsoleEvent <>9__1_13;

		public static UnityAction<BaseEventData> <>9__187_1;

		public static UnityAction<BaseEventData> <>9__197_1;

		public static UnityAction<BaseEventData> <>9__211_1;

		public static Comparison<TournamentPlayerInfo> <>9__212_0;

		public static UnityAction<BaseEventData> <>9__223_1;

		public static Action <>9__253_0;

		public static Func<Task> <>9__254_0;

		internal object <AddConsoleCommands>b__1_0(ConsoleEventArgs args)
		{
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'trophyhunt' console command can only be used in-game.");
				return true;
			}
			PrintToConsole("[Trophy Hunt Scoring]");
			PrintToConsole("Trophies:");
			int num = CalculateTrophyPoints(displayToLog: true);
			PrintToConsole($"Trophy Score Total: {num}");
			int num2 = CalculateDeathPenalty();
			int num3 = CalculateLogoutPenalty();
			PrintToConsole("Penalties:");
			PrintToConsole($"  Deaths: {__m_deaths} Score: {num2}");
			PrintToConsole($"  Logouts: {__m_logoutCount} Score: {num3}");
			int num4 = 0;
			if (GetGameMode() == TrophyGameMode.TrophyRush)
			{
				CalculateBiomeBonusScore(Player.m_localPlayer);
				PrintToConsole($"Biome Bonus Total: {num4}");
			}
			num += num2;
			num += num3;
			num += num4;
			PrintToConsole($"Total Score: {num}");
			return true;
		}

		internal void <AddConsoleCommands>b__1_1(ConsoleEventArgs args)
		{
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			ObjectDB instance = ObjectDB.instance;
			if ((Object)(object)instance == (Object)null)
			{
				Debug.LogError((object)"ObjectDB is not initialized yet.");
				return;
			}
			foreach (Recipe recipe in instance.m_recipes)
			{
				if (!((Object)(object)recipe == (Object)null) && (Object)(object)recipe.m_item != (Object)null)
				{
					CraftingStation craftingStation = recipe.m_craftingStation;
					string text = "n/a";
					if (Object.op_Implicit((Object)(object)craftingStation))
					{
						text = ((Object)craftingStation).name;
					}
					int minStationLevel = recipe.m_minStationLevel;
					Debug.LogWarning((object)$"{((Object)recipe).name} {recipe.m_item.m_itemData.m_shared.m_itemType}: {text} {minStationLevel}");
					Requirement[] resources = recipe.m_resources;
					foreach (Requirement val in resources)
					{
						Debug.LogWarning((object)$"  req: {((Object)val.m_resItem).name} {val.m_amount}");
					}
				}
			}
		}

		internal void <AddConsoleCommands>b__1_2(ConsoleEventArgs args)
		{
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'showpath' console command can only be used in-game.");
			}
			ShowPlayerPath(!__m_pathAddedToMinimap);
		}

		internal void <AddConsoleCommands>b__1_3(ConsoleEventArgs args)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'/ignorelogouts' can only be used in gameplay.");
				return;
			}
			__m_ignoreLogouts = !__m_ignoreLogouts;
			__m_invalidForTournamentPlay = true;
			if ((Object)(object)__m_scoreTextElement != (Object)null && __m_ignoreLogouts)
			{
				((Graphic)__m_scoreTextElement.GetComponent<TextMeshProUGUI>()).color = Color.green;
			}
			if ((Object)(object)__m_relogsTextElement != (Object)null && __m_ignoreLogouts)
			{
				((Graphic)__m_relogsTextElement.GetComponent<TextMeshProUGUI>()).color = Color.gray;
			}
		}

		internal void <AddConsoleCommands>b__1_4(ConsoleEventArgs args)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'/showalltrophystats' can only be used in gameplay.");
				return;
			}
			ToggleShowAllTrophyStats();
			__m_invalidForTournamentPlay = true;
			if ((Object)(object)__m_scoreTextElement != (Object)null && __m_showAllTrophyStats)
			{
				((Graphic)__m_scoreTextElement.GetComponent<TextMeshProUGUI>()).color = Color.green;
			}
			InitializeSagaDrops();
		}

		internal void <AddConsoleCommands>b__1_5(ConsoleEventArgs args)
		{
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'togglescorebackground' console command can only be used in-game.");
			}
			__m_scoreBGElement.GetComponent<RectTransform>();
			__m_scoreBGElement.SetActive(!__m_scoreBGElement.activeSelf);
		}

		internal void <AddConsoleCommands>b__1_6(ConsoleEventArgs args)
		{
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'scorescale' console command can only be used in-game.");
			}
			if (args.Length > 1)
			{
				float num = float.Parse(args[1]);
				if (num == 0f)
				{
					num = 1f;
				}
				__m_userTextScale = num;
			}
			else
			{
				__m_userTextScale = 1f;
			}
			((Transform)__m_scoreTextElement.GetComponent<RectTransform>()).localScale = new Vector3(__m_userTextScale, __m_userTextScale, __m_userTextScale);
		}

		internal void <AddConsoleCommands>b__1_7(ConsoleEventArgs args)
		{
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'trophyscale' console command can only be used in-game.");
			}
			if (args.Length > 1)
			{
				float num = float.Parse(args[1]);
				if (num == 0f)
				{
					num = 1f;
				}
				__m_userIconScale = num;
				if (args.Length > 2)
				{
					float num2 = float.Parse(args[2]);
					if (num2 == 0f)
					{
						num2 = 1f;
					}
					__m_baseTrophyScale = num2;
				}
			}
			else
			{
				__m_userIconScale = 1f;
				__m_baseTrophyScale = 1f;
			}
			Player localPlayer = Player.m_localPlayer;
			if (!((Object)(object)localPlayer != (Object)null))
			{
				return;
			}
			localPlayer.GetTrophies();
			TrophyHuntData[] _m_trophyHuntData = __m_trophyHuntData;
			for (int i = 0; i < _m_trophyHuntData.Length; i++)
			{
				TrophyHuntData trophyHuntData = _m_trophyHuntData[i];
				<>c__DisplayClass1_0 CS$<>8__locals0 = new <>c__DisplayClass1_0
				{
					trophyName = trophyHuntData.m_name
				};
				GameObject val = __m_iconList.Find((GameObject gameObject) => ((Object)gameObject).name == CS$<>8__locals0.trophyName);
				if ((Object)(object)val != (Object)null && (Object)(object)val.GetComponent<Image>() != (Object)null)
				{
					RectTransform component = val.GetComponent<RectTransform>();
					if ((Object)(object)component != (Object)null)
					{
						((Transform)component).localScale = new Vector3(__m_baseTrophyScale, __m_baseTrophyScale, __m_baseTrophyScale) * __m_userIconScale;
					}
				}
			}
		}

		internal void <AddConsoleCommands>b__1_8(ConsoleEventArgs args)
		{
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'trophyspacing' console command can only be used in-game.");
			}
			else
			{
				if ((Object)(object)Player.m_localPlayer == (Object)null)
				{
					return;
				}
				Player localPlayer = Player.m_localPlayer;
				if (args.Length > 1)
				{
					float num = float.Parse(args[1]);
					if (num == 0f)
					{
						num = 1f;
					}
					__m_userTrophySpacing = num;
				}
				else
				{
					__m_userTrophySpacing = 0f;
				}
				Transform val = ((Component)Hud.instance).transform.Find("hudroot/healthpanel");
				if ((Object)(object)val == (Object)null)
				{
					Debug.LogError((object)"Health panel transform not found.");
					return;
				}
				DeleteTrophyIconElements(__m_iconList);
				CreateTrophyIconElements(val, __m_trophyHuntData, __m_iconList);
				EnableTrophyHuntIcons(localPlayer);
			}
		}

		internal void <AddConsoleCommands>b__1_9(ConsoleEventArgs args)
		{
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'/showtrophies' console command can only be used during gameplay.");
				return;
			}
			__m_showingTrophies = !__m_showingTrophies;
			ShowTrophies(__m_showingTrophies);
		}

		internal void <AddConsoleCommands>b__1_10(ConsoleEventArgs args)
		{
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'/showonlydeaths' console command can only be used during gameplay.");
				return;
			}
			__m_showOnlyDeaths = !__m_showOnlyDeaths;
			ShowOnlyDeaths(__m_showOnlyDeaths);
		}

		internal void <AddConsoleCommands>b__1_11(ConsoleEventArgs args)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			__m_elderPowerCutsAllTrees = !__m_elderPowerCutsAllTrees;
			PrintToConsole($"elder power cuts all trees: {__m_elderPowerCutsAllTrees}");
			if (__m_elderPowerCutsAllTrees)
			{
				__m_invalidForTournamentPlay = true;
				if ((Object)(object)__m_scoreTextElement != (Object)null)
				{
					((Graphic)__m_scoreTextElement.GetComponent<TextMeshProUGUI>()).color = Color.green;
				}
			}
		}

		internal void <AddConsoleCommands>b__1_12(ConsoleEventArgs args)
		{
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'timer' console command can only be used in-game.");
			}
			if ((Object)(object)__m_gameTimerTextElement == (Object)null || args.Length <= 1)
			{
				return;
			}
			string text = args[1].Trim();
			if (text == null)
			{
				return;
			}
			switch (text.Length)
			{
			case 5:
				switch (text[0])
				{
				case 's':
					if (text == "start")
					{
						TimerStart();
					}
					break;
				case 'r':
					if (text == "reset")
					{
						TimerReset();
					}
					break;
				}
				break;
			case 4:
				switch (text[1])
				{
				case 't':
					if (text == "stop")
					{
						TimerStop();
					}
					break;
				case 'h':
					if (text == "show")
					{
						__m_gameTimerVisible = true;
					}
					break;
				case 'i':
					if (text == "hide")
					{
						__m_gameTimerVisible = false;
					}
					break;
				}
				break;
			case 3:
				if (text == "set")
				{
					TimerSet(args[2]);
				}
				break;
			case 6:
				if (text == "toggle")
				{
					TimerToggle();
				}
				break;
			}
		}

		internal void <AddConsoleCommands>b__1_13(ConsoleEventArgs args)
		{
			if (!Object.op_Implicit((Object)(object)Game.instance))
			{
				PrintToConsole("'boatspeedmultiplier' console command can only be used in-game.");
			}
			__m_sagaSailingSpeedMultiplier = int.Parse(args[1]);
			UpdateModUI(Player.m_localPlayer);
		}

		internal void <AddTooltipTriggersToScoreObject>b__187_1(BaseEventData eventData)
		{
			HideScoreTooltip();
		}

		internal void <AddTooltipTriggersToLuckObject>b__197_1(BaseEventData eventData)
		{
			HideLuckTooltip();
		}

		internal void <AddTooltipTriggersToStandingsObject>b__211_1(BaseEventData eventData)
		{
			HideStandingsTooltip();
		}

		internal int <BuildStandingsTooltipText>b__212_0(TournamentPlayerInfo p1, TournamentPlayerInfo p2)
		{
			return p2.score.CompareTo(p1.score);
		}

		internal void <AddTooltipTriggersToTrophyIcon>b__223_1(BaseEventData eventData)
		{
			HideTrophyTooltip();
		}

		internal void <FetchDiscordAvatar>b__253_0()
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Expected O, but got Unknown
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
			Sprite sprite = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
			if ((Object)(object)__m_discordAvatarImage != (Object)null)
			{
				__m_discordAvatarImage.sprite = sprite;
			}
		}

		internal Task <UpdateOnlineStatus>b__254_0()
		{
			return FetchDiscordAvatar(__m_configDiscordId.Value, __m_configDiscordAvatar.Value);
		}
	}

	[CompilerGenerated]
	private sealed class <>c__DisplayClass1_0
	{
		public string trophyName;

		internal bool <AddConsoleCommands>b__14(GameObject gameObject)
		{
			return ((Object)gameObject).name == trophyName;
		}
	}

	public const string PluginGUID = "com.oathorse.TrophyHuntMod";

	public const string PluginName = "TrophyHuntMod";

	private const bool UPDATE_LEADERBOARD = false;

	public const string PluginVersion = "0.9.14";

	private readonly Harmony harmony = new Harmony("com.oathorse.TrophyHuntMod");

	private const bool DUMP_TROPHY_DATA = false;

	public static TrophyHuntMod __m_trophyHuntMod;

	public static TrophyHuntDataScoreOverride[] __m_trophyHuntScoreOverrides = new TrophyHuntDataScoreOverride[6]
	{
		new TrophyHuntDataScoreOverride(TrophyGameMode.TrophySaga, "TrophyFader", 400),
		new TrophyHuntDataScoreOverride(TrophyGameMode.CasualSaga, "TrophyFader", 400),
		new TrophyHuntDataScoreOverride(TrophyGameMode.CulinarySaga, "TrophyFader", 400),
		new TrophyHuntDataScoreOverride(TrophyGameMode.TrophySaga, "TrophySeekerQueen", 400),
		new TrophyHuntDataScoreOverride(TrophyGameMode.CasualSaga, "TrophySeekerQueen", 400),
		new TrophyHuntDataScoreOverride(TrophyGameMode.CulinarySaga, "TrophySeekerQueen", 400)
	};

	private const int TROPHY_HUNT_DEATH_PENALTY = -20;

	private const int TROPHY_HUNT_LOGOUT_PENALTY = -10;

	private const int TROPHY_RUSH_DEATH_PENALTY = -10;

	private const int TROPHY_RUSH_SLASHDIE_PENALTY = -10;

	private const int TROPHY_RUSH_LOGOUT_PENALTY = -5;

	private const int TROPHY_SAGA_DEATH_PENALTY = -30;

	private const int TROPHY_SAGA_LOGOUT_PENALTY = -10;

	private const int CULINARY_SAGA_DEATH_PENALTY = -30;

	private const int CULINARY_SAGA_LOGOUT_PENALTY = -10;

	private static float __m_sagaSailingSpeedMultiplier = 2.5f;

	private static float __m_sagaPaddlingSpeedMultiplier = 2f;

	private const float TROPHY_SAGA_TROPHY_DROP_MULTIPLIER = 2f;

	private const float TROPHY_SAGA_BASE_SKILL_LEVEL = 20f;

	private const int TROPHY_SAGA_MINING_MULTIPLIER = 2;

	private const string TROPHY_SAGA_INTRO_TEXT = "You were once a great warrior, though your memory of deeds past has long grown dim, shrouded by eons slumbering in the lands beyond death…\n\n\n\nRagnarok looms and the tenth world remains only for a few scant hours. You are reborn with one purpose: collect the heads of Odin's enemies before this cycle ends…\n\n\n\nOdin will cast these heads into the well of Mimir where his lost eye still resides. With knowledge of the Forsaken he can finally banish them forever…\n\n\nBring Odin what he desires or be forced to repeat the cycle for eternity…\n\n\n…in VALHEIM!";

	private const string CULINARY_SAGA_INTRO_TEXT = "You were once a great warrior, though your memory of deeds past has long grown dim, shrouded by eons slumbering in the lands beyond death…\n\n\n\nRagnarok looms and the tenth world remains only for a few scant hours. You are reborn with one purpose: cook a whole bunch of delicious meals to appease Odin's insatiable hunger?\n\n\n\nYes. Somehow. Bring Odin what he desires or be forced to repeat the cycle for eternity…\n\n\n\n…in VALHEIM!";

	private const string LEADERBOARD_URL = "https://valheim.help/api/trackhunt";

	private const float LOGOUT_PENALTY_GRACE_DISTANCE = 50f;

	private const float DEFAULT_SCORE_FONT_SIZE = 25f;

	private const long NUM_SECONDS_IN_FOUR_HOURS = 14400L;

	public static TrophyHuntData[] __m_trophyHuntData = new TrophyHuntData[58]
	{
		new TrophyHuntData("TrophyAbomination", "Abomination", Biome.Swamp, 20, 50f, new List<string> { "$enemy_abomination" }),
		new TrophyHuntData("TrophyAsksvin", "Asksvin", Biome.Ashlands, 50, 50f, new List<string> { "$enemy_asksvin" }),
		new TrophyHuntData("TrophyBlob", "Blob", Biome.Swamp, 20, 10f, new List<string> { "$enemy_blob", "$enemy_blobelite" }),
		new TrophyHuntData("TrophyBoar", "Boar", Biome.Meadows, 10, 15f, new List<string> { "$enemy_boar" }),
		new TrophyHuntData("TrophyBjorn", "Bear", Biome.Forest, 20, 10f, new List<string> { "$enemy_bjorn" }),
		new TrophyHuntData("TrophyBjornUndead", "Vile", Biome.Plains, 30, 15f, new List<string> { "$enemy_unbjorn" }),
		new TrophyHuntData("TrophyBonemass", "Bonemass", Biome.Swamp, 100, 100f, new List<string> { "$enemy_bonemass" }),
		new TrophyHuntData("TrophyBonemawSerpent", "Bonemaw", Biome.Ashlands, 50, 33f, new List<string> { "$enemy_bonemawserpent" }),
		new TrophyHuntData("TrophyCharredArcher", "Charred Archer", Biome.Ashlands, 50, 5f, new List<string> { "$enemy_charred_archer" }),
		new TrophyHuntData("TrophyCharredMage", "Charred Warlock", Biome.Ashlands, 50, 5f, new List<string> { "$enemy_charred_mage" }),
		new TrophyHuntData("TrophyCharredMelee", "Charred Warrior", Biome.Ashlands, 50, 5f, new List<string> { "$enemy_charred_melee" }),
		new TrophyHuntData("TrophyCultist", "Cultist", Biome.Mountains, 30, 10f, new List<string> { "$enemy_fenringcultist" }),
		new TrophyHuntData("TrophyCultist_Hildir", "Geirrhafa", Biome.Hildir, 45, 100f, new List<string> { "$enemy_fenringcultist_hildir" }),
		new TrophyHuntData("TrophyDeathsquito", "Deathsquito", Biome.Plains, 30, 5f, new List<string> { "$enemy_deathsquito" }),
		new TrophyHuntData("TrophyDeer", "Deer", Biome.Meadows, 10, 50f, new List<string> { "$enemy_deer" }),
		new TrophyHuntData("TrophyDragonQueen", "Moder", Biome.Mountains, 100, 100f, new List<string> { "$enemy_dragon" }),
		new TrophyHuntData("TrophyDraugr", "Draugr", Biome.Swamp, 20, 10f, new List<string> { "$enemy_draugr" }),
		new TrophyHuntData("TrophyDraugrElite", "Draugr Elite", Biome.Swamp, 20, 10f, new List<string> { "$enemy_draugrelite" }),
		new TrophyHuntData("TrophyDvergr", "Dvergr", Biome.Mistlands, 40, 5f, new List<string> { "$enemy_dvergr", "$enemy_dvergr_mage" }),
		new TrophyHuntData("TrophyEikthyr", "Eikthyr", Biome.Meadows, 40, 100f, new List<string> { "$enemy_eikthyr" }),
		new TrophyHuntData("TrophyFader", "Fader", Biome.Ashlands, 1000, 100f, new List<string> { "$enemy_fader" }),
		new TrophyHuntData("TrophyFallenValkyrie", "Fallen Valkyrie", Biome.Ashlands, 50, 5f, new List<string> { "$enemy_fallenvalkyrie" }),
		new TrophyHuntData("TrophyFenring", "Fenring", Biome.Mountains, 30, 10f, new List<string> { "$enemy_fenring" }),
		new TrophyHuntData("TrophyFrostTroll", "Troll", Biome.Forest, 20, 50f, new List<string> { "$enemy_troll" }),
		new TrophyHuntData("TrophyGhost", "Ghost", Biome.Forest, 20, 10f, new List<string> { "$enemy_ghost" }),
		new TrophyHuntData("TrophyGjall", "Gjall", Biome.Mistlands, 40, 30f, new List<string> { "$enemy_gjall" }),
		new TrophyHuntData("TrophyGoblin", "Fuling", Biome.Plains, 30, 10f, new List<string> { "$enemy_goblin" }),
		new TrophyHuntData("TrophyGoblinBrute", "Fuling Berserker", Biome.Plains, 30, 5f, new List<string> { "$enemy_goblinbrute" }),
		new TrophyHuntData("TrophyGoblinBruteBrosBrute", "Thungr", Biome.Hildir, 65, 100f, new List<string> { "$enemy_goblinbrute_hildircombined" }),
		new TrophyHuntData("TrophyGoblinBruteBrosShaman", "Zil", Biome.Hildir, 65, 100f, new List<string> { "$enemy_goblin_hildir" }),
		new TrophyHuntData("TrophyGoblinKing", "Yagluth", Biome.Plains, 160, 100f, new List<string> { "$enemy_goblinking" }),
		new TrophyHuntData("TrophyGoblinShaman", "Fuling Shaman", Biome.Plains, 30, 10f, new List<string> { "$enemy_goblinshaman" }),
		new TrophyHuntData("TrophyGreydwarf", "Greydwarf", Biome.Forest, 20, 5f, new List<string> { "$enemy_greydwarf" }),
		new TrophyHuntData("TrophyGreydwarfBrute", "Greydwarf Brute", Biome.Forest, 20, 10f, new List<string> { "$enemy_greydwarfbrute" }),
		new TrophyHuntData("TrophyGreydwarfShaman", "Greydwarf Shaman", Biome.Forest, 20, 10f, new List<string> { "$enemy_greydwarfshaman" }),
		new TrophyHuntData("TrophyGrowth", "Growth", Biome.Plains, 30, 10f, new List<string> { "$enemy_blobtar" }),
		new TrophyHuntData("TrophyHare", "Misthare", Biome.Mistlands, 40, 5f, new List<string> { "$enemy_hare" }),
		new TrophyHuntData("TrophyHatchling", "Drake", Biome.Mountains, 30, 10f, new List<string> { "$enemy_thehive", "$enemy_drake" }),
		new TrophyHuntData("TrophyLeech", "Leech", Biome.Swamp, 20, 10f, new List<string> { "$enemy_leech" }),
		new TrophyHuntData("TrophyLox", "Lox", Biome.Plains, 30, 10f, new List<string> { "$enemy_lox" }),
		new TrophyHuntData("TrophyMorgen", "Morgen", Biome.Ashlands, 50, 5f, new List<string> { "$enemy_morgen" }),
		new TrophyHuntData("TrophyNeck", "Neck", Biome.Meadows, 10, 5f, new List<string> { "$enemy_neck" }),
		new TrophyHuntData("TrophySeeker", "Seeker", Biome.Mistlands, 40, 10f, new List<string> { "$enemy_seeker" }),
		new TrophyHuntData("TrophySeekerBrute", "Seeker Soldier", Biome.Mistlands, 40, 5f, new List<string> { "$enemy_seekerbrute" }),
		new TrophyHuntData("TrophySeekerQueen", "The Queen", Biome.Mistlands, 1000, 100f, new List<string> { "$enemy_seekerqueen" }),
		new TrophyHuntData("TrophySerpent", "Serpent", Biome.Ocean, 45, 33f, new List<string> { "$enemy_serpent" }),
		new TrophyHuntData("TrophySGolem", "Stone Golem", Biome.Mountains, 30, 5f, new List<string> { "$enemy_stonegolem" }),
		new TrophyHuntData("TrophySkeleton", "Skeleton", Biome.Forest, 20, 10f, new List<string> { "$enemy_skeleton" }),
		new TrophyHuntData("TrophySkeletonHildir", "Brenna", Biome.Hildir, 25, 100f, new List<string> { "$enemy_skeletonfire" }),
		new TrophyHuntData("TrophySkeletonPoison", "Rancid Remains", Biome.Forest, 20, 10f, new List<string> { "$enemy_skeletonpoison" }),
		new TrophyHuntData("TrophySurtling", "Surtling", Biome.Swamp, 20, 5f, new List<string> { "$enemy_surtling" }),
		new TrophyHuntData("TrophyTheElder", "The Elder", Biome.Forest, 60, 100f, new List<string> { "$enemy_gdking" }),
		new TrophyHuntData("TrophyTick", "Tick", Biome.Mistlands, 40, 5f, new List<string> { "$enemy_tick" }),
		new TrophyHuntData("TrophyUlv", "Ulv", Biome.Mountains, 30, 5f, new List<string> { "$enemy_ulv" }),
		new TrophyHuntData("TrophyVolture", "Volture", Biome.Ashlands, 50, 50f, new List<string> { "$enemy_volture" }),
		new TrophyHuntData("TrophyWolf", "Wolf", Biome.Mountains, 30, 10f, new List<string> { "$enemy_wolf" }),
		new TrophyHuntData("TrophyWraith", "Wraith", Biome.Swamp, 20, 5f, new List<string> { "$enemy_wraith" }),
		new TrophyHuntData("TrophyKvastur", "Kvastur", Biome.Bogwitch, 25, 100f, new List<string> { "$enemy_kvastur" })
	};

	public static Color[] __m_biomeColors = (Color[])(object)new Color[10]
	{
		new Color(0.2f, 0.2f, 0.1f, 0.3f),
		new Color(0f, 0.2f, 0f, 0.3f),
		new Color(0.2f, 0.1f, 0f, 0.3f),
		new Color(0.2f, 0.2f, 0.2f, 0.3f),
		new Color(0.2f, 0.2f, 0f, 0.3f),
		new Color(0.2f, 0.1f, 0.2f, 0.3f),
		new Color(0.2f, 0f, 0f, 0.3f),
		new Color(0.1f, 0.1f, 0.2f, 0.3f),
		new Color(0.2f, 0.1f, 0f, 0.3f),
		new Color(0.2f, 0.1f, 0f, 0.3f)
	};

	public static BiomeBonus[] __m_biomeBonuses = new BiomeBonus[7]
	{
		new BiomeBonus(Biome.Meadows, "Meadows", 20, new List<string> { "TrophyBoar", "TrophyDeer", "TrophyNeck" }),
		new BiomeBonus(Biome.Forest, "Black Forest", 40, new List<string> { "TrophyBjorn", "TrophyFrostTroll", "TrophyGhost", "TrophyGreydwarf", "TrophyGreydwarfBrute", "TrophyGreydwarfShaman", "TrophySkeleton", "TrophySkeletonPoison" }),
		new BiomeBonus(Biome.Swamp, "Swamp", 40, new List<string> { "TrophyAbomination", "TrophyBlob", "TrophyDraugr", "TrophyDraugrElite", "TrophyLeech", "TrophySurtling", "TrophyWraith" }),
		new BiomeBonus(Biome.Mountains, "Mountains", 60, new List<string> { "TrophyCultist", "TrophyFenring", "TrophyHatchling", "TrophySGolem", "TrophyUlv", "TrophyWolf" }),
		new BiomeBonus(Biome.Plains, "Plains", 60, new List<string> { "TrophyBjornUndead", "TrophyDeathsquito", "TrophyGoblin", "TrophyGoblinBrute", "TrophyGoblinShaman", "TrophyGrowth", "TrophyLox" }),
		new BiomeBonus(Biome.Mistlands, "Mistlands", 80, new List<string> { "TrophyDvergr", "TrophyGjall", "TrophyHare", "TrophySeeker", "TrophySeekerBrute", "TrophyTick" }),
		new BiomeBonus(Biome.Ashlands, "Ashlands", 100, new List<string> { "TrophyAsksvin", "TrophyBonemawSerpent", "TrophyCharredArcher", "TrophyCharredMage", "TrophyCharredMelee", "TrophyFallenValkyrie", "TrophyMorgen", "TrophyVolture" })
	};

	private static GameObject __m_scoreTextElement = null;

	private static GameObject __m_scoreBGElement = null;

	private static GameObject __m_deathsTextElement = null;

	private static GameObject __m_relogsTextElement = null;

	private static GameObject __m_relogsIconElement = null;

	private static GameObject __m_gameTimerTextElement = null;

	private static GameObject __m_luckOMeterElement = null;

	private static GameObject __m_standingsElement = null;

	private static TMP_FontAsset __m_globalFontObject = null;

	private static List<GameObject> __m_iconList = null;

	private static Sprite __m_trophySprite = null;

	private static DiscordOAuthFlow __m_discordAuthentication = new DiscordOAuthFlow();

	private static bool __m_loggedInWithDiscord = false;

	private static TextMeshProUGUI __m_discordLoginButtonText = null;

	private static TextMeshProUGUI __m_onlineUsernameText = null;

	private static TextMeshProUGUI __m_onlineStatusText = null;

	private static Image __m_discordAvatarImage = null;

	private static long __m_gameTimerElapsedSeconds = 0L;

	private static bool __m_gameTimerActive = false;

	private static bool __m_gameTimerVisible = true;

	private static bool __m_gameTimerCountdown = true;

	private const long UPDATE_STANDINGS_INTERVAL = 30L;

	private static float __m_baseTrophyScale = 1.4f;

	private static float __m_userIconScale = 1f;

	private static float __m_userTextScale = 1f;

	private static float __m_userTrophySpacing = 0f;

	private static List<string> __m_trophyCache = new List<string>();

	private static int __m_deaths = 0;

	private static int __m_slashDieCount = 0;

	private static int __m_logoutCount = 0;

	private static bool __m_pathAddedToMinimap = false;

	private static List<PinData> __m_pathPins = new List<PinData>();

	private static List<Vector3> __m_playerPathData = new List<Vector3>();

	private static bool __m_collectingPlayerPath = false;

	private static float __m_playerPathCollectionInterval = 8f;

	private static float __m_minPathPlayerMoveDistance = 30f;

	private static Vector3 __m_previousPlayerPos;

	private static bool __m_onlyModRunning = false;

	private static TrophyGameMode __m_trophyGameMode = TrophyGameMode.TrophyHunt;

	private static bool __m_fiestaFlashing = false;

	private static Color[] __m_fiestaColors = (Color[])(object)new Color[6]
	{
		Color.red,
		Color.green,
		Color.blue,
		Color.cyan,
		Color.magenta,
		Color.yellow
	};

	private static bool __m_showAllTrophyStats = false;

	private static bool __m_invalidForTournamentPlay = false;

	private static bool __m_ignoreLogouts = false;

	private static bool __m_instaSmelt = true;

	private static bool __m_elderPowerCutsAllTrees = false;

	private static long __m_storedPlayerID = 0L;

	private static TrophyGameMode __m_storedGameMode = TrophyGameMode.Max;

	private static string __m_storedWorldSeed = "";

	private static int __m_playerCurrentScore = 0;

	public static List<PlayerEventLog> __m_playerEventLog = new List<PlayerEventLog>();

	public static bool __m_refreshLogsAndStandings = false;

	private static Dictionary<string, DropInfo> __m_allTrophyDropInfo = new Dictionary<string, DropInfo>();

	private static Dictionary<string, DropInfo> __m_playerTrophyDropInfo = new Dictionary<string, DropInfo>();

	private static List<Biome> __m_completedBiomeBonuses = new List<Biome>();

	private static ConfigEntry<string> __m_configDiscordId;

	private static ConfigEntry<string> __m_configDiscordUser;

	private static ConfigEntry<string> __m_configDiscordGlobalUser;

	private static ConfigEntry<string> __m_configDiscordAvatar;

	private static ConfigEntry<string> __m_configDiscordDiscriminator;

	public static string __m_saveDataVersionNumber = "4";

	private string[] __m_modWhiteList = new string[4] { "org.bepinex.valheim.displayinfo", "com.oathorse.TrophyHuntMod", "com.oathorse.Tuba", "wearable_trophies" };

	public static bool __m_showingTrophies = true;

	public static bool __m_showOnlyDeaths = false;

	public static TextMeshProUGUI __m_trophyHuntMainMenuText = null;

	private static GameObject __m_scoreTooltipObject = null;

	private static GameObject __m_scoreTooltipBackground = null;

	private static TextMeshProUGUI __m_scoreTooltipText;

	private static Vector2 __m_trophyHuntScoreTooltipWindowSize = new Vector2(240f, 215f);

	private static Vector2 __m_scoreTooltipTextOffset = new Vector2(5f, 2f);

	private static Dictionary<TrophyGameMode, Vector2> __toolTipSizes = new Dictionary<TrophyGameMode, Vector2>
	{
		{
			TrophyGameMode.TrophyHunt,
			new Vector2(240f, 215f)
		},
		{
			TrophyGameMode.TrophyRush,
			new Vector2(290f, 380f)
		},
		{
			TrophyGameMode.CasualSaga,
			new Vector2(300f, 170f)
		},
		{
			TrophyGameMode.TrophySaga,
			new Vector2(290f, 215f)
		},
		{
			TrophyGameMode.CulinarySaga,
			new Vector2(240f, 215f)
		},
		{
			TrophyGameMode.TrophyFiesta,
			new Vector2(240f, 215f)
		}
	};

	private static GameObject __m_luckTooltipObject = null;

	private static GameObject __m_luckTooltipBackground = null;

	private static TextMeshProUGUI __m_luckTooltip;

	private static Vector2 __m_luckTooltipWindowSize = new Vector2(220f, 135f);

	private static Vector2 __m_luckTooltipTextOffset = new Vector2(5f, 2f);

	public static LuckRating[] __m_luckRatingTable = new LuckRating[4]
	{
		new LuckRating(70f, "Bad", "#BF6000"),
		new LuckRating(100f, "Average", "#BFBF00"),
		new LuckRating(140f, "Good", "#00BF00"),
		new LuckRating(9999f, "Bonkers", "#6000BF")
	};

	private static GameObject __m_standingsTooltipObject = null;

	private static GameObject __m_standingsTooltipBackground = null;

	private static TextMeshProUGUI __m_standingsTooltip;

	private static Vector2 __m_standingsTooltipWindowSize = new Vector2(250f, 300f);

	private static Vector2 __m_standingsTooltipTextOffset = new Vector2(5f, 2f);

	private static GameObject __m_trophyTooltipObject = null;

	private static GameObject __m_trophyTooltipBackground = null;

	private static TextMeshProUGUI __m_trophyTooltip;

	private static Vector2 __m_trophyTooltipWindowSize = new Vector2(240f, 125f);

	private static Vector2 __m_trophyTooltipTextOffset = new Vector2(5f, 2f);

	private static Vector2 __m_trophyTooltipAllTrophyStatsWindowSize = new Vector2(240f, 195f);

	public static Dictionary<string, List<SpecialSagaDrop>> __m_specialSagaDrops = new Dictionary<string, List<SpecialSagaDrop>>
	{
		{
			"$enemy_greyling",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("FineWood", 50f, 3, 10),
				new SpecialSagaDrop("Coal", 2f, 1, 2),
				new SpecialSagaDrop("TrophyDeer", 5f, 1, 1),
				new SpecialSagaDrop("RoundLog", 10f, 2, 7),
				new SpecialSagaDrop("ArrowFlint", 5f, 2, 4),
				new SpecialSagaDrop("BoneFragments", 8f, 1, 3),
				new SpecialSagaDrop("Flint", 8f, 1, 3),
				new SpecialSagaDrop("LeatherScraps", 10f, 2, 3),
				new SpecialSagaDrop("DeerHide", 4f, 1, 3),
				new SpecialSagaDrop("Feathers", 6f, 1, 2),
				new SpecialSagaDrop("Acorn", 3f, 1, 2),
				new SpecialSagaDrop("CarrotSeeds", 4f, 1, 3),
				new SpecialSagaDrop("QueenBee", 6f, 1, 1),
				new SpecialSagaDrop("Honey", 8f, 1, 2),
				new SpecialSagaDrop("Blueberries", 7f, 2, 4),
				new SpecialSagaDrop("BeltStrength", 15f, 1, 1, dropOnlyOne: false, stopDroppingOnPickup: true)
			}
		},
		{
			"$enemy_neck",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("FishingBait", 25f, 1, 5, dropOnlyOne: false, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_greydwarfbrute",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("CryptKey", 100f, 1, 1, dropOnlyOne: false, stopDroppingOnPickup: true),
				new SpecialSagaDrop("FishingRod", 100f, 1, 1, dropOnlyOne: true, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_troll",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("BeltStrength", 100f, 1, 1, dropOnlyOne: false, stopDroppingOnPickup: true),
				new SpecialSagaDrop("TrollHide", 100f, 5, 5),
				new SpecialSagaDrop("FishingBaitForest", 50f, 1, 5, dropOnlyOne: true, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_skeletonfire",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("CryptKey", 100f, 1, 1, dropOnlyOne: true)
			}
		},
		{
			"$enemy_skeletonpoison",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("MaceIron", 100f, 1, 1, dropOnlyOne: true)
			}
		},
		{
			"$enemy_blobelite",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("Wishbone", 100f, 1, 1, dropOnlyOne: false, stopDroppingOnPickup: true),
				new SpecialSagaDrop("Ooze", 100f, 2, 5),
				new SpecialSagaDrop("FishingRod", 100f, 1, 1, dropOnlyOne: true, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_blob",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("Ooze", 100f, 2, 5)
			}
		},
		{
			"$enemy_abomination",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("FishingBaitSwamp", 25f, 1, 5, dropOnlyOne: false, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_drake",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("DragonTear", 100f, 1, 2),
				new SpecialSagaDrop("FishingRod", 100f, 1, 1, dropOnlyOne: true, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga),
				new SpecialSagaDrop("FishingBaitDeepNorth", 15f, 1, 5, dropOnlyOne: false, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_fenringcultist_hildir",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("DragonTear", 100f, 2, 3, dropOnlyOne: true)
			}
		},
		{
			"$enemy_fenring",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("FishingBaitCave", 25f, 1, 10, dropOnlyOne: false, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_goblin",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("FishingBaitPlains", 15f, 1, 5, dropOnlyOne: false, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_goblinshaman",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YagluthDrop", 100f, 1, 1, dropOnlyOne: false, stopDroppingOnPickup: true),
				new SpecialSagaDrop("FishingRod", 100f, 1, 1, dropOnlyOne: true, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_goblinbrute",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YagluthDrop", 100f, 1, 1, dropOnlyOne: false, stopDroppingOnPickup: true),
				new SpecialSagaDrop("FishingRod", 100f, 1, 1, dropOnlyOne: true, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_goblin_hildir",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YagluthDrop", 100f, 1, 1, dropOnlyOne: true)
			}
		},
		{
			"$enemy_goblinbrute_hildircombined",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YagluthDrop", 100f, 1, 1, dropOnlyOne: true)
			}
		},
		{
			"$enemy_lox",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("FishingBaitMistlands", 45f, 1, 5, dropOnlyOne: false, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_seekerbrute",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("QueenDrop", 100f, 1, 1, dropOnlyOne: false, stopDroppingOnPickup: true),
				new SpecialSagaDrop("FishingRod", 100f, 1, 1, dropOnlyOne: true, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_dvergr",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YggdrasilWood", 100f, 10, 20)
			}
		},
		{
			"$enemy_dvergr_mage",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YggdrasilWood", 100f, 10, 20)
			}
		},
		{
			"$enemy_serpent",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("FishingBaitOcean", 100f, 20, 20, dropOnlyOne: false, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_charred_melee",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("FishingBaitAshlands", 25f, 1, 5, dropOnlyOne: false, stopDroppingOnPickup: false, TrophyGameMode.CulinarySaga)
			}
		},
		{
			"$enemy_gdking",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YmirRemains", 100f, 10, 10, dropOnlyOne: true)
			}
		},
		{
			"$enemy_bonemass",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YmirRemains", 100f, 10, 10, dropOnlyOne: true)
			}
		},
		{
			"$enemy_dragon",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YmirRemains", 100f, 10, 10, dropOnlyOne: true)
			}
		},
		{
			"$enemy_seekerqueen",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YmirRemains", 100f, 10, 10, dropOnlyOne: true)
			}
		},
		{
			"$enemy_fader",
			new List<SpecialSagaDrop>
			{
				new SpecialSagaDrop("YmirRemains", 100f, 10, 10, dropOnlyOne: true)
			}
		}
	};

	public static Dictionary<string, string> __m_oreNameToBarPrefabName = new Dictionary<string, string>
	{
		{ "CopperOre", "Copper" },
		{ "TinOre", "Tin" },
		{ "IronScrap", "Iron" },
		{ "SilverOre", "Silver" },
		{ "BlackMetalScrap", "BlackMetal" },
		{ "FlametalOreNew", "FlametalNew" },
		{ "BronzeScrap", "Bronze" },
		{ "CopperScrap", "Copper" }
	};

	public static Dictionary<string, string> __m_oreNameToBarItemName = new Dictionary<string, string>
	{
		{ "CopperOre", "$item_copper" },
		{ "TinOre", "$item_tin" },
		{ "IronScrap", "$item_iron" },
		{ "SilverOre", "$item_silver" },
		{ "BlackMetalScrap", "$item_blackmetal" },
		{ "FlametalOreNew", "$item_flametal" },
		{ "BronzeScrap", "$item_bronze" },
		{ "CopperScrap", "$item_copper" }
	};

	public static readonly Dictionary<PlayerEventType, List<string>> __m_eventDescriptions = new Dictionary<PlayerEventType, List<string>>
	{
		{
			PlayerEventType.Trophy,
			null
		},
		{
			PlayerEventType.Build,
			new List<string> { "$piece_workbench", "$piece_sapling_turnip", "$piece_sapling_onion", "$piece_bonfire" }
		},
		{
			PlayerEventType.Item,
			new List<string>
			{
				"RoundLog", "Finewood", "ElderBark", "SpearFlint", "SpearFlint2", "SpearFlint3", "SpearFlint4", "ArmorTrollLeatherChest", "ArmorTrollLeatherChest2", "ArmorTrollLeatherChest3",
				"ArmorRootChest", "ArmorRootChest2"
			}
		},
		{
			PlayerEventType.Misc,
			null
		}
	};

	public static TournamentStatus __m_tournamentStatus = TournamentStatus.NotRunning;

	public static string __m_tournamentName = "";

	public static string __m_tournamentMode = "";

	public static DateTime __m_tournamentEndTime;

	public static List<TournamentPlayerInfo> __m_tournamentPlayerInfo = new List<TournamentPlayerInfo>();

	public static List<string> __m_cookedFoods = new List<string>();

	public static ConsumableData[] __m_rawFoodData = new ConsumableData[18]
	{
		new ConsumableData("Blueberries", "$item_blueberries", "Blueberries", Biome.Meadows, 0, 8f, 25f, 0f, 1f),
		new ConsumableData("Carrot", "$item_carrot", "Carrot", Biome.Meadows, 0, 10f, 32f, 0f, 1f),
		new ConsumableData("Cloudberry", "$item_cloudberries", "Cloudberries", Biome.Meadows, 0, 13f, 40f, 0f, 1f),
		new ConsumableData("Fiddleheadfern", "$item_fiddleheadfern", "Fiddlehead", Biome.Meadows, 0, 30f, 30f, 0f, 1f),
		new ConsumableData("Mushroom", "$item_mushroomcommon", "Mushroom", Biome.Meadows, 0, 15f, 15f, 0f, 1f),
		new ConsumableData("MushroomBlue", "$item_mushroomblue", "Blue Mushroom", Biome.Meadows, 0, 20f, 20f, 0f, 1f),
		new ConsumableData("MushroomBzerker", "$item_mushroom_bzerker", "Toadstool", Biome.Meadows, 0, 0f, 0f, 0f, 1f),
		new ConsumableData("MushroomJotunPuffs", "$item_jotunpuffs", "Jotun Puffs", Biome.Meadows, 0, 25f, 25f, 0f, 1f),
		new ConsumableData("MushroomMagecap", "$item_magecap", "Magecap", Biome.Meadows, 0, 25f, 25f, 25f, 1f),
		new ConsumableData("MushroomSmokePuff", "$item_smokepuff", "Smoke Puff", Biome.Meadows, 0, 15f, 15f, 0f, 1f),
		new ConsumableData("MushroomYellow", "$item_mushroomyellow", "Yellow Mushroom", Biome.Meadows, 0, 10f, 30f, 0f, 1f),
		new ConsumableData("Honey", "$item_honey", "Honey", Biome.Meadows, 0, 8f, 35f, 0f, 1f),
		new ConsumableData("Onion", "$item_onion", "Onion", Biome.Meadows, 0, 13f, 40f, 0f, 1f),
		new ConsumableData("Pukeberries", "$item_pukeberries", "Bukeperries", Biome.Meadows, 0, 0f, 0f, 0f, 1f),
		new ConsumableData("Raspberry", "$item_raspberries", "Raspberries", Biome.Meadows, 0, 7f, 20f, 0f, 1f),
		new ConsumableData("RottenMeat", "$item_meat_rotten", "Rotten Meat", Biome.Meadows, 0, 0f, 0f, 0f, 1f),
		new ConsumableData("RoyalJelly", "$item_royaljelly", "Royal Jelly", Biome.Meadows, 0, 15f, 15f, 0f, 1f),
		new ConsumableData("Vineberry", "$item_vineberry", "Vineberry Cluster", Biome.Meadows, 0, 30f, 30f, 30f, 1f)
	};

	public static ConsumableData[] __m_drinkData = new ConsumableData[21]
	{
		new ConsumableData("BarleyWine", "$item_barleywine", "Fire Resistance Barley Wine", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadBugRepellent", "$item_mead_bugrepellent", "Anti-Sting Concoction", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadBzerker", "$item_mead_bzerker", "Berserkir Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadEitrLingering", "$item_mead_eitr_lingering", "Lingering Eitr Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadEitrMinor", "$item_mead_eitr_minor", "Minor Eitr Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadFrostResist", "$item_mead_frostres", "Frost Resistance Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadHasty", "$item_mead_hasty", "Tonic of Ratatosk", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadHealthLingering", "$item_mead_hp_lingering", "Lingering Healing Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadHealthMajor", "$item_mead_hp_major", "Major Healing Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadHealthMedium", "$item_mead_hp_medium", "Medium Healing Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadHealthMinor", "$item_mead_hp_minor", "Minor Healing Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadLightfoot", "$item_mead_lightfoot", "Lightfoot Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadPoisonResist", "$item_mead_poisonres", "Poison Resistance Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadStaminaLingering", "$item_mead_stamina_lingering", "Lingering Stamina Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadStaminaMedium", "$item_mead_stamina_medium", "Medium Stamina Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadStaminaMinor", "$item_mead_stamina_minor", "Minor Stamina Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadStrength", "$item_mead_strength", "Mead of Troll Endurance", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadSwimmer", "$item_mead_swimmer", "Draught of Vananidir", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadTamer", "$item_mead_tamer", "Brew of Animal Whispers", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadTasty", "$item_mead_tasty", "Tasty Mead", Biome.Meadows, 0, 0f, 0f, 0f, 0f),
		new ConsumableData("MeadTrollPheromones", "$item_mead_trollpheromones", "Love Potion", Biome.Meadows, 0, 0f, 0f, 0f, 0f)
	};

	public static ConsumableData[] __m_feastData = new ConsumableData[8]
	{
		new ConsumableData("FeastAshlands", "$item_feastashlands", "Ashlands Gourmet Bowl", Biome.Meadows, 0, 75f, 75f, 38f, 6f),
		new ConsumableData("FeastBlackforest", "$item_feastblackforest", "Black Forest Buffet Platter", Biome.Meadows, 0, 35f, 35f, 0f, 3f),
		new ConsumableData("FeastMeadows", "$item_feastmeadows", "Whole Roasted Meadow Boar", Biome.Meadows, 0, 35f, 35f, 0f, 2f),
		new ConsumableData("FeastMistlands", "$item_feastmistlands", "Mushrooms Galore á la Mistlands", Biome.Meadows, 0, 65f, 65f, 33f, 5f),
		new ConsumableData("FeastMountains", "$item_feastmountains", "Hearty Mountain Logger's Stew", Biome.Meadows, 0, 45f, 45f, 0f, 3f),
		new ConsumableData("FeastOceans", "$item_feastoceans", "Sailor's Bounty", Biome.Meadows, 0, 45f, 45f, 0f, 3f),
		new ConsumableData("FeastPlains", "$item_feastplains", "Plains Pie Picnic", Biome.Meadows, 0, 55f, 55f, 0f, 4f),
		new ConsumableData("FeastSwamps", "$item_feastswamps", "Swamp Dweller's Delight", Biome.Meadows, 0, 35f, 35f, 0f, 3f)
	};

	public static ConsumableData[] __m_cookedFoodData = new ConsumableData[50]
	{
		new ConsumableData("NeckTailGrilled", "$item_necktailgrilled", "Grilled Neck Tail", Biome.Meadows, 10, 25f, 8f, 0f, 2f),
		new ConsumableData("CookedMeat", "$item_boar_meat_cooked", "Cooked Boar Meat", Biome.Meadows, 10, 30f, 10f, 0f, 2f),
		new ConsumableData("CookedDeerMeat", "$item_deer_meat_cooked", "Cooked Deer Meat", Biome.Meadows, 10, 35f, 12f, 0f, 2f),
		new ConsumableData("QueensJam", "$item_queensjam", "Queen's Jam", Biome.Meadows, 10, 14f, 40f, 0f, 2f),
		new ConsumableData("BoarJerky", "$item_boarjerky", "Boar Jerky", Biome.Forest, 20, 23f, 23f, 0f, 2f),
		new ConsumableData("DeerStew", "$item_deerstew", "Deer Stew", Biome.Forest, 20, 45f, 15f, 0f, 3f),
		new ConsumableData("CarrotSoup", "$item_carrotsoup", "Carrot Soup", Biome.Forest, 20, 15f, 45f, 0f, 2f),
		new ConsumableData("MinceMeatSauce", "$item_mincemeatsauce", "Minced Meat Sauce", Biome.Forest, 20, 40f, 13f, 0f, 3f),
		new ConsumableData("Sausages", "$item_sausages", "Sausages", Biome.Swamp, 30, 55f, 18f, 0f, 3f),
		new ConsumableData("ShocklateSmoothie", "$item_shocklatesmoothie", "Muckshake", Biome.Swamp, 30, 16f, 50f, 0f, 1f),
		new ConsumableData("TurnipStew", "$item_turnipstew", "Turnip Stew", Biome.Swamp, 30, 18f, 55f, 0f, 2f),
		new ConsumableData("BlackSoup", "$item_blacksoup", "Black Soup", Biome.Swamp, 30, 50f, 17f, 0f, 3f),
		new ConsumableData("OnionSoup", "$item_onionsoup", "Onion Soup", Biome.Mountains, 30, 20f, 60f, 0f, 1f),
		new ConsumableData("CookedWolfMeat", "$item_wolf_meat_cooked", "Cooked Wolf Meat", Biome.Mountains, 30, 45f, 15f, 0f, 3f),
		new ConsumableData("WolfJerky", "$item_wolfjerky", "Wolf Jerky", Biome.Mountains, 30, 33f, 33f, 0f, 3f),
		new ConsumableData("WolfMeatSkewer", "$item_wolf_skewer", "Wolf Skewer", Biome.Mountains, 30, 65f, 21f, 0f, 3f),
		new ConsumableData("Eyescream", "$item_eyescream", "Eyescream", Biome.Mountains, 30, 21f, 65f, 0f, 1f),
		new ConsumableData("FishCooked", "$item_fish_cooked", "Cooked Fish", Biome.Ocean, 40, 45f, 15f, 0f, 2f),
		new ConsumableData("SerpentMeatCooked", "$item_serpentmeatcooked", "Cooked Serpent Meat", Biome.Ocean, 40, 70f, 23f, 0f, 3f),
		new ConsumableData("SerpentStew", "$item_serpentstew", "Serpent Stew", Biome.Ocean, 40, 80f, 26f, 0f, 4f),
		new ConsumableData("CookedLoxMeat", "$item_loxmeat_cooked", "Cooked Lox Meat", Biome.Plains, 40, 50f, 16f, 0f, 4f),
		new ConsumableData("FishWraps", "$item_fishwraps", "Fish Wraps", Biome.Plains, 40, 70f, 23f, 0f, 4f),
		new ConsumableData("LoxPie", "$item_loxpie", "Lox Meat Pie", Biome.Plains, 40, 75f, 24f, 0f, 4f),
		new ConsumableData("BloodPudding", "$item_bloodpudding", "Blood Pudding", Biome.Plains, 40, 25f, 75f, 0f, 2f),
		new ConsumableData("Bread", "$item_bread", "Bread", Biome.Plains, 40, 23f, 70f, 0f, 2f),
		new ConsumableData("CookedEgg", "$item_egg_cooked", "Cooked Egg", Biome.Plains, 40, 35f, 12f, 0f, 2f),
		new ConsumableData("CookedChickenMeat", "$item_chicken_meat_cooked", "Cooked Chicken Meat", Biome.Plains, 40, 60f, 20f, 0f, 5f),
		new ConsumableData("CookedHareMeat", "$item_hare_meat_cooked", "Cooked Hare Meat", Biome.Mistlands, 50, 60f, 20f, 0f, 5f),
		new ConsumableData("CookedBugMeat", "$item_bug_meat_cooked", "Cooked Seeker Meat", Biome.Mistlands, 50, 60f, 20f, 0f, 5f),
		new ConsumableData("MeatPlatter", "$item_meatplatter", "Meat Platter", Biome.Mistlands, 50, 80f, 26f, 0f, 5f),
		new ConsumableData("HoneyGlazedChicken", "$item_honeyglazedchicken", "Honey Glazed Chicken", Biome.Mistlands, 50, 80f, 26f, 0f, 5f),
		new ConsumableData("MisthareSupreme", "$item_mistharesupreme", "Misthare Supreme", Biome.Mistlands, 50, 85f, 28f, 0f, 5f),
		new ConsumableData("Salad", "$item_salad", "Salad", Biome.Mistlands, 50, 26f, 80f, 0f, 3f),
		new ConsumableData("MushroomOmelette", "$item_mushroomomelette", "Mushroom Omelette", Biome.Mistlands, 50, 28f, 85f, 0f, 3f),
		new ConsumableData("FishAndBread", "$item_fishandbread", "Fish 'n' Bread", Biome.Mistlands, 50, 30f, 90f, 0f, 3f),
		new ConsumableData("MagicallyStuffedShroom", "$item_magicallystuffedmushroom", "Stuffed Mushroom", Biome.Mistlands, 50, 25f, 12f, 75f, 3f),
		new ConsumableData("YggdrasilPorridge", "$item_yggdrasilporridge", "Yggdrasil Porridge", Biome.Mistlands, 50, 27f, 13f, 80f, 3f),
		new ConsumableData("SeekerAspic", "$item_seekeraspic", "Seeker Aspic", Biome.Mistlands, 50, 28f, 14f, 85f, 3f),
		new ConsumableData("CookedAsksvinMeat", "$item_asksvin_meat_cooked", "Cooked Asksvin Tail", Biome.Ashlands, 60, 70f, 24f, 0f, 6f),
		new ConsumableData("CookedVoltureMeat", "$item_volture_meat_cooked", "Cooked Volture Meat", Biome.Ashlands, 60, 70f, 24f, 0f, 6f),
		new ConsumableData("CookedBoneMawSerpentMeat", "$item_bonemawmeat_cooked", "Cooked Bonemaw Meat", Biome.Ashlands, 60, 90f, 30f, 0f, 6f),
		new ConsumableData("FierySvinstew", "$item_fierysvinstew", "Fiery Svinstew", Biome.Ashlands, 60, 95f, 32f, 0f, 6f),
		new ConsumableData("MashedMeat", "$item_mashedmeat", "Mashed Meat", Biome.Ashlands, 60, 100f, 34f, 0f, 6f),
		new ConsumableData("PiquantPie", "$item_piquantpie", "Piquant Pie", Biome.Ashlands, 60, 105f, 35f, 0f, 6f),
		new ConsumableData("SpicyMarmalade", "$item_spicymarmalade", "Spicy Marmalade", Biome.Ashlands, 60, 30f, 90f, 0f, 4f),
		new ConsumableData("ScorchingMedley", "$item_scorchingmedley", "Scorching Medley", Biome.Ashlands, 60, 32f, 95f, 0f, 4f),
		new ConsumableData("RoastedCrustPie", "$item_roastedcrustpie", "Roasted Crust Pie", Biome.Ashlands, 60, 34f, 100f, 0f, 4f),
		new ConsumableData("SizzlingBerryBroth", "$item_sizzlingberrybroth", "Sizzling Berry Broth", Biome.Ashlands, 60, 28f, 14f, 85f, 4f),
		new ConsumableData("SparklingShroomshake", "$item_sparklingshroomshake", "Sparkling Shroomshake", Biome.Ashlands, 60, 30f, 15f, 90f, 4f),
		new ConsumableData("MarinatedGreens", "$item_marinatedgreens", "Marinated Greens", Biome.Ashlands, 60, 32f, 16f, 95f, 4f)
	};

	public static void PrintToConsole(string message)
	{
		if (Object.op_Implicit((Object)(object)Console.m_instance))
		{
			((Terminal)Console.m_instance).AddString(message);
		}
		if (Object.op_Implicit((Object)(object)Chat.m_instance))
		{
			((Terminal)Chat.m_instance).AddString(message);
		}
		Debug.Log((object)message);
	}

	private void AddConsoleCommands()
	{
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Expected O, but got Unknown
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Expected O, but got Unknown
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Expected O, but got Unknown
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Expected O, but got Unknown
		//IL_0112: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0103: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: Expected O, but got Unknown
		//IL_014a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0136: Unknown result type (might be due to invalid IL or missing references)
		//IL_013b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0141: Expected O, but got Unknown
		//IL_0182: Unknown result type (might be due to invalid IL or missing references)
		//IL_016e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_0179: Expected O, but got Unknown
		//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b1: Expected O, but got Unknown
		//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01de: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e9: Expected O, but got Unknown
		//IL_022a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0216: Unknown result type (might be due to invalid IL or missing references)
		//IL_021b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0221: Expected O, but got Unknown
		//IL_0262: Unknown result type (might be due to invalid IL or missing references)
		//IL_024e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0253: Unknown result type (might be due to invalid IL or missing references)
		//IL_0259: Expected O, but got Unknown
		//IL_029a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0286: Unknown result type (might be due to invalid IL or missing references)
		//IL_028b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0291: Expected O, but got Unknown
		//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02be: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c9: Expected O, but got Unknown
		//IL_030a: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0301: Expected O, but got Unknown
		object obj = <>c.<>9__1_0;
		if (obj == null)
		{
			ConsoleEventFailable val = delegate
			{
				if (!Object.op_Implicit((Object)(object)Game.instance))
				{
					PrintToConsole("'trophyhunt' console command can only be used in-game.");
					return true;
				}
				PrintToConsole("[Trophy Hunt Scoring]");
				PrintToConsole("Trophies:");
				int num5 = CalculateTrophyPoints(displayToLog: true);
				PrintToConsole($"Trophy Score Total: {num5}");
				int num6 = CalculateDeathPenalty();
				int num7 = CalculateLogoutPenalty();
				PrintToConsole("Penalties:");
				PrintToConsole($"  Deaths: {__m_deaths} Score: {num6}");
				PrintToConsole($"  Logouts: {__m_logoutCount} Score: {num7}");
				int num8 = 0;
				if (GetGameMode() == TrophyGameMode.TrophyRush)
				{
					CalculateBiomeBonusScore(Player.m_localPlayer);
					PrintToConsole($"Biome Bonus Total: {num8}");
				}
				num5 += num6;
				num5 += num7;
				num5 += num8;
				PrintToConsole($"Total Score: {num5}");
				return true;
			};
			<>c.<>9__1_0 = val;
			obj = (object)val;
		}
		new ConsoleCommand("trophyhunt", "Prints trophy hunt data", (ConsoleEventFailable)obj, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false);
		object obj2 = <>c.<>9__1_1;
		if (obj2 == null)
		{