Decompiled source of SkanksAIO v1.6.2

AIO/AIO.dll

Decompiled 6 months ago
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Linq.Expressions;
using System.Net;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using Bloodstone.API;
using Costura;
using Discord;
using Discord.Rest;
using Discord.WebSocket;
using HarmonyLib;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.Injection;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using LiteDB;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using ProjectM;
using ProjectM.CastleBuilding;
using ProjectM.CastleBuilding.Placement;
using ProjectM.Gameplay.Systems;
using ProjectM.Network;
using ProjectM.Scripting;
using ProjectM.Terrain;
using ProjectM.UI;
using Scriban;
using Scriban.Parsing;
using SkanksAIO;
using SkanksAIO.Chat;
using SkanksAIO.Chat.Attributes;
using SkanksAIO.Discord;
using SkanksAIO.Discord.Attributes;
using SkanksAIO.Extensions;
using SkanksAIO.Logger;
using SkanksAIO.Logger.Handler;
using SkanksAIO.Models;
using SkanksAIO.Utils;
using SkanksAIO.Utils.Config;
using SkanksAIO.Web;
using Stunlock.Network;
using Unity.Collections;
using Unity.Entities;
using Unity.Mathematics;
using Unity.Physics;
using Unity.Transforms;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("AIO")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("AIO Plugin for VRising Servers")]
[assembly: AssemblyFileVersion("1.6.2.0")]
[assembly: AssemblyInformationalVersion("1.6.2+89cb9a137c5c59826ee56842793795066ba74f3f")]
[assembly: AssemblyProduct("AIO")]
[assembly: AssemblyTitle("AIO")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.6.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
internal class <Module>
{
	static <Module>()
	{
		AssemblyLoader.Attach();
	}
}
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class IsUnmanagedAttribute : 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;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
internal abstract class AbstractChatCommandsHandler
{
	protected Entity UserEntity { get; private set; }

	protected Entity CharacterEntity { get; private set; }

	protected string Message { get; private set; }

	protected User User { get; private set; }

	internal AbstractChatCommandsHandler(FromCharacter fromCharacter, string message, User user)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: 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_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		UserEntity = fromCharacter.User;
		CharacterEntity = fromCharacter.Character;
		Message = message;
		User = user;
	}

	internal void Reply(string message, ServerChatMessageType type = 6)
	{
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		ServerChatUtils.SendSystemMessageToClient(VWorld.Server.EntityManager, User, message);
	}

	internal User GetUser()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		return User;
	}

	internal void SendToAll(string message, ServerChatMessageType type = 6)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		Messaging.SendGlobalMessage(type, "[ALL] " + message);
	}
}
[HarmonyPatch]
public static class Chat_Pathces
{
	[HarmonyPatch(typeof(ChatMessageSystem), "OnUpdate")]
	[HarmonyPrefix]
	public static bool ChatUpdatePatch(ChatMessageSystem __instance)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: 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_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: 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_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		EntityManager entityManager = ((ComponentSystemBase)__instance).EntityManager;
		EntityQuery chatMessageQuery = __instance._ChatMessageQuery;
		Enumerator<Entity> enumerator = ((EntityQuery)(ref chatMessageQuery)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)).GetEnumerator();
		User val = default(User);
		while (enumerator.MoveNext())
		{
			Entity current = enumerator.Current;
			if (App.Instance.Chat.Handle(current))
			{
				((EntityManager)(ref entityManager)).TryGetComponentData<User>(current, ref val);
				SendMessageToDiscord(entityManager, current, val.IsAdmin);
			}
		}
		return true;
	}

	private static void SendMessageToDiscord(EntityManager em, Entity entity, bool isAdmin)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_0282: Unknown result type (might be due to invalid IL or missing references)
		//IL_0283: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0228: Unknown result type (might be due to invalid IL or missing references)
		//IL_022a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0146: Unknown result type (might be due to invalid IL or missing references)
		//IL_0148: Unknown result type (might be due to invalid IL or missing references)
		ChatMessageEvent componentDataAOT = em.GetComponentDataAOT<ChatMessageEvent>(entity);
		if ((int)componentDataAOT.MessageType == 0)
		{
			string text = ((object)(FixedString512Bytes)(ref componentDataAOT.MessageText)).ToString() ?? string.Empty;
			if (!text.StartsWith(".") && !text.StartsWith(((object)Settings.ChatCommandPrefix).ToString()))
			{
				string value = text.Replace("@", "");
				Plugin.Logger?.LogDebug("Just got a global message: " + text);
				FromCharacter componentData = ((EntityManager)(ref em)).GetComponentData<FromCharacter>(entity);
				User componentData2 = ((EntityManager)(ref em)).GetComponentData<User>(componentData.User);
				if (isAdmin)
				{
					Plugin.Logger?.LogDebug($"[{Settings.GlobalChatLabel.Value}][Admin] {componentData2.CharacterName}: {value}");
					App.Instance.Discord.SendMessageAsync($"[{Settings.GlobalChatLabel.Value}][Admin]{componentData2.CharacterName}: {value}", isTTS: false, null, null, null, null, null, null, null, (MessageFlags)0);
				}
				else
				{
					Plugin.Logger?.LogDebug($"[{Settings.GlobalChatLabel.Value}] {componentData2.CharacterName}: {value}");
					App.Instance.Discord.SendMessageAsync($"[{Settings.GlobalChatLabel.Value}] {componentData2.CharacterName}: {value}", isTTS: false, null, null, null, null, null, null, null, (MessageFlags)0);
				}
			}
		}
		else
		{
			Plugin.Logger?.LogDebug($"Just got a non global message: {componentDataAOT.MessageText}");
		}
	}
}
namespace SkanksAIO
{
	public class App : MonoBehaviour
	{
		internal DiscordCommandLib? Discord;

		internal ChatCommandLib? Chat;

		internal float _currenttime;

		private int announcementCount = JsonConfigHelper.GetAnnouncements().Count;

		internal static App? Instance { get; private set; }

		public App()
		{
			Instance = this;
			Discord = new DiscordCommandLib(Settings.Token.Value);
			Discord.Ready += OnReady;
			Chat = new ChatCommandLib();
		}

		private void OnReady()
		{
			Chat.Init();
		}

		public void Restart()
		{
			if (Discord == null || Chat == null || (Object)(object)Instance == (Object)null)
			{
				Instance = this;
				Discord = new DiscordCommandLib(Settings.Token.Value);
				Chat = new ChatCommandLib();
				Discord.Ready += OnReady;
				Chat.Init();
			}
			Stop();
			_currenttime = JsonConfigHelper.GetAnnouncementInterval();
			announcementCount = JsonConfigHelper.GetAnnouncements().Count;
			Start();
		}

		private void Update()
		{
			if (!Settings.AnnounceEnabled.Value || JsonConfigHelper.GetAnnouncements().Count == 0)
			{
				return;
			}
			_currenttime += Time.deltaTime;
			if (!(_currenttime >= JsonConfigHelper.GetAnnouncementInterval()))
			{
				return;
			}
			Plugin.Logger?.LogDebug("Posting announcement: " + JsonConfigHelper.GetAnnouncements()[Settings.LastEntry]);
			Discord?.SendMessageAsync(JsonConfigHelper.GetAnnouncements()[Settings.LastEntry], isTTS: false, null, null, null, null, null, null, null, (MessageFlags)0, isAnnouncement: true);
			if (Settings.AnnounceRandomOrder.Value && announcementCount > 1)
			{
				int num;
				do
				{
					num = Settings.Random.Next(0, announcementCount);
				}
				while (num == Settings.LastEntry);
				Settings.LastEntry = num;
			}
			else
			{
				Settings.LastEntry++;
				if (Settings.LastEntry == JsonConfigHelper.GetAnnouncements().Count)
				{
					Settings.LastEntry = 0;
				}
			}
			_currenttime = 0f;
		}

		private async Task OnMessageReceived(SocketUserMessage message)
		{
			try
			{
				await ClientOnMessageReceived((SocketMessage)(object)message);
			}
			catch (Exception ex)
			{
				Plugin.Logger?.LogError("[Discord] error: " + ex.Message + " + " + ex.StackTrace);
			}
		}

		private async Task ClientOnMessageReceived(SocketMessage socketMessage)
		{
			SocketMessage socketMessage2 = socketMessage;
			await Task.Run(delegate
			{
				if (!socketMessage2.Author.IsBot)
				{
					Plugin.Logger?.LogDebug("channel id message: " + ((IEntity<ulong>)(object)socketMessage2.Channel).Id + " settings channel id: " + Settings.ChannelId.Value);
					if (((IEntity<ulong>)(object)socketMessage2.Channel).Id != Settings.ChannelId.Value)
					{
						return Task.CompletedTask;
					}
					Messaging.SendGlobalMessage((ServerChatMessageType)1, "[Discord] " + socketMessage2.Author.Username + ": " + socketMessage2.Content);
					Plugin.Logger?.LogInfo("[Discord] " + socketMessage2.Author.Username + ": " + socketMessage2.Content);
				}
				return Task.CompletedTask;
			});
		}

		private void Start()
		{
			if (!string.IsNullOrEmpty(Settings.Token.Value))
			{
				_currenttime = 0f;
				((MonoBehaviour)this).StartCoroutine("CoroutineStart");
			}
		}

		internal void Stop()
		{
			if (!string.IsNullOrEmpty(Settings.Token.Value))
			{
				((MonoBehaviour)this).StartCoroutine("CoroutineStop");
			}
		}

		public void CoroutineStart()
		{
			Discord.MessageReceived += OnMessageReceived;
			Discord.Start().GetAwaiter().GetResult();
		}

		public void CoroutineStop()
		{
			Discord.MessageReceived -= OnMessageReceived;
			Discord.Stop().GetAwaiter().GetResult();
		}
	}
	[BepInPlugin("AIO", "AIO", "1.6.2")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BasePlugin, IRunOnInitialized
	{
		public static readonly string ConfigPath = Path.Combine(Paths.ConfigPath, "SkanksAIO");

		internal static SkanksAIO.Logger.Logger Logger = null;

		internal static LiteDatabase? Database;

		private Harmony? harmony;

		internal static Plugin? Instance { get; private set; }

		internal static DateTime ServerStartTime { get; private set; }

		internal static ManualLogSource LogInstance { get; private set; }

		private App? App { get; set; }

		public override void Load()
		{
			if (!VWorld.IsServer)
			{
				((BasePlugin)this).Log.LogWarning((object)"This plugin is a server-only plugin! Stopping plugin.");
				return;
			}
			LogInstance = ((BasePlugin)this).Log;
			SetBindingRedirect();
			Instance = this;
		}

		public static void SetBindingRedirect()
		{
			AppDomain.CurrentDomain.AssemblyResolve += MyResolveEventHandler;
		}

		private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected O, but got Unknown
			if (args.Name.ToLower().Contains("Newtonsoft".ToLower()))
			{
				LogInstance.LogDebug((object)"Redirecting assembly load for Newtonsoft.Json.dll");
				string text = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\Newtonsoft.Json.dll";
				ManualLogSource logInstance = LogInstance;
				bool flag = default(bool);
				BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(18, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Assemblyfilename: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
				}
				logInstance.LogDebug(val);
				return Assembly.LoadFrom(text);
			}
			return null;
		}

		public void OnGameInitialized()
		{
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Expected O, but got Unknown
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Expected O, but got Unknown
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Expected O, but got Unknown
			if (!VWorld.IsServer)
			{
				return;
			}
			try
			{
				Logger = new SkanksAIO.Logger.Logger();
				Logger.RegisterLogHandler(new ConsoleLogHandler());
				Logger.RegisterLogHandler(new FileLogHandler());
				Logger.RegisterLogHandler(new DiscordLogHandler());
				Settings.Reload(((BasePlugin)this).Config);
				ClassInjector.RegisterTypeInIl2Cpp<App>();
				ClassInjector.RegisterTypeInIl2Cpp<WebBehaviour>();
				ClassInjector.RegisterTypeInIl2Cpp<DiscordBehaviour>();
				harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "AIO");
				App = ((BasePlugin)Instance).AddComponent<App>();
			}
			catch (Exception ex)
			{
				((BasePlugin)this).Log.LogError((object)("An error occured:" + ex));
			}
			ServerStartTime = DateTime.Now;
			bool flag = default(bool);
			try
			{
				string name = Assembly.GetExecutingAssembly().GetName().Name;
				string text = Path.Combine(Path.GetFullPath(Paths.PluginPath), name, "config");
				if (!Directory.Exists(text))
				{
					Directory.CreateDirectory(text);
				}
				string text2 = Path.Combine(text, name + ".db");
				ManualLogSource log = ((BasePlugin)this).Log;
				BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(11, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("dbPathFull ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text2);
				}
				log.LogDebug(val);
				Database = new LiteDatabase(text2, (BsonMapper)null);
			}
			catch (Exception ex2)
			{
				((BasePlugin)this).Log.LogError((object)("An error occured trying to access/create database file. ErrorMessage:" + ex2.Message));
			}
			ManualLogSource log2 = ((BasePlugin)this).Log;
			BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(11, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>("AIO");
				((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" is Loaded.");
			}
			log2.LogInfo(val2);
		}

		public override bool Unload()
		{
			if (!VWorld.IsServer)
			{
				return true;
			}
			if (Settings.EnableWebServer.Value)
			{
				Settings.WsInstance?.Stop();
			}
			App?.Stop();
			Harmony? obj = harmony;
			if (obj != null)
			{
				obj.UnpatchSelf();
			}
			return true;
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "AIO";

		public const string PLUGIN_NAME = "AIO";

		public const string PLUGIN_VERSION = "1.6.2";
	}
}
namespace SkanksAIO.Web
{
	public delegate void RequestReceived(HttpListenerContext context);
	internal class WebBehaviour : MonoBehaviour
	{
		private Queue<HttpListenerContext> requestQueue = new Queue<HttpListenerContext>();

		public static WebBehaviour? Instance { get; private set; }

		public event RequestReceived? OnRequestReceived;

		public WebBehaviour()
		{
			Instance = this;
		}

		public void QueueRequest(HttpListenerContext context)
		{
			requestQueue.Enqueue(context);
		}

		private void Update()
		{
			if (requestQueue.Count > 0)
			{
				HttpListenerContext context = requestQueue.Dequeue();
				this.OnRequestReceived?.Invoke(context);
			}
		}
	}
	[AttributeUsage(AttributeTargets.Class, Inherited = false)]
	public class ControllerAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Method, Inherited = false)]
	public class RouteAttribute : Attribute
	{
		public string Path { get; private set; } = "";


		public string[] Methods { get; private set; } = new string[1] { "GET" };


		public RouteAttribute(string Path, string[]? Methods = null)
		{
			this.Path = Path;
			if (Methods != null)
			{
				this.Methods = Methods;
			}
		}
	}
	[AttributeUsage(AttributeTargets.Method, Inherited = false)]
	public class TemplateAttribute : Attribute
	{
		public string Name { get; private set; } = "";


		public TemplateAttribute(string Name)
		{
			this.Name = Name;
		}
	}
	internal class Node
	{
		internal List<Node> nodes = new List<Node>();

		internal string key;

		internal MethodInfo? handler;

		internal Node(string key)
		{
			this.key = key;
		}

		private static bool IsSet(string str)
		{
			if (str != null)
			{
				return str.Trim().Length > 0;
			}
			return false;
		}

		internal void Insert(string uri, MethodInfo handler)
		{
			string[] array = uri.Split('/', 2);
			string key = array[0];
			string text = ((array.Length > 1) ? array[1] : "");
			if (nodes.Count == 0)
			{
				nodes.Add(new Node(key));
			}
			Node node = nodes.FirstOrDefault((Node n) => n.key == key);
			if (node == null)
			{
				nodes.Add(node = new Node(key));
			}
			if (IsSet(text))
			{
				node.Insert(text, handler);
			}
			else
			{
				node.handler = handler;
			}
		}

		internal MethodInfo? Get(string uri)
		{
			string[] array = uri.Split('/', 2);
			string key = array[0];
			string text = ((array.Length > 1) ? array[1] : "");
			Node node = nodes.FirstOrDefault((Node n) => n.key == key);
			if (node == null)
			{
				return null;
			}
			if (IsSet(text))
			{
				return node.Get(text);
			}
			return node.handler;
		}
	}
	internal class Router
	{
		private Dictionary<string, Node> routes = new Dictionary<string, Node>();

		internal void Insert(string method, string path, MethodInfo handler)
		{
			if (!routes.ContainsKey(method.ToUpper()))
			{
				routes.Add(method.ToUpper(), new Node(""));
			}
			routes[method.ToUpper()].Insert(path, handler);
		}

		internal async Task<string> RouteRequest(HttpListenerRequest request, HttpListenerResponse response)
		{
			response.ContentType = "text/plain";
			string text = request.Url?.AbsolutePath;
			if (text == null)
			{
				return "404";
			}
			string httpMethod = request.HttpMethod;
			if (!routes.ContainsKey(httpMethod.ToUpper()))
			{
				return "404";
			}
			Node node = routes[httpMethod.ToUpper()];
			MethodInfo handler = node.Get(text);
			if (handler == null || handler.DeclaringType == null)
			{
				response.StatusCode = 404;
				return "404";
			}
			object obj = Activator.CreateInstance(handler.DeclaringType);
			NameValueCollection queryString = request.QueryString;
			List<object> list = new List<object>();
			ParameterInfo[] parameters = handler.GetParameters();
			foreach (ParameterInfo parameterInfo in parameters)
			{
				if (parameterInfo.ParameterType == typeof(HttpListenerRequest))
				{
					list.Add(request);
				}
				else if (parameterInfo.ParameterType == typeof(string))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(queryString[parameterInfo.Name]);
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : "");
					}
				}
				else if (parameterInfo.ParameterType == typeof(int))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(int.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0));
					}
				}
				else if (parameterInfo.ParameterType == typeof(bool))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(bool.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)false));
					}
				}
				else if (parameterInfo.ParameterType == typeof(double))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(double.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0.0));
					}
				}
				else if (parameterInfo.ParameterType == typeof(float))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(float.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0f));
					}
				}
				else if (parameterInfo.ParameterType == typeof(long))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(long.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0L));
					}
				}
				else if (parameterInfo.ParameterType == typeof(short))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(short.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0));
					}
				}
				else if (parameterInfo.ParameterType == typeof(byte))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(byte.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0));
					}
				}
				else if (parameterInfo.ParameterType == typeof(char))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(char.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)'\0'));
					}
				}
				else if (parameterInfo.ParameterType == typeof(decimal))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(decimal.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0.0m));
					}
				}
				else if (parameterInfo.ParameterType == typeof(uint))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(uint.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0));
					}
				}
				else if (parameterInfo.ParameterType == typeof(ushort))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(ushort.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0));
					}
				}
				else if (parameterInfo.ParameterType == typeof(ulong))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(ulong.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0));
					}
				}
				else if (parameterInfo.ParameterType == typeof(sbyte))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(sbyte.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)0));
					}
				}
				else if (parameterInfo.ParameterType == typeof(char[]))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(queryString[parameterInfo.Name].ToCharArray());
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : new char[0]);
					}
				}
				else if (parameterInfo.ParameterType == typeof(DateTime))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(DateTime.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)DateTime.MinValue));
					}
				}
				else if (parameterInfo.ParameterType == typeof(TimeSpan))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(TimeSpan.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)TimeSpan.MinValue));
					}
				}
				else if (parameterInfo.ParameterType == typeof(Guid))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(Guid.Parse(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : ((object)Guid.Empty));
					}
				}
				else if (parameterInfo.ParameterType == typeof(Uri))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(new Uri(queryString[parameterInfo.Name]));
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : new Uri(""));
					}
				}
				else if (parameterInfo.ParameterType == typeof(object))
				{
					if (queryString[parameterInfo.Name] != null)
					{
						list.Add(queryString[parameterInfo.Name]);
					}
					else
					{
						list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : null);
					}
				}
				else if (queryString[parameterInfo.Name] != null)
				{
					list.Add(queryString[parameterInfo.Name]);
				}
				else
				{
					list.Add(parameterInfo.HasDefaultValue ? parameterInfo.DefaultValue : "");
				}
			}
			dynamic val = ((!(handler.ReturnType.BaseType == typeof(Task))) ? handler.Invoke(obj, list.ToArray()) : (await (Task<object>)handler.Invoke(obj, list.ToArray())));
			if (val == null)
			{
				response.StatusCode = 404;
				return "404";
			}
			TemplateAttribute customAttribute = handler.GetCustomAttribute<TemplateAttribute>();
			if (customAttribute == null)
			{
				dynamic val2 = val.ToString();
				if (val2 == null)
				{
					response.StatusCode = 500;
					return "500";
				}
				val2 = val2.Trim();
				dynamic val3 = val2.StartsWith("{");
				if (val3 || val2.StartsWith("["))
				{
					response.ContentType = "application/json";
					return JsonConvert.SerializeObject(val);
				}
				response.ContentType = "text/plain";
				return val2;
			}
			string text2 = customAttribute.Name;
			if (text2.StartsWith("/"))
			{
				text2 = text2.Substring(1);
			}
			string text3 = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "templates", text2);
			if (!File.Exists(text3))
			{
				response.StatusCode = 404;
				return "Template [" + text3 + "] not found";
			}
			string text4 = File.ReadAllText(text3);
			try
			{
				Template val4 = Template.Parse(text4, (string)null, (ParserOptions?)null, (LexerOptions?)null);
				dynamic val5 = val4.Render(val);
				response.ContentType = "text/html";
				return val5;
			}
			catch (Exception ex)
			{
				response.StatusCode = 500;
				return "Error rendering template [" + text3 + "]: " + ex.Message;
			}
		}
	}
	internal class WebServer
	{
		private int port;

		private HttpListener _listener;

		private Router router = new Router();

		private WebBehaviour? behaviour;

		public WebServer(int port)
		{
			_listener = new HttpListener();
			this.port = port;
		}

		public void Start()
		{
			Plugin? instance = Plugin.Instance;
			behaviour = ((instance != null) ? ((BasePlugin)instance).AddComponent<WebBehaviour>() : null);
			behaviour.OnRequestReceived += OnRequestReceived;
			foreach (Type item in from t in Assembly.GetExecutingAssembly().GetTypes()
				where t.IsDefined(typeof(ControllerAttribute), inherit: false)
				select t)
			{
				if (!Settings.EnableInteractiveMap.Value && item.Name == "MapController")
				{
					continue;
				}
				MethodInfo[] methods = item.GetMethods();
				foreach (MethodInfo methodInfo in methods)
				{
					RouteAttribute customAttribute = methodInfo.GetCustomAttribute<RouteAttribute>();
					if (customAttribute != null)
					{
						string[] methods2 = customAttribute.Methods;
						foreach (string method in methods2)
						{
							router.Insert(method, customAttribute.Path, methodInfo);
						}
					}
				}
			}
			_listener.Prefixes.Add("http://+:" + port + "/");
			_listener.Start();
			accept();
			Plugin.Logger?.LogMessage($"[Webserver] Listening on port {port}");
		}

		public void Stop()
		{
			_listener.Stop();
			behaviour = null;
		}

		private void accept()
		{
			_listener.BeginGetContext(ListenerCallback, _listener);
		}

		public void OnRequestReceived(HttpListenerContext? context)
		{
			try
			{
				if (context == null)
				{
					Plugin.Logger?.LogWarning("[Webserver] Received null context.");
					return;
				}
				HttpListenerRequest request = context.Request;
				HttpListenerResponse response = context.Response;
				string result = router.RouteRequest(request, response).GetAwaiter().GetResult();
				byte[] bytes = Encoding.UTF8.GetBytes(result);
				response.ContentLength64 = bytes.Length;
				Stream outputStream = response.OutputStream;
				outputStream.Write(bytes, 0, bytes.Length);
				outputStream.Close();
				if (_listener.IsListening)
				{
					accept();
				}
			}
			catch (HttpListenerException ex)
			{
				Plugin.Logger?.LogError("[Webserver] Error too many requests! " + ((Exception)(object)ex).Message + "Stacktrace: " + ((Exception)(object)ex).StackTrace);
			}
		}

		private void ListenerCallback(IAsyncResult result)
		{
			HttpListenerContext context = _listener.EndGetContext(result);
			behaviour.QueueRequest(context);
			accept();
		}
	}
}
namespace SkanksAIO.Web.Controllers
{
	[Controller]
	internal class IndexController
	{
		[Route("/", new string[] { "GET" })]
		[Template("index.html.twig")]
		public dynamic IndexAction(HttpListenerRequest request)
		{
			return new
			{
				users = from x in Player.GetPlayerRepository.FindAll()
					orderby x.KD descending
					select x
			};
		}
	}
	[Controller]
	public class MapController
	{
		[Route("/map", new string[] { "GET" })]
		[Template("Map.html.twig")]
		public dynamic MapAction(HttpListenerRequest request)
		{
			return new
			{
				NONE = ""
			};
		}

		[Route("/map-data-CustomMarkers", new string[] { "GET" })]
		public dynamic CustomMarkersDataAction(HttpListenerRequest request)
		{
			try
			{
				Dictionary<string, JsonConfigHelper.MarkerLocationData> markers = JsonConfigHelper.GetMarkers();
				return CustomMarkersToJson(markers);
			}
			catch (Exception)
			{
				return "";
			}
		}

		[Route("/map-data-Territories", new string[] { "GET" })]
		public dynamic TerritoryDataAction(HttpListenerRequest request)
		{
			try
			{
				Dictionary<string, UserUtils.TerritoryData> playerTerritory = UserUtils.GetPlayerTerritory();
				return TerritoryPositionToJson(playerTerritory);
			}
			catch (Exception)
			{
				return "";
			}
		}

		[Route("/map-data-player", new string[] { "GET" })]
		public dynamic PlayerDataAction(HttpListenerRequest request)
		{
			try
			{
				if (!Settings.TrackPlayersOnMap.Value)
				{
					StringBuilder stringBuilder = new StringBuilder();
					stringBuilder.Append('{');
					stringBuilder.Append("\"Name\":\"EMPTYSKANKSERVER\",");
					stringBuilder.Append("\"X\":0,");
					stringBuilder.Append("\"Y\":0");
					stringBuilder.Append('}');
					return stringBuilder.ToString();
				}
				List<PlayerLocation> allPlayerPositions = UserUtils.GetAllPlayerPositions();
				return PlayerPositionToJson(allPlayerPositions);
			}
			catch (Exception)
			{
				return "";
			}
		}

		[Route("/map-update", new string[] { "GET" })]
		public dynamic UpdateIntervalAction(HttpListenerRequest request)
		{
			return Settings.InteractiveMapUpdateInterval.Value.ToString();
		}

		[Route("map-data-regions", new string[] { "GET" })]
		public dynamic RegionDataAction(HttpListenerRequest request)
		{
			try
			{
				return "";
			}
			catch (Exception)
			{
				return "";
			}
		}

		private string TerritoryPositionToJson(Dictionary<string, UserUtils.TerritoryData> territoryPositions)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append('[');
			foreach (KeyValuePair<string, UserUtils.TerritoryData> territoryPosition in territoryPositions)
			{
				stringBuilder.Append('{');
				StringBuilder stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder3 = stringBuilder2;
				StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(15, 1, stringBuilder2);
				handler.AppendLiteral("\"Territory\":\"");
				handler.AppendFormatted(territoryPosition.Key);
				handler.AppendLiteral("\",");
				stringBuilder3.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder4 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(15, 1, stringBuilder2);
				handler.AppendLiteral("\"PlayerCount\":");
				handler.AppendFormatted(territoryPosition.Value.PlayerCount);
				handler.AppendLiteral(",");
				stringBuilder4.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder5 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(5, 1, stringBuilder2);
				handler.AppendLiteral("\"X\":");
				handler.AppendFormatted(territoryPosition.Value.X.ToString(CultureInfo.InvariantCulture).Replace(',', '.'));
				handler.AppendLiteral(",");
				stringBuilder5.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder6 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(5, 1, stringBuilder2);
				handler.AppendLiteral("\"Y\":");
				handler.AppendFormatted(territoryPosition.Value.Y.ToString(CultureInfo.InvariantCulture).Replace(',', '.'));
				handler.AppendLiteral(",");
				stringBuilder6.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder7 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(6, 1, stringBuilder2);
				handler.AppendLiteral("\"BX\":");
				handler.AppendFormatted(territoryPosition.Value.BX.ToString(CultureInfo.InvariantCulture).Replace(',', '.'));
				handler.AppendLiteral(",");
				stringBuilder7.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder8 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(6, 1, stringBuilder2);
				handler.AppendLiteral("\"BY\":");
				handler.AppendFormatted(territoryPosition.Value.BY.ToString(CultureInfo.InvariantCulture).Replace(',', '.'));
				handler.AppendLiteral(",");
				stringBuilder8.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder9 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(6, 1, stringBuilder2);
				handler.AppendLiteral("\"TX\":");
				handler.AppendFormatted(territoryPosition.Value.TX.ToString(CultureInfo.InvariantCulture).Replace(',', '.'));
				handler.AppendLiteral(",");
				stringBuilder9.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder10 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(5, 1, stringBuilder2);
				handler.AppendLiteral("\"TY\":");
				handler.AppendFormatted(territoryPosition.Value.TY.ToString(CultureInfo.InvariantCulture).Replace(',', '.'));
				stringBuilder10.Append(ref handler);
				stringBuilder.Append('}');
				stringBuilder.Append(',');
			}
			if (territoryPositions.Count > 0)
			{
				stringBuilder.Length--;
			}
			stringBuilder.Append(']');
			return stringBuilder.ToString();
		}

		private string CustomMarkersToJson(Dictionary<string, JsonConfigHelper.MarkerLocationData> markerPositions)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append('[');
			foreach (KeyValuePair<string, JsonConfigHelper.MarkerLocationData> markerPosition in markerPositions)
			{
				stringBuilder.Append('{');
				StringBuilder stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder3 = stringBuilder2;
				StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(16, 1, stringBuilder2);
				handler.AppendLiteral("\"MarkerName\":\"");
				handler.AppendFormatted(markerPosition.Key);
				handler.AppendLiteral("\",");
				stringBuilder3.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder4 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(16, 1, stringBuilder2);
				handler.AppendLiteral("\"MarkerType\":\"");
				handler.AppendFormatted(markerPosition.Value.Type.ToString());
				handler.AppendLiteral("\",");
				stringBuilder4.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder5 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(5, 1, stringBuilder2);
				handler.AppendLiteral("\"X\":");
				handler.AppendFormatted(markerPosition.Value.X.ToString(CultureInfo.InvariantCulture).Replace(',', '.'));
				handler.AppendLiteral(",");
				stringBuilder5.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder6 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(4, 1, stringBuilder2);
				handler.AppendLiteral("\"Y\":");
				handler.AppendFormatted(markerPosition.Value.Y.ToString(CultureInfo.InvariantCulture).Replace(',', '.'));
				stringBuilder6.Append(ref handler);
				stringBuilder.Append('}');
				stringBuilder.Append(',');
			}
			if (markerPositions.Count > 0)
			{
				stringBuilder.Length--;
			}
			stringBuilder.Append(']');
			return stringBuilder.ToString();
		}

		private string PlayerPositionToJson(List<PlayerLocation> playerPositions)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append('[');
			for (int i = 0; i < playerPositions.Count; i++)
			{
				PlayerLocation playerLocation = playerPositions[i];
				stringBuilder.Append('{');
				StringBuilder stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder3 = stringBuilder2;
				StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(10, 1, stringBuilder2);
				handler.AppendLiteral("\"Name\":\"");
				handler.AppendFormatted(playerLocation.Name);
				handler.AppendLiteral("\",");
				stringBuilder3.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder4 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(5, 1, stringBuilder2);
				handler.AppendLiteral("\"X\":");
				handler.AppendFormatted(playerLocation.X.ToString(CultureInfo.InvariantCulture).Replace(',', '.'));
				handler.AppendLiteral(",");
				stringBuilder4.Append(ref handler);
				stringBuilder2 = stringBuilder;
				StringBuilder stringBuilder5 = stringBuilder2;
				handler = new StringBuilder.AppendInterpolatedStringHandler(4, 1, stringBuilder2);
				handler.AppendLiteral("\"Y\":");
				handler.AppendFormatted(playerLocation.Z.ToString(CultureInfo.InvariantCulture).Replace(',', '.'));
				stringBuilder5.Append(ref handler);
				stringBuilder.Append('}');
				if (i < playerPositions.Count - 1)
				{
					stringBuilder.Append(',');
				}
			}
			stringBuilder.Append(']');
			return stringBuilder.ToString();
		}
	}
}
namespace SkanksAIO.Utils
{
	public static class Cache
	{
		public static Dictionary<Entity, Entity> CastleHeartOwnerCache = new Dictionary<Entity, Entity>();

		public static Dictionary<Entity, Structs.PlayerGroup> AlliesCache = new Dictionary<Entity, Structs.PlayerGroup>();
	}
	internal static class DiscordUtils
	{
		internal static EmbedBuilder CreateEmbedBuilder(string title)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Expected O, but got Unknown
			EmbedBuilder val = new EmbedBuilder();
			val.WithTitle($"**{Settings.MessageTitle.Value} - {title}**");
			if (!string.IsNullOrEmpty(Settings.MessageFooter.Value) || !string.IsNullOrEmpty(Settings.MessageFooterIcon.Value))
			{
				val.WithFooter((Action<EmbedFooterBuilder>)delegate(EmbedFooterBuilder footer)
				{
					if (!string.IsNullOrEmpty(Settings.MessageFooter.Value))
					{
						footer.WithText(Settings.MessageFooter.Value);
					}
					if (!string.IsNullOrEmpty(Settings.MessageFooterIcon.Value))
					{
						footer.WithIconUrl(Settings.MessageFooterIcon.Value);
					}
				});
			}
			return val;
		}
	}
	public static class Extensions
	{
		public delegate void ActionRefTest<T>(ref T item);

		public static void WithComponentDataAOT<T>(this Entity entity, ActionRefTest<T> action) where T : unmanaged
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: 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_0026: Unknown result type (might be due to invalid IL or missing references)
			T item = VWorld.Game.EntityManager.GetComponentDataAOT<T>(entity);
			action(ref item);
			EntityManager entityManager = VWorld.Game.EntityManager;
			((EntityManager)(ref entityManager)).SetComponentData<T>(entity, item);
		}

		private static Type GetType<T>()
		{
			return Il2CppType.Of<T>();
		}

		public unsafe static T GetComponentDataAOT<T>(this EntityManager entityManager, Entity entity) where T : unmanaged
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			TypeIndex typeIndex = TypeManager.GetTypeIndex(GetType<T>());
			T* componentDataRawRW = (T*)((EntityManager)(ref entityManager)).GetComponentDataRawRW(entity, typeIndex);
			return *componentDataRawRW;
		}
	}
	public static class Messaging
	{
		private static EntityManager em = VWorld.Server.EntityManager;

		public static void SendMessage(User user, ServerChatMessageType msgType, string message)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Invalid comparison between Unknown and I4
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Invalid comparison between Unknown and I4
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			if ((int)msgType == 1)
			{
				ServerChatUtils.SendSystemMessageToAllClients(em, message);
			}
			else if ((int)msgType == 6)
			{
				ServerChatUtils.SendSystemMessageToClient(em, user, message);
			}
		}

		public static void SendMessage(Entity userEntity, ServerChatMessageType msgType, string message)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			User user = default(User);
			((EntityManager)(ref em)).TryGetComponentData<User>(userEntity, ref user);
			SendMessage(user, msgType, message);
		}

		public static void SendGlobalMessage(ServerChatMessageType msgType, string message)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: 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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Invalid comparison between Unknown and I4
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			Plugin.Logger?.LogDebug("SendGlobalMessage method called");
			Plugin.Logger?.LogDebug("Creating user query");
			EntityQuery val = ((EntityManager)(ref em)).CreateEntityQuery((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly(Il2CppType.Of<User>()) });
			NativeArray<Entity> val2 = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
			Plugin.Logger?.LogDebug("User query created");
			if ((int)msgType == 1)
			{
				Plugin.Logger?.LogDebug("Sending global message");
				ServerChatUtils.SendSystemMessageToAllClients(em, message);
				Plugin.Logger?.LogDebug("Global message sent");
			}
			else
			{
				if ((int)msgType != 6)
				{
					return;
				}
				Plugin.Logger?.LogDebug("Sending system message to each user");
				Enumerator<Entity> enumerator = val2.GetEnumerator();
				User val3 = default(User);
				while (enumerator.MoveNext())
				{
					Entity current = enumerator.Current;
					Plugin.Logger?.LogDebug("Getting user component data");
					((EntityManager)(ref em)).TryGetComponentData<User>(current, ref val3);
					Plugin.Logger?.LogDebug("User component data retrieved");
					if (val3.IsConnected)
					{
						SendMessage(val3, msgType, message);
					}
				}
				Plugin.Logger?.LogDebug("System message sent to each user");
			}
		}
	}
	public class Structs
	{
		public struct PlayerGroup
		{
			public int AllyCount { get; set; }

			public Dictionary<Entity, Entity> Allies { get; set; }

			public DateTime TimeStamp { get; set; }

			public PlayerGroup(int allyCount = 0, Dictionary<Entity, Entity> allies = null, DateTime timeStamp = default(DateTime))
			{
				AllyCount = allyCount;
				Allies = allies;
				TimeStamp = timeStamp;
			}
		}
	}
	public class UserUtils
	{
		public class TerritoryData
		{
			public int PlayerCount { get; set; }

			public float X { get; set; }

			public float Y { get; set; }

			public float BX { get; set; }

			public float BY { get; set; }

			public float TX { get; set; }

			public float TY { get; set; }
		}

		private static EntityManager _em = VWorld.Server.EntityManager;

		public static ServerGameManager SGM = default(ServerGameManager);

		private static Dictionary<ulong, Vector3> playerPositions = new Dictionary<ulong, Vector3>();

		public static bool GetServerGameManager(out ServerGameManager sgm)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			sgm = VWorld.Server.GetExistingSystemManaged<ServerScriptMapper>()._ServerGameManager;
			return true;
		}

		public static int GetAllies(Entity CharacterEntity, out Dictionary<Entity, Entity> Group)
		{
			//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_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: 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_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: 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_0082: 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_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			Group = new Dictionary<Entity, Entity>();
			EntityManager entityManager = VWorld.Server.EntityManager;
			Team componentData = ((EntityManager)(ref entityManager)).GetComponentData<Team>(CharacterEntity);
			int num = 0;
			EntityQuery val = ((EntityManager)(ref entityManager)).CreateEntityQuery((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly<User>() });
			Enumerator<Entity> enumerator = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)).GetEnumerator();
			User val2 = default(User);
			Team val3 = default(Team);
			while (enumerator.MoveNext())
			{
				Entity current = enumerator.Current;
				((EntityManager)(ref entityManager)).TryGetComponentData<User>(current, ref val2);
				Entity entity = val2.LocalCharacter._Entity;
				((EntityManager)(ref entityManager)).TryGetComponentData<Team>(entity, ref val3);
				if (!((Entity)(ref CharacterEntity)).Equals(entity) && Team.IsAllies(componentData, val3))
				{
					num++;
					Group[current] = entity;
				}
			}
			if (num < 1)
			{
				return 0;
			}
			return num;
		}

		public static bool TryGetUserByPlatformId(ulong platformId, out User? user)
		{
			//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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: 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)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: 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_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			EntityQuery val = ((EntityManager)(ref _em)).CreateEntityQuery((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly(Il2CppType.Of<User>()) });
			Enumerator<Entity> enumerator = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)).GetEnumerator();
			while (enumerator.MoveNext())
			{
				Entity current = enumerator.Current;
				EntityManager entityManager = VWorld.Server.EntityManager;
				User componentData = ((EntityManager)(ref entityManager)).GetComponentData<User>(current);
				if (componentData.PlatformId == platformId)
				{
					user = componentData;
					return true;
				}
			}
			user = null;
			return false;
		}

		public static bool TryGetUserByCharacterName(string characterName, out User user)
		{
			//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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: 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)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			EntityQuery val = ((EntityManager)(ref _em)).CreateEntityQuery((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly(Il2CppType.Of<User>()) });
			Enumerator<Entity> enumerator = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)).GetEnumerator();
			User val2 = default(User);
			while (enumerator.MoveNext())
			{
				Entity current = enumerator.Current;
				EntityManager entityManager = VWorld.Server.EntityManager;
				((EntityManager)(ref entityManager)).TryGetComponentData<User>(current, ref val2);
				if (string.Equals(((object)(FixedString64Bytes)(ref val2.CharacterName)).ToString().ToLower(), characterName.ToLower()))
				{
					user = val2;
					return true;
				}
			}
			user = default(User);
			return false;
		}

		public static List<User> GetOnlineUsers()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			List<User> list = new List<User>();
			EntityQuery val = ((EntityManager)(ref _em)).CreateEntityQuery((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly(Il2CppType.Of<User>()) });
			Enumerator<Entity> enumerator = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)).GetEnumerator();
			User val2 = default(User);
			while (enumerator.MoveNext())
			{
				Entity current = enumerator.Current;
				EntityManager entityManager = VWorld.Server.EntityManager;
				if (((EntityManager)(ref entityManager)).TryGetComponentData<User>(current, ref val2) && val2.IsConnected)
				{
					list.Add(val2);
				}
			}
			return list;
		}

		public static List<User> GetUsers()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			EntityQuery val = ((EntityManager)(ref _em)).CreateEntityQuery((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadWrite<User>() });
			return UserUtils.NativeArrayToList<User>(((EntityQuery)(ref val)).ToComponentDataArray<User>(AllocatorHandle.op_Implicit((Allocator)2)));
		}

		public static Entity UserToPlayerEntity(User user)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return ((NetworkedEntity)(ref user.LocalCharacter)).GetEntityOnServer();
		}

		public static User GetUserByCharacterName(string characterName)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			string characterName2 = characterName;
			return GetUsers().Find((User user) => string.Equals(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString(), characterName2, StringComparison.CurrentCultureIgnoreCase));
		}

		public static List<User> GetUsersByContainedCharacterName(string message)
		{
			string message2 = message;
			return GetUsers().FindAll((User user) => message2.ToLower().Contains(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString().ToLower()));
		}

		public static List<T> NativeArrayToList<T>(NativeArray<T> array) where T : unmanaged
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			List<T> list = new List<T>();
			Enumerator<T> enumerator = array.GetEnumerator();
			while (enumerator.MoveNext())
			{
				T current = enumerator.Current;
				list.Add(current);
			}
			return list;
		}

		public static void UpdatePlayerPosition(ulong platformId, Vector3 position)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			playerPositions[platformId] = position;
		}

		public static Vector3 GetPlayerPosition(ulong platformId)
		{
			//IL_0019: 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_0017: Unknown result type (might be due to invalid IL or missing references)
			if (!playerPositions.TryGetValue(platformId, out var value))
			{
				return default(Vector3);
			}
			return value;
		}

		public static List<PlayerLocation> GetAllPlayerPositions()
		{
			//IL_0019: 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_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			Translation val2 = default(Translation);
			foreach (User user in GetOnlineUsers())
			{
				if (Player.GetPlayerRepository.FindOne((Expression<Func<Player, bool>>)((Player x) => x.PlatformId == user.PlatformId)) != null)
				{
					Player player2 = Player.GetPlayerRepository.FindOne((Expression<Func<Player, bool>>)((Player x) => x.PlatformId == user.PlatformId));
					if (player2.PlatformId == user.PlatformId)
					{
						Entity val = UserToPlayerEntity(user);
						EntityManager entityManager = VWorld.Server.EntityManager;
						((EntityManager)(ref entityManager)).TryGetComponentData<Translation>(val, ref val2);
						UpdatePlayerPosition(player2.PlatformId, float3.op_Implicit(val2.Value));
					}
				}
			}
			return (from player in Player.GetPlayerRepository.FindAll()
				let pos = GetPlayerPosition(player.PlatformId)
				select new PlayerLocation
				{
					Name = player.CharacterName,
					X = pos.x,
					Y = pos.y,
					Z = pos.z
				}).ToList();
		}

		public static Dictionary<string, TerritoryData> GetPlayerTerritory()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: 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_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: 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_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			Dictionary<string, TerritoryData> dictionary = new Dictionary<string, TerritoryData>();
			EntityManager entityManager = VWorld.Server.EntityManager;
			EntityQueryDesc[] array = new EntityQueryDesc[1];
			EntityQueryDesc val = new EntityQueryDesc();
			val.All = Il2CppStructArray<ComponentType>.op_Implicit((ComponentType[])(object)new ComponentType[2]
			{
				ComponentType.ReadOnly<CurrentMapZone>(),
				ComponentType.ReadOnly<CurrentWorldRegion>()
			});
			val.None = Il2CppStructArray<ComponentType>.op_Implicit((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly<DestroyTag>() });
			array[0] = val;
			EntityQuery val2 = ((EntityManager)(ref entityManager)).CreateEntityQuery((EntityQueryDesc[])(object)array);
			NativeArray<Entity> val3 = ((EntityQuery)(ref val2)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
			foreach (Territory item in Territory.GetTerritoryRepository.FindAll())
			{
				dictionary.Add(item.territoryName, new TerritoryData
				{
					PlayerCount = 0,
					X = item.CenterX,
					Y = item.CenterZ,
					BX = item.MinX,
					BY = item.MinZ,
					TX = item.MaxX,
					TY = item.MaxZ
				});
			}
			Enumerator<Entity> enumerator2 = val3.GetEnumerator();
			while (enumerator2.MoveNext())
			{
				Entity current2 = enumerator2.Current;
				CurrentWorldRegion userRegion = VWorld.Server.EntityManager.GetComponentDataAOT<CurrentWorldRegion>(current2);
				Territory territory = Territory.GetTerritoryRepository.FindOne((Expression<Func<Territory, bool>>)((Territory x) => x.territoryName == ((object)userRegion.CurrentRegion).ToString()));
				if (territory != null && dictionary.ContainsKey(territory.territoryName))
				{
					dictionary[territory.territoryName].PlayerCount++;
					territory.playersInRegion = dictionary[territory.territoryName].PlayerCount;
					Territory.GetTerritoryRepository.Update(territory);
				}
			}
			return dictionary;
		}
	}
}
namespace SkanksAIO.Utils.Config
{
	public static class JsonConfigHelper
	{
		public class MarkerLocationData
		{
			public MarkerType Type { get; set; }

			public float X { get; set; }

			public float Y { get; set; }

			public MarkerLocationData(MarkerType type, float x, float y)
			{
				Type = type;
				X = x;
				Y = y;
			}
		}

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

		private static List<ulong> Vips = new List<ulong>();

		private static Dictionary<string, string> DefaultMessagesDictionary => new Dictionary<string, string>
		{
			{ "online", "%user% is online!" },
			{ "offline", "%user% has gone offline!" },
			{ "newUserCreatedCharacter", "%user% has finished character creation!" },
			{ "newUserOnline", "A new vampire just joined" },
			{ "newUserOffline", "A vampire left before finishing character creation" }
		};

		private static Dictionary<string, MarkerLocationData> DefaultMarkerDictionary => new Dictionary<string, MarkerLocationData> { 
		{
			"TestMarker",
			new MarkerLocationData(MarkerType.Fortification, 0f, 0f)
		} };

		private static Dictionary<string, string> DefaultOnlineMessages => new Dictionary<string, string>
		{
			{ "CharacterName", "%user% is back baby!" },
			{ "CharacterName2", "The best V rising player: %user% is here!" }
		};

		private static Dictionary<string, string> DefaultOfflineMessages => new Dictionary<string, string>
		{
			{ "CharacterName", "%user% went offline..." },
			{ "CharacterName2", "Where did %user% go? They went offline..." }
		};

		private static List<string> DefaultAnnouncements => new List<string> { "Announcement 1", "Announcement 2", "Announcement 3" };

		private static List<ulong> DefaultVips => new List<ulong> { 76561197960287930uL, 76561197960287931uL, 76561197960287932uL };

		private static Dictionary<string, string> DefaultMessage { get; set; } = new Dictionary<string, string>();


		private static Dictionary<string, string> UsersOnlineMessages { get; set; } = new Dictionary<string, string>();


		private static Dictionary<string, string> UsersOfflineMessages { get; set; } = new Dictionary<string, string>();


		private static Dictionary<string, MarkerLocationData> Markers { get; set; } = new Dictionary<string, MarkerLocationData>();


		private static float AnnouncementInterval { get; set; }

		public static void CreateJsonConfigs()
		{
			if (!Directory.Exists(Plugin.ConfigPath))
			{
				Directory.CreateDirectory(Plugin.ConfigPath);
			}
			if (!File.Exists(Path.Combine(Plugin.ConfigPath, "Messages.json")))
			{
				string contents = JsonSerializer.Serialize(DefaultMessagesDictionary);
				File.WriteAllText(Path.Combine(Plugin.ConfigPath, "Messages.json"), contents);
			}
			if (!File.Exists(Path.Combine(Plugin.ConfigPath, "Markers.json")))
			{
				string contents = JsonSerializer.Serialize(DefaultMarkerDictionary);
				File.WriteAllText(Path.Combine(Plugin.ConfigPath, "Markers.json"), contents);
			}
			if (!File.Exists(Path.Combine(Plugin.ConfigPath, "OnlineMessage.json")))
			{
				string contents = JsonSerializer.Serialize(DefaultOnlineMessages);
				File.WriteAllText(Path.Combine(Plugin.ConfigPath, "OnlineMessage.json"), contents);
			}
			if (!File.Exists(Path.Combine(Plugin.ConfigPath, "OfflineMessage.json")))
			{
				string contents = JsonSerializer.Serialize(DefaultOfflineMessages);
				File.WriteAllText(Path.Combine(Plugin.ConfigPath, "OfflineMessage.json"), contents);
			}
			if (!File.Exists(Path.Combine(Plugin.ConfigPath, "Announcements.json")))
			{
				string contents = JsonSerializer.Serialize(DefaultAnnouncements);
				File.WriteAllText(Path.Combine(Plugin.ConfigPath, "Announcements.json"), contents);
			}
			if (!File.Exists(Path.Combine(Plugin.ConfigPath, "Vips.json")))
			{
				string contents = JsonSerializer.Serialize(DefaultVips);
				File.WriteAllText(Path.Combine(Plugin.ConfigPath, "Vips.json"), contents);
			}
		}

		public static void LoadAllConfigs()
		{
			SetDefaultMessage(JsonSerializer.Deserialize<Dictionary<string, string>>(File.ReadAllText(Path.Combine(Plugin.ConfigPath, "Messages.json"))));
			SetMarkers(JsonSerializer.Deserialize<Dictionary<string, MarkerLocationData>>(File.ReadAllText(Path.Combine(Plugin.ConfigPath, "Markers.json"))));
			SetOnlineMessage(JsonSerializer.Deserialize<Dictionary<string, string>>(File.ReadAllText(Path.Combine(Plugin.ConfigPath, "OnlineMessage.json"))));
			SetOfflineMessage(JsonSerializer.Deserialize<Dictionary<string, string>>(File.ReadAllText(Path.Combine(Plugin.ConfigPath, "OfflineMessage.json"))));
			SetAnnouncements(JsonSerializer.Deserialize<List<string>>(File.ReadAllText(Path.Combine(Plugin.ConfigPath, "Announcements.json"))));
			SetVips(JsonSerializer.Deserialize<List<ulong>>(File.ReadAllText(Path.Combine(Plugin.ConfigPath, "Vips.json"))));
		}

		public static Dictionary<string, MarkerLocationData> GetMarkers()
		{
			return Markers;
		}

		private static void SetMarkers(Dictionary<string, MarkerLocationData> value)
		{
			if (value.Count != 0)
			{
				Markers = value;
			}
		}

		private static bool SaveMarkers()
		{
			try
			{
				string contents = JsonSerializer.Serialize(Markers);
				File.WriteAllText(Path.Combine(Plugin.ConfigPath, "Markers.json"), contents);
				return true;
			}
			catch (Exception)
			{
				return false;
			}
		}

		public static bool AddMarker(string markerName, MarkerLocationData value)
		{
			if (string.IsNullOrEmpty(markerName))
			{
				return false;
			}
			if (Markers.TryAdd(markerName, value))
			{
				return SaveMarkers();
			}
			return false;
		}

		public static bool RemoveMarker(string markerName)
		{
			if (string.IsNullOrEmpty(markerName))
			{
				return false;
			}
			if (Markers.Remove(markerName))
			{
				return SaveMarkers();
			}
			return false;
		}

		public static string GetDefaultMessage(string value)
		{
			if (string.IsNullOrEmpty(value))
			{
				return value;
			}
			if (!DefaultMessage.ContainsKey(value))
			{
				return value;
			}
			return DefaultMessage[value];
		}

		private static bool SetDefaultMessage(Dictionary<string, string> value)
		{
			if (value.Count == 0)
			{
				return false;
			}
			DefaultMessage = value;
			return true;
		}

		public static string GetOnlineMessage(string user)
		{
			if (string.IsNullOrEmpty(user))
			{
				return GetDefaultMessage("newUserOnline");
			}
			if (!UsersOnlineMessages.ContainsKey(user))
			{
				return GetDefaultMessage("online");
			}
			return UsersOnlineMessages[user];
		}

		private static bool SetOnlineMessage(Dictionary<string, string> value)
		{
			if (value.Count == 0)
			{
				return false;
			}
			UsersOnlineMessages = value;
			return true;
		}

		public static string GetOfflineMessage(string user)
		{
			if (string.IsNullOrEmpty(user))
			{
				return GetDefaultMessage("newUserOffline");
			}
			if (UsersOfflineMessages.ContainsKey(user))
			{
				return UsersOfflineMessages[user];
			}
			return GetDefaultMessage("offline");
		}

		public static bool SetOfflineMessage(Dictionary<string, string> value)
		{
			if (value.Count == 0)
			{
				return false;
			}
			UsersOfflineMessages = value;
			return true;
		}

		private static void SetAnnouncements(List<string> announcements)
		{
			Announcements = announcements;
		}

		public static List<string> GetAnnouncements()
		{
			return Announcements;
		}

		public static List<ulong> GetVips()
		{
			return Vips;
		}

		private static void SetVips(List<ulong> vips)
		{
			Vips = vips;
		}

		public static float GetAnnouncementInterval()
		{
			return AnnouncementInterval;
		}

		public static void SetAnnouncementInterval(float announcementInterval)
		{
			AnnouncementInterval = announcementInterval;
		}
	}
	public class Settings
	{
		public static Random Random;

		internal static int LastEntry;

		public static ConfigEntry<bool> DisableOfflineRaiding;

		public static ConfigEntry<bool> FactorAllies;

		public static ConfigEntry<int> MaxAllyCacheAge;

		public static ConfigFile Config { get; private set; }

		internal static ConfigEntry<string>? Token { get; private set; }

		internal static ConfigEntry<ulong>? ChannelId { get; private set; }

		internal static ConfigEntry<ulong>? AdminRoleId { get; private set; }

		internal static ConfigEntry<ulong>? AnnounceChannelId { get; private set; }

		internal static ConfigEntry<bool> EnableWebServer { get; private set; }

		internal static ConfigEntry<bool> EnablePvPKillTracker { get; private set; }

		internal static ConfigEntry<bool> EnableInteractiveMap { get; private set; }

		internal static ConfigEntry<int> InteractiveMapUpdateInterval { get; private set; }

		internal static ConfigEntry<bool> TrackPlayersOnMap { get; private set; }

		internal static ConfigEntry<int>? WebPort { get; private set; }

		internal static WebServer? WsInstance { get; private set; }

		internal static ConfigEntry<string> MessageFooter { get; private set; }

		internal static ConfigEntry<string> MessageFooterIcon { get; private set; }

		internal static ConfigEntry<string> MessageTitle { get; private set; }

		internal static ConfigEntry<bool> LeaderboardAsList { get; private set; }

		internal static ConfigEntry<string> ChatCommandPrefix { get; private set; }

		internal static ConfigEntry<string> GlobalChatLabel { get; private set; }

		internal static ConfigEntry<bool> EnableVIPFunctionality { get; private set; }

		internal static ConfigEntry<float> AnnounceTimer { get; private set; }

		internal static ConfigEntry<bool> AnnounceRandomOrder { get; private set; }

		internal static ConfigEntry<bool> AnnounceEnabled { get; private set; }

		internal static ConfigEntry<bool> ShowUserConnectedInDc { get; private set; }

		internal static ConfigEntry<bool> ShowUserDisConnectedInDc { get; private set; }

		private static void Initialize(ConfigFile config)
		{
			Config = config;
			EnablePvPKillTracker = config.Bind<bool>("Server", "EnablePvPKillTracker", true, "Enables the PvP Kill Tracker. Warning: if disabled ELO wont update when killing other players (because it doesnt track kills anymore (only applicable to PvP)).");
			Token = config.Bind<string>("Discord", "Token", "", "Bot Token from https://discord.com/developers/applications");
			ChannelId = config.Bind<ulong>("Discord", "ChannelId", 0uL, "Channel ID of the channel to post messages to");
			AnnounceChannelId = config.Bind<ulong>("Discord", "AnnounceChannelId", 0uL, "Channel ID of the channel to post Announcements to (leave default if you want it to be in the same channel as the ChannelId) setting");
			AdminRoleId = config.Bind<ulong>("Discord", "AdminRoleId", 0uL, "ID of an Administrative role in your discord server.");
			MessageTitle = config.Bind<string>("Discord", "Title", "", "Title for embedded message");
			MessageFooter = config.Bind<string>("Discord", "Footer", "", "Footer for embedded message");
			MessageFooterIcon = config.Bind<string>("Discord", "FooterIcon", "", "Footer icon for embedded message");
			LeaderboardAsList = config.Bind<bool>("Discord", "ShowLeaderboardAsList", false, "If true, the leaderboard will be shown as a table instead of a grid.");
			GlobalChatLabel = config.Bind<string>("Chat", "GlobalChatLabel", "GLOBAL", "Label for global chat messages that get sent to discord.");
			EnableWebServer = config.Bind<bool>("Web", "Enable", false, "Enable the webserver");
			WebPort = config.Bind<int>("Web", "Port", 8080, "Port the webserver will run on");
			EnableInteractiveMap = config.Bind<bool>("Web", "EnableInteractiveMap", false, "Enables the interactive map");
			TrackPlayersOnMap = config.Bind<bool>("Web", "TrackPlayersOnMap", false, "Enables tracking of players on the interactive map");
			InteractiveMapUpdateInterval = config.Bind<int>("Web", "InteractiveMapUpdateInterval", 10, "Interval in seconds for the interactive map to update. Don't set this too low or you might get rate limited.");
			ChatCommandPrefix = config.Bind<string>("Chat", "CommandPrefix", "!", "Prefix for all chat commands");
			EnableVIPFunctionality = config.Bind<bool>("VIP", "EnableVIP", false, "Enables the VIP functionality. the txt file will generate in the bepInEx config folder SkanksAIO/SkanksAIO.VIPlist.txt folder after restart. This txt file will be read at startup or when reloading. To add a user to VIP you need to add their steamid64 to the file. (1 per line)");
			if (EnableWebServer.Value)
			{
				WebServer webServer;
				if (WsInstance != null)
				{
					webServer = WsInstance;
					webServer.Stop();
				}
				else
				{
					webServer = new WebServer(WebPort.Value);
				}
				WsInstance = webServer;
				webServer.Start();
			}
			ShowUserConnectedInDc = config.Bind<bool>("Announcements", "ShowUserConnectedInDC", true, "Show in discord chat when users connect");
			ShowUserDisConnectedInDc = config.Bind<bool>("Announcements", "ShowUserDisConnectedInDC", true, "Show in discord chat when users disconnect");
			AnnounceTimer = config.Bind<float>("Announcements", "AnnounceTimer", 180f, "Time between messages in seconds");
			AnnounceEnabled = config.Bind<bool>("Announcements", "AnnounceEnabled", false, "Enable auto messages system");
			AnnounceRandomOrder = config.Bind<bool>("Announcements", "AnnounceRandomOrder", false, "Random order for announcement messages");
			JsonConfigHelper.SetAnnouncementInterval(AnnounceTimer.Value);
			LastEntry = 0;
			Random = new Random();
			if ((Object)(object)App.Instance != (Object)null)
			{
				App.Instance.Restart();
			}
			DisableOfflineRaiding = Config.Bind<bool>("Config", "DisableOfflineRaiding", false, "Enable/disable OfflineRaiding protection.");
			FactorAllies = Config.Bind<bool>("Config", "FactorAllies", true, "Include the besieged player allies online status before blocking siege.");
			MaxAllyCacheAge = Config.Bind<int>("Config", "MaxAllyCacheAge", 300, "Max age of the besieged player allies cache in seconds.\nIf the cache age is older than specified, the cache will be renewed.\nDon't set this too short as allies gathering process can slightly impact your server performance.\nThis cache is only for allies gathering, their online/offline status is updated instantly.");
		}

		internal static void Reload(ConfigFile config)
		{
			Plugin.Logger?.LogDebug("config reloaded");
			JsonConfigHelper.CreateJsonConfigs();
			JsonConfigHelper.LoadAllConfigs();
			Initialize(config);
		}
	}
}
namespace SkanksAIO.Patches
{
	public class AdminAuthPatch
	{
		[HarmonyPatch(typeof(AdminAuthSystem), "IsAdmin")]
		public static class IsAdmin_Patch
		{
			[HarmonyPostfix]
			private static void Postfix(ulong platformId, ref bool __result)
			{
				if (!Settings.EnableVIPFunctionality.Value)
				{
					return;
				}
				foreach (ulong vip in JsonConfigHelper.GetVips())
				{
					if (vip == platformId)
					{
						Plugin.Logger?.LogDebug("Giving admin to user from vip list " + platformId);
						__result = true;
					}
				}
			}
		}
	}
	[HarmonyPatch]
	public static class InitializePlayer_Patches
	{
		[HarmonyPatch(typeof(ServerBootstrapSystem), "OnUserConnected")]
		[HarmonyPostfix]
		public static void OnUserConnected_Patch(ServerBootstrapSystem __instance, NetConnectionId netConnectionId)
		{
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: 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)
			try
			{
				Plugin.Logger?.LogDebug(((Object)VWorld.Server.GetExistingSystemManaged<ServerBootstrapSystem>()).ToString());
				int num = VWorld.Server.GetExistingSystemManaged<ServerBootstrapSystem>()._NetEndPointToApprovedUserIndex[netConnectionId];
				ServerClient val = ((Il2CppArrayBase<ServerClient>)(object)VWorld.Server.GetExistingSystemManaged<ServerBootstrapSystem>()._ApprovedUsersLookup)[num];
				EntityManager entityManager;
				if (Settings.EnableVIPFunctionality.Value)
				{
					User val2 = default(User);
					foreach (ulong vip in JsonConfigHelper.GetVips())
					{
						if (val.PlatformId == vip)
						{
							entityManager = VWorld.Server.EntityManager;
							((EntityManager)(ref entityManager)).TryGetComponentData<User>(val.UserEntity, ref val2);
							val2.IsAdmin = false;
						}
					}
				}
				Entity userEntity = val.UserEntity;
				entityManager = VWorld.Server.EntityManager;
				User user = ((EntityManager)(ref entityManager)).GetComponentData<User>(userEntity);
				Player player = Player.GetPlayerRepository.FindOne((Expression<Func<Player, bool>>)((Player x) => x.PlatformId == user.PlatformId));
				if (player == null)
				{
					if (((FixedString64Bytes)(ref user.CharacterName)).IsEmpty)
					{
						Plugin.Logger?.LogDebug("A new player has connected, wait for them to finish character creation.");
						if (Settings.ShowUserConnectedInDc.Value)
						{
							string onlineMessage = JsonConfigHelper.GetOnlineMessage("");
							App.Instance.Discord.SendMessageAsync(onlineMessage, isTTS: false, null, null, null, null, null, null, null, (MessageFlags)0);
						}
						return;
					}
					player = new Player
					{
						PlatformId = user.PlatformId,
						CharacterName = ((object)(FixedString64Bytes)(ref user.CharacterName)).ToString(),
						UserEntity = userEntity,
						CharEntity = user.LocalCharacter._Entity,
						IsConnected = true
					};
					Player.GetPlayerRepository.Insert(player);
					Plugin.Logger?.LogDebug($"Creating new database entry for ({player.PlatformId}) {player.CharacterName}");
					if (Settings.ShowUserConnectedInDc.Value)
					{
						string onlineMessage2 = JsonConfigHelper.GetOnlineMessage(player.CharacterName);
						onlineMessage2 = onlineMessage2.Replace("%user%", player.CharacterName);
						App.Instance.Discord.SendMessageAsync(onlineMessage2, isTTS: false, null, null, null, null, null, null, null, (MessageFlags)0);
					}
					return;
				}
				player.UserEntity = userEntity;
				player.CharEntity = user.LocalCharacter._Entity;
				player.IsConnected = true;
				if (Player.GetPlayerRepository.Update(player))
				{
					Plugin.Logger?.LogDebug($"Updating database entry for ({player.PlatformId}) {player.CharacterName}");
				}
				else
				{
					Plugin.Logger?.LogError($"Failed to update database entry for ({player.PlatformId}) {player.CharacterName}");
				}
				Plugin.Logger?.LogDebug(player.CharacterName + " connected");
				if (Settings.ShowUserConnectedInDc.Value)
				{
					string onlineMessage3 = JsonConfigHelper.GetOnlineMessage(player.CharacterName);
					onlineMessage3 = onlineMessage3.Replace("%user%", player.CharacterName);
					App.Instance.Discord.SendMessageAsync(onlineMessage3, isTTS: false, null, null, null, null, null, null, null, (MessageFlags)0);
				}
				Plugin.Logger?.LogDebug("Name: " + player.CharacterName);
				Plugin.Logger?.LogDebug("PlatformId: " + player.PlatformId);
				Plugin.Logger?.LogDebug("Kills: " + player.Kills);
				Plugin.Logger?.LogDebug("Deaths: " + player.Deaths);
				Plugin.Logger?.LogDebug("KD: " + player.KD);
				Plugin.Logger?.LogDebug("ELO: " + player.ELO);
			}
			catch (NullReferenceException ex)
			{
				Plugin.Logger?.LogError("Couldn't patch OnUserConnected. Error: " + ex.Message);
			}
		}

		[HarmonyPatch(typeof(HandleCreateCharacterEventSystem), "GetIsNameValid")]
		[HarmonyPostfix]
		public static void TryIsNameValid_Patch(bool __result, HandleCreateCharacterEventSystem __instance, Entity userEntity, string characterNameString)
		{
			//IL_0035: 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_003e: 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)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			if (!__result)
			{
				return;
			}
			Plugin.Logger?.LogDebug("User (" + characterNameString + ") Picked a name successfully");
			EntityManager entityManager = ((ComponentSystemBase)VWorld.Server.GetExistingSystemManaged<ServerBootstrapSystem>()).EntityManager;
			User user = ((EntityManager)(ref entityManager)).GetComponentData<User>(userEntity);
			Player player = Player.GetPlayerRepository.FindOne((Expression<Func<Player, bool>>)((Player x) => x.PlatformId == user.PlatformId));
			if (player == null)
			{
				player = new Player
				{
					PlatformId = user.PlatformId,
					CharacterName = characterNameString,
					UserEntity = userEntity,
					CharEntity = user.LocalCharacter._Entity,
					IsConnected = true
				};
				Player.GetPlayerRepository.Insert(player);
				Plugin.Logger?.LogDebug($"Creating new database entry for ({player.PlatformId}) {player.CharacterName}");
				if (Settings.ShowUserConnectedInDc.Value)
				{
					string defaultMessage = JsonConfigHelper.GetDefaultMessage("newUserCreatedCharacter");
					defaultMessage = defaultMessage.Replace("%user%", player.CharacterName);
					App.Instance.Discord.SendMessageAsync(defaultMessage, isTTS: false, null, null, null, null, null, null, null, (MessageFlags)0);
				}
				return;
			}
			player.CharacterName = characterNameString;
			player.UserEntity = userEntity;
			player.CharEntity = user.LocalCharacter._Entity;
			player.IsConnected = true;
			player.Kills = 0;
			player.Deaths = 0;
			if (Player.GetPlayerRepository.Update(player))
			{
				Plugin.Logger?.LogDebug($"Updating database entry for ({player.PlatformId}) {player.CharacterName}");
			}
			else
			{
				Plugin.Logger?.LogError($"Failed to update database entry for ({player.PlatformId}) {player.CharacterName}");
			}
			if (Settings.ShowUserConnectedInDc.Value)
			{
				App.Instance?.Discord.SendMessageAsync(player.CharacterName + " has joined the fold.", isTTS: false, null, null, null, null, null, null, null, (MessageFlags)0);
			}
		}
	}
	[HarmonyPatch]
	public static class KillDeath_Patches
	{
		[HarmonyPatch(typeof(DeathEventListenerSystem), "OnUpdate")]
		[HarmonyPostfix]
		public static void OnUpdate(DeathEventListenerSystem __instance)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: 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_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: 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_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_0318: Unknown result type (might be due to invalid IL or missing references)
			//IL_031a: Unknown result type (might be due to invalid IL or missing references)
			if (!Settings.EnablePvPKillTracker.Value)
			{
				return;
			}
			EntityQuery deathEventQuery = __instance._DeathEventQuery;
			if (((EntityQuery)(ref deathEventQuery)).IsEmpty)
			{
				return;
			}
			EntityManager entityManager = ((ComponentSystemBase)__instance).EntityManager;
			deathEventQuery = __instance._DeathEventQuery;
			Enumerator<DeathEvent> enumerator = ((EntityQuery)(ref deathEventQuery)).ToComponentDataArray<DeathEvent>(AllocatorHandle.op_Implicit((Allocator)2)).GetEnumerator();
			PlayerCharacter val = default(PlayerCharacter);
			PlayerCharacter val2 = default(PlayerCharacter);
			User attackingUser = default(User);
			User targetUser = default(User);
			while (enumerator.MoveNext())
			{
				DeathEvent current = enumerator.Current;
				if (!((EntityManager)(ref entityManager)).TryGetComponentData<PlayerCharacter>(current.Died, ref val) || !((EntityManager)(ref entityManager)).TryGetComponentData<PlayerCharacter>(current.Killer, ref val2) || !((EntityManager)(ref entityManager)).HasComponent<Equipment>(current.Died) || !((EntityManager)(ref entityManager)).HasComponent<Equipment>(current.Killer) || !((EntityManager)(ref entityManager)).HasComponent<Blood>(current.Died) || !((EntityManager)(ref entityManager)).HasComponent<Blood>(current.Killer))
				{
					continue;
				}
				((EntityManager)(ref entityManager)).TryGetComponentData<User>(val2.UserEntity, ref attackingUser);
				((EntityManager)(ref entityManager)).TryGetComponentData<User>(val.UserEntity, ref targetUser);
				Entity died = current.Died;
				Entity killer = current.Killer;
				if (targetUser.IsConnected)
				{
					if (((object)(FixedString64Bytes)(ref attackingUser.CharacterName)).ToString() == ((object)(FixedString64Bytes)(ref targetUser.CharacterName)).ToString())
					{
						break;
					}
					Player player = Player.GetPlayerRepository.FindOne((Expression<Func<Player, bool>>)((Player x) => x.PlatformId == attackingUser.PlatformId));
					Player player2 = Player.GetPlayerRepository.FindOne((Expression<Func<Player, bool>>)((Player x) => x.PlatformId == targetUser.PlatformId));
					player.Kills++;
					player2.Deaths++;
					CalculateElo(player, player2, out var newAttackerElo, out var newTargetElo);
					player.ELO = newAttackerElo;
					player2.ELO = newTargetElo;
					Plugin.Logger?.LogInfo($"{player.CharacterName} ({player.ELO}) killed {player2.CharacterName} ({player2.ELO})");
					EmbedBuilder val3 = BuildEmbedMessage(killer, died);
					App.Instance.Discord.SendMessageAsync($"**{player.CharacterName}** killed **{player2.CharacterName}**", isTTS: false, null, null, null, null, null, null, null, (MessageFlags)0).GetAwaiter().GetResult();
					App.Instance.Discord.SendMessageAsync("", isTTS: false, val3.Build(), null, null, null, null, null, null, (MessageFlags)0).GetAwaiter().GetResult();
					if (!Player.GetPlayerRepository.Update(player))
					{
						Plugin.Logger?.LogError("Failed to update " + player.CharacterName);
					}
					if (!Player.GetPlayerRepository.Update(player2))
					{
						Plugin.Logger?.LogError("Failed to update " + player2.CharacterName);
					}
				}
			}
		}

		private static void CalculateElo(Player attacker, Player target, out int newAttackerElo, out int newTargetElo)
		{
			float num = 1f / (1f + (float)Math.Pow(10.0, (float)Math.Abs(target.ELO - attacker.ELO) / 400f));
			newAttackerElo = (int)Math.Round((float)attacker.ELO + 20f * (1f - num));
			newTargetElo = (int)Math.Round((float)target.ELO - 20f * (1f - num));
			if (target.ELO < attacker.ELO)
			{
				newAttackerElo = (int)Math.Round((float)attacker.ELO - 20f * (0f - num));
				newTargetElo = (int)Math.Round((float)target.ELO + 20f * (0f - num));
			}
		}

		private static EmbedBuilder BuildEmbedMessage(Entity Winner, Entity Loser)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown resul

AIO/Newtonsoft.Json.dll

Decompiled 6 months 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.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(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
[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 6.0")]
[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]
	[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 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)
		{
			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 (!message.EndsWith('.'))
				{
					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 : IAsyncDisposable, 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;
			}
		}

		ValueTask IAsyncDisposable.DisposeAsync()
		{
			try
			{
				Dispose(disposing: true);
				return default(ValueTask);
			}
			catch (Exception exception)
			{
				return ValueTask.FromException(exception);
			}
		}

		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<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(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.GetValueOrDefault();
			}
			set
			{
				_preserveReferencesHandling = value;
			}
		}

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

		public MetadataPropertyHandling MetadataPropertyHandling
		{
			get
			{
				return _metadataPropertyHandling.GetValueOrDefault();
			}
			set
			{
				_metadataPropertyHandling = value;
			}
		}

		[Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")]
		public FormatterAssemblyStyle TypeNameAssemblyFormat
		{
			get
			{
				return (FormatterAssemblyStyle)TypeNameAssemblyFormatHandling;
			}
			set
			{
				TypeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value;
			}
		}

		public TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling
		{
			get
			{
				return _typeNameAssemblyFormatHandling.GetValueOrDefault();
			}
			set
			{
				_typeNameAssemblyFormatHandling = value;
			}
		}

		public ConstructorHandling ConstructorHandling
		{
			get
			{
				return _constructorHandling.GetValueOrDefault();
			}
			set
			{
				_constructorHandling = value;
			}
		}

		public IContractResolver? ContractResolver { get; set; }

		public IEqualityComparer? EqualityComparer { get; set; }

		[Obsolete("Refer