Decompiled source of CinematicUnityExplorer v1.0.0

CinematicUnityExplorer.BIE.Unity.IL2CPP.CoreCLR.dll

Decompiled 17 hours ago
using System;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Diagnostics.SymbolStore;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Timers;
using System.Xml;
using System.Xml.Serialization;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using CinematicUnityExplorer.Cinematic;
using HarmonyLib;
using Il2CppInterop.Common;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.Attributes;
using Il2CppInterop.Runtime.Injection;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Collections;
using Il2CppSystem.Collections.Generic;
using Microsoft.CodeAnalysis;
using Mono.CSharp;
using Mono.CSharp.IL2CPP;
using Mono.CSharp.Linq;
using Mono.CSharp.Nullable;
using Mono.CSharp.yyParser;
using Mono.CSharp.yydebug;
using Mono.CompilerServices.SymbolWriter;
using MonoMod.RuntimeDetour;
using Tomlet;
using Tomlet.Attributes;
using Tomlet.Exceptions;
using Tomlet.Models;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityExplorer;
using UnityExplorer.CSConsole;
using UnityExplorer.CSConsole.Lexers;
using UnityExplorer.CacheObject;
using UnityExplorer.CacheObject.IValues;
using UnityExplorer.CacheObject.Views;
using UnityExplorer.CatmullRom;
using UnityExplorer.Config;
using UnityExplorer.Hooks;
using UnityExplorer.Inspectors;
using UnityExplorer.Inspectors.MouseInspectors;
using UnityExplorer.Loader.BIE;
using UnityExplorer.ObjectExplorer;
using UnityExplorer.Runtime;
using UnityExplorer.Serializers;
using UnityExplorer.UI;
using UnityExplorer.UI.Panels;
using UnityExplorer.UI.Widgets;
using UnityExplorer.UI.Widgets.AutoComplete;
using UniverseLib;
using UniverseLib.Config;
using UniverseLib.Input;
using UniverseLib.Runtime;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.ObjectPool;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using UniverseLib.UI.Widgets.ButtonList;
using UniverseLib.UI.Widgets.ScrollView;
using UniverseLib.Utility;

[assembly: AssemblyTitle("CinematicUnityExplorer")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyCompany("originalnicodr, Sinai, yukieiji")]
[assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")]
[assembly: AssemblyFileVersion("1.4.0")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: ComVisible(false)]
[assembly: AssemblyProduct("CinematicUnityExplorer")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[<300de733-bc39-4fd0-9379-95bf3e51a662>Embedded]
	internal sealed class <300de733-bc39-4fd0-9379-95bf3e51a662>EmbeddedAttribute : System.Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	[<300de733-bc39-4fd0-9379-95bf3e51a662>Embedded]
	[CompilerGenerated]
	internal sealed class <267d1362-9a20-4ec0-a85c-2e4ffe48c491>NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public <267d1362-9a20-4ec0-a85c-2e4ffe48c491>NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public <267d1362-9a20-4ec0-a85c-2e4ffe48c491>NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	[<300de733-bc39-4fd0-9379-95bf3e51a662>Embedded]
	internal sealed class <320efdd9-03d8-4ad3-a3ae-8138e3594e43>NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public <320efdd9-03d8-4ad3-a3ae-8138e3594e43>NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace CinematicUnityExplorer.Cinematic
{
	internal static class NativeMethods
	{
		[DllImport("kernel32.dll")]
		public static extern IntPtr LoadLibrary(string dll);

		[DllImport("kernel32.dll")]
		public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
	}
	public class UnityIGCSConnector
	{
		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
		private delegate void MoveCameraCallback(float step_left, float step_up, float fov, int from_start);

		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
		private delegate void SessionCallback();

		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
		private delegate IntPtr U_IGCS_Initialize(MoveCameraCallback callback, SessionCallback start_cb, SessionCallback end_cb);

		private Mono.CSharp.Tuple<Vector3, Quaternion> position = null;

		private Mono.CSharp.Tuple<Vector3, Quaternion> endSessionPosition = null;

		private readonly bool isValid = false;

		private bool _isActive = false;

		private readonly List<System.Delegate> delegates = new List<System.Delegate>();

		private readonly Queue<Mono.CSharp.Tuple<float, float>> commands = new Queue<Mono.CSharp.Tuple<float, float>>();

		private IntPtr CameraStatus = IntPtr.Zero;

		public bool IsActive => isValid && _isActive;

		public void UpdateFreecamStatus(bool enabled)
		{
			if (!(CameraStatus == IntPtr.Zero))
			{
				Marshal.WriteByte(CameraStatus, (byte)(enabled ? 1 : 0));
			}
		}

		public void ExecuteCameraCommand(Camera cam)
		{
			//IL_002b: 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_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = ((Component)cam).transform;
			ShouldMoveToOriginalPosition(transform);
			if (!_isActive || position == null)
			{
				position = new Mono.CSharp.Tuple<Vector3, Quaternion>(transform.position, transform.rotation);
			}
			if (!_isActive || position == null)
			{
				return;
			}
			Mono.CSharp.Tuple<float, float> tuple = null;
			lock (commands)
			{
				if (commands.Count <= 0)
				{
					return;
				}
				tuple = commands.Dequeue();
			}
			transform.position = position.Item1;
			transform.rotation = position.Item2;
			transform.Translate(tuple.Item1, tuple.Item2, 0f);
		}

		private void MoveCamera(float stepLeft, float stepUp, float fov, int fromStart)
		{
			lock (commands)
			{
				commands.Enqueue(new Mono.CSharp.Tuple<float, float>(stepLeft, stepUp));
			}
		}

		private void StartSession()
		{
			_isActive = true;
		}

		public void ShouldMoveToOriginalPosition(Transform transform)
		{
			//IL_0026: 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)
			if (isValid && endSessionPosition != null)
			{
				transform.position = endSessionPosition.Item1;
				transform.rotation = endSessionPosition.Item2;
				endSessionPosition = null;
			}
		}

		private void EndSession()
		{
			endSessionPosition = position;
			position = null;
			_isActive = false;
			lock (commands)
			{
				commands.Clear();
			}
		}

		public UnityIGCSConnector()
		{
			string text = ((IntPtr.Size == 8) ? "UnityIGCSConnector.dll" : "UnityIGCSConnector.32.dll");
			IntPtr intPtr = NativeMethods.LoadLibrary(text);
			if (intPtr == IntPtr.Zero)
			{
				ExplorerCore.LogWarning(text + " was not found so IGCSDof will not be available");
				return;
			}
			IntPtr procAddress = NativeMethods.GetProcAddress(intPtr, "U_IGCS_Initialize");
			if (procAddress == IntPtr.Zero)
			{
				throw new EntryPointNotFoundException("Failed to find 'U_IGCS_Initialize' which means you can have a corrupt UnityIGCSConnector.dll.");
			}
			U_IGCS_Initialize u_IGCS_Initialize = (U_IGCS_Initialize)Marshal.GetDelegateForFunctionPointer(procAddress, typeof(U_IGCS_Initialize));
			delegates.Add(new MoveCameraCallback(MoveCamera));
			delegates.Add(new SessionCallback(StartSession));
			delegates.Add(new SessionCallback(EndSession));
			CameraStatus = u_IGCS_Initialize((MoveCameraCallback)delegates[0], (SessionCallback)delegates[1], (SessionCallback)delegates[2]);
			if (CameraStatus == IntPtr.Zero)
			{
				throw new Exception("IGCSDof returned an invalid pointer which means something went wrong");
			}
			isValid = true;
		}
	}
}
namespace UniverseLib.Input
{
	public static class IGamepadInputInterceptor
	{
		private static bool _isEnabled = false;

		private static int _targetGamepadIndex = 0;

		private static Type _gamepadType;

		private static Type _buttonControlType;

		private static Type _axisControlType;

		private static Type _vector2ControlType;

		private static Type _inputControlType;

		private static PropertyInfo _basePathProp;

		private static PropertyInfo _buttonIsPressedProp;

		private static PropertyInfo _buttonWasPressedProp;

		private static PropertyInfo _buttonWasReleasedProp;

		private static MethodInfo _axisReadValueMethod;

		private static MethodInfo _vector2ReadValueMethod;

		private static PropertyInfo _deviceProp;

		private static PropertyInfo _vector2XProp;

		private static PropertyInfo _vector2YProp;

		private static PropertyInfo _gamepadAllProp;

		private static PropertyInfo _gamepadCurrentProp;

		private static PropertyInfo _gamepadLeftStickProp;

		private static PropertyInfo _gamepadRightStickProp;

		private static readonly Dictionary<string, string> _vendorPrefixMap = new Dictionary<string, string>
		{
			{ "/xinputcontrollerwindows", "/gamepad" },
			{ "/xinputcontroller", "/gamepad" },
			{ "/dualshockgamepad", "/gamepad" },
			{ "/dualsensegamepad", "/gamepad" },
			{ "/dualshock4gamepadhid", "/gamepad" },
			{ "/dualshock3gamepadhid", "/gamepad" },
			{ "/androidgamepad", "/gamepad" },
			{ "/switchprocontrollerhid", "/gamepad" }
		};

		private static readonly Dictionary<string, object> _axisControls = new Dictionary<string, object>();

		private static readonly Dictionary<string, object> _vector2Controls = new Dictionary<string, object>();

		private static readonly Dictionary<string, float> _axisValues = new Dictionary<string, float>();

		private static readonly Dictionary<string, Vector2> _vector2Values = new Dictionary<string, Vector2>();

		public static void Init()
		{
			try
			{
				LoadReflectedTypes();
				if (!(_gamepadType == null) && !(_axisControlType == null))
				{
					PatchAnalogControls();
					DiscoverGamepadControls();
					_isEnabled = true;
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Init failed: " + ex.Message + "\n" + ex.StackTrace);
			}
		}

		public static void Enable()
		{
			_isEnabled = true;
		}

		public static void Disable()
		{
			_isEnabled = false;
		}

		public static void SetTargetGamepad(int index)
		{
			_targetGamepadIndex = index;
			ClearControlCaches();
			DiscoverGamepadControls();
		}

		private static void LoadReflectedTypes()
		{
			_gamepadType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Gamepad, Unity.InputSystem");
			_buttonControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl, Unity.InputSystem");
			_axisControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.AxisControl, Unity.InputSystem");
			_vector2ControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.Vector2Control, Unity.InputSystem");
			_inputControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.InputControl, Unity.InputSystem");
			_basePathProp = _inputControlType?.GetProperty("path", BindingFlags.Instance | BindingFlags.Public);
			_buttonIsPressedProp = _buttonControlType?.GetProperty("isPressed", BindingFlags.Instance | BindingFlags.Public);
			_buttonWasPressedProp = _buttonControlType?.GetProperty("wasPressedThisFrame", BindingFlags.Instance | BindingFlags.Public);
			_buttonWasReleasedProp = _buttonControlType?.GetProperty("wasReleasedThisFrame", BindingFlags.Instance | BindingFlags.Public);
			_axisReadValueMethod = _axisControlType?.GetMethod("ReadValue", Type.EmptyTypes);
			_vector2ReadValueMethod = _vector2ControlType?.GetMethod("ReadValue", Type.EmptyTypes);
			_deviceProp = _inputControlType?.GetProperty("device", BindingFlags.Instance | BindingFlags.Public);
			_vector2XProp = _vector2ControlType?.GetProperty("x", BindingFlags.Instance | BindingFlags.Public);
			_vector2YProp = _vector2ControlType?.GetProperty("y", BindingFlags.Instance | BindingFlags.Public);
			_gamepadAllProp = _gamepadType?.GetProperty("all", BindingFlags.Static | BindingFlags.Public);
			_gamepadCurrentProp = _gamepadType?.GetProperty("current", BindingFlags.Static | BindingFlags.Public);
			_gamepadLeftStickProp = _gamepadType?.GetProperty("leftStick", BindingFlags.Instance | BindingFlags.Public);
			_gamepadRightStickProp = _gamepadType?.GetProperty("rightStick", BindingFlags.Instance | BindingFlags.Public);
		}

		private static void LogLoadedType(string name, Type type)
		{
			if (type != null)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Loaded type: " + name);
			}
			else
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to load type: " + name);
			}
		}

		private static void PatchAnalogControls()
		{
			try
			{
				if (_vector2ControlType != null)
				{
					MethodInfo method = _vector2ControlType.GetMethod("ReadValue", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
					if (method == null)
					{
						Type baseType = _vector2ControlType.BaseType;
						if (baseType != null && baseType.IsGenericType)
						{
							method = baseType.GetMethod("ReadValue", BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
						}
					}
					if (method != null)
					{
						PatchMethod(method, null, "Postfix_Vector2ReadValue");
					}
				}
				if (!(_axisControlType != null))
				{
					return;
				}
				MethodInfo method2 = _axisControlType.GetMethod("ReadValue", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
				if (method2 == null)
				{
					Type baseType2 = _axisControlType.BaseType;
					if (baseType2 != null && baseType2.IsGenericType)
					{
						method2 = baseType2.GetMethod("ReadValue", BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
					}
				}
				if (method2 != null)
				{
					PatchMethod(method2, null, "Postfix_AxisReadValue");
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error during patching: " + ex.Message);
			}
		}

		private static void PatchMethod(MethodInfo method, string prefixName, string postfixName)
		{
			//IL_006c: 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)
			try
			{
				if (!(method == null) && !(Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method) == null))
				{
					MethodInfo methodInfo = ((prefixName != null) ? AccessTools.Method(typeof(IGamepadInputInterceptor), prefixName, (Type[])null, (Type[])null) : null);
					MethodInfo methodInfo2 = ((postfixName != null) ? AccessTools.Method(typeof(IGamepadInputInterceptor), postfixName, (Type[])null, (Type[])null) : null);
					ExplorerCore.Harmony.Patch((MethodBase)method, (!(methodInfo != null)) ? ((HarmonyMethod)null) : new HarmonyMethod(methodInfo), (!(methodInfo2 != null)) ? ((HarmonyMethod)null) : new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to patch method: " + ex.Message);
			}
		}

		private static void DiscoverGamepadControls()
		{
			try
			{
				object gamepadInstance = GetGamepadInstance(_targetGamepadIndex);
				if (gamepadInstance == null)
				{
					return;
				}
				string[] array = new string[12]
				{
					"buttonSouth", "buttonNorth", "buttonWest", "buttonEast", "leftStickButton", "rightStickButton", "leftShoulder", "rightShoulder", "startButton", "selectButton",
					"leftTrigger", "rightTrigger"
				};
				string[] array2 = new string[2] { "leftStick", "rightStick" };
				string[] array3 = array;
				foreach (string text in array3)
				{
					try
					{
						PropertyInfo property = _gamepadType.GetProperty(text, BindingFlags.Instance | BindingFlags.Public);
						if (!(property != null))
						{
							continue;
						}
						object value = property.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value != null)
						{
							string text2 = ExtractAndNormalizePath(value);
							if (!string.IsNullOrEmpty(text2))
							{
								INewInputSystem.gamepadButtonControls[text2] = value;
							}
						}
					}
					catch (Exception ex)
					{
						ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access button " + text + ": " + ex.Message);
					}
				}
				try
				{
					PropertyInfo property2 = _gamepadType.GetProperty("dpad", BindingFlags.Instance | BindingFlags.Public);
					if (property2 != null)
					{
						object value2 = property2.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value2 != null)
						{
							string[] array4 = new string[4] { "up", "down", "left", "right" };
							string[] array5 = array4;
							foreach (string text3 in array5)
							{
								try
								{
									PropertyInfo property3 = value2.GetType().GetProperty(text3, BindingFlags.Instance | BindingFlags.Public);
									if (!(property3 != null))
									{
										continue;
									}
									object value3 = property3.GetValue(value2, BindingFlags.Default, null, null, null);
									if (value3 != null)
									{
										string text4 = ExtractAndNormalizePath(value3);
										if (!string.IsNullOrEmpty(text4))
										{
											INewInputSystem.gamepadButtonControls[text4] = value3;
										}
									}
								}
								catch (Exception ex2)
								{
									ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access dpad." + text3 + ": " + ex2.Message);
								}
							}
						}
					}
				}
				catch (Exception ex3)
				{
					ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access dpad: " + ex3.Message);
				}
				string[] array6 = array2;
				foreach (string text5 in array6)
				{
					try
					{
						PropertyInfo property4 = _gamepadType.GetProperty(text5, BindingFlags.Instance | BindingFlags.Public);
						if (!(property4 != null))
						{
							continue;
						}
						object value4 = property4.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value4 == null)
						{
							continue;
						}
						string text6 = ExtractAndNormalizePath(value4);
						if (!string.IsNullOrEmpty(text6))
						{
							_vector2Controls[text6] = value4;
						}
						string[] array7 = new string[2] { "x", "y" };
						string[] array8 = array7;
						foreach (string text7 in array8)
						{
							try
							{
								PropertyInfo property5 = value4.GetType().GetProperty(text7, BindingFlags.Instance | BindingFlags.Public);
								if (!(property5 != null))
								{
									continue;
								}
								object value5 = property5.GetValue(value4, BindingFlags.Default, null, null, null);
								if (value5 != null)
								{
									string value6 = ExtractAndNormalizePath(value5);
									if (!string.IsNullOrEmpty(value6))
									{
										string text8 = text5.ToLowerInvariant();
										string key = "/gamepad/" + text8 + "/" + text7;
										_axisControls[key] = value5;
									}
								}
							}
							catch (Exception ex4)
							{
								ExplorerCore.LogWarning($"[IGamepadInputInterceptor] Failed to access {text5}.{text7}: {ex4.Message}");
							}
						}
					}
					catch (Exception ex5)
					{
						ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access vector2 " + text5 + ": " + ex5.Message);
					}
				}
				string[] array9 = new string[2] { "leftTrigger", "rightTrigger" };
				string[] array10 = array9;
				foreach (string text9 in array10)
				{
					try
					{
						PropertyInfo property6 = _gamepadType.GetProperty(text9, BindingFlags.Instance | BindingFlags.Public);
						if (!(property6 != null))
						{
							continue;
						}
						object value7 = property6.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value7 != null)
						{
							string text10 = ExtractAndNormalizePath(value7);
							if (!string.IsNullOrEmpty(text10))
							{
								_axisControls[text10] = value7;
							}
						}
					}
					catch (Exception ex6)
					{
						ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access " + text9 + ": " + ex6.Message);
					}
				}
				int num = INewInputSystem.gamepadButtonControls.Count + _axisControls.Count + _vector2Controls.Count;
			}
			catch (Exception ex7)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error discovering controls: " + ex7.Message + "\n" + ex7.StackTrace);
			}
		}

		private static object GetGamepadInstance(int index)
		{
			try
			{
				if (_gamepadAllProp != null)
				{
					object value = _gamepadAllProp.GetValue(null, BindingFlags.Default, null, null, null);
					if (value != null)
					{
						Type type = value.GetType();
						PropertyInfo property = type.GetProperty("Count", BindingFlags.Instance | BindingFlags.Public);
						PropertyInfo property2 = type.GetProperty("Item", BindingFlags.Instance | BindingFlags.Public);
						if (property != null && property2 != null)
						{
							int num = (int)property.GetValue(value, BindingFlags.Default, null, null, null);
							if (index >= 0 && index < num)
							{
								return property2.GetValue(value, new object[1] { index });
							}
						}
					}
				}
				if (_gamepadCurrentProp != null)
				{
					return _gamepadCurrentProp.GetValue(null, BindingFlags.Default, null, null, null);
				}
				return null;
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error getting gamepad instance: " + ex.Message);
				return null;
			}
		}

		private static string ExtractAndNormalizePath(object control)
		{
			if (control == null)
			{
				return null;
			}
			string text = null;
			try
			{
				string text2 = control.ToString();
				if (!string.IsNullOrEmpty(text2))
				{
					int num = text2.IndexOf('/');
					if (num >= 0)
					{
						int num2 = text2.IndexOf('}', num);
						if (num2 >= 0)
						{
							text = text2.Substring(num, num2 - num);
						}
					}
				}
			}
			catch
			{
			}
			if (string.IsNullOrEmpty(text))
			{
				try
				{
					if (_basePathProp != null)
					{
						object value = _basePathProp.GetValue(control, BindingFlags.Default, null, null, null);
						text = value as string;
					}
				}
				catch
				{
				}
			}
			if (string.IsNullOrEmpty(text))
			{
				try
				{
					PropertyInfo property = control.GetType().GetProperty("name", BindingFlags.Instance | BindingFlags.Public);
					if (property != null)
					{
						string text3 = property.GetValue(control, BindingFlags.Default, null, null, null) as string;
						if (!string.IsNullOrEmpty(text3))
						{
							text = "/gamepad/" + text3;
						}
					}
				}
				catch
				{
				}
			}
			if (string.IsNullOrEmpty(text))
			{
				return null;
			}
			return NormalizeControlPath(text);
		}

		public static string NormalizeControlPath(string rawPath)
		{
			if (string.IsNullOrEmpty(rawPath))
			{
				return rawPath;
			}
			string text = rawPath.ToLowerInvariant().Trim();
			foreach (KeyValuePair<string, string> item in _vendorPrefixMap)
			{
				if (text.StartsWith(item.Key))
				{
					text = item.Value + text.Substring(item.Key.Length);
					break;
				}
			}
			int length = "/gamepad".Length;
			if (text.StartsWith("/gamepad") && text.Length > length && char.IsDigit(text[length]))
			{
				text = "/gamepad" + text.Substring(length + 1);
			}
			switch (text)
			{
			default:
				if (!(text == "/gamepad/right"))
				{
					break;
				}
				goto case "/gamepad/up";
			case "/gamepad/up":
			case "/gamepad/down":
			case "/gamepad/left":
			{
				string text2 = text.Substring("/gamepad/".Length);
				text = "/gamepad/dpad/" + text2;
				break;
			}
			}
			return text;
		}

		private static void ClearControlCaches()
		{
			INewInputSystem.gamepadButtonControls.Clear();
			_axisControls.Clear();
			_vector2Controls.Clear();
			_axisValues.Clear();
			_vector2Values.Clear();
		}

		public static bool IsButtonPressed(string buttonPath)
		{
			if (!_isEnabled)
			{
				return false;
			}
			string key = buttonPath.ToLower();
			if (INewInputSystem.gamepadButtonControls.TryGetValue(key, out var value) && _buttonIsPressedProp != null)
			{
				_buttonIsPressedProp.GetValue(value, BindingFlags.Default, null, null, null);
			}
			bool value2;
			return INewInputSystem.buttonPressedStates.TryGetValue(key, out value2) && value2;
		}

		public static bool WasButtonPressedThisFrame(string buttonPath)
		{
			if (!_isEnabled)
			{
				return false;
			}
			string key = buttonPath.ToLower();
			if (INewInputSystem.gamepadButtonControls.TryGetValue(key, out var value) && _buttonWasPressedProp != null)
			{
				_buttonWasPressedProp.GetValue(value, BindingFlags.Default, null, null, null);
			}
			bool value2;
			return INewInputSystem.buttonWasPressedStates.TryGetValue(key, out value2) && value2;
		}

		public static bool WasButtonReleasedThisFrame(string buttonPath)
		{
			if (!_isEnabled)
			{
				return false;
			}
			string key = buttonPath.ToLower();
			if (INewInputSystem.gamepadButtonControls.TryGetValue(key, out var value) && _buttonWasReleasedProp != null)
			{
				_buttonWasReleasedProp.GetValue(value, BindingFlags.Default, null, null, null);
			}
			bool value2;
			return INewInputSystem.buttonWasReleasedStates.TryGetValue(key, out value2) && value2;
		}

		public static float GetAxisValue(string axisPath)
		{
			if (!_isEnabled)
			{
				return 0f;
			}
			string key = NormalizeControlPath(axisPath ?? "");
			if (_axisControls.TryGetValue(key, out var value) && _axisReadValueMethod != null)
			{
				_axisReadValueMethod.Invoke(value, null);
			}
			float value2;
			return _axisValues.TryGetValue(key, out value2) ? value2 : 0f;
		}

		public static Vector2 GetVector2Value(string vectorPath)
		{
			//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_0087: 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_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			if (!_isEnabled)
			{
				return new Vector2(0f, 0f);
			}
			string key = NormalizeControlPath(vectorPath ?? "");
			if (_vector2Controls.TryGetValue(key, out var value) && _vector2ReadValueMethod != null)
			{
				_vector2ReadValueMethod.Invoke(value, null);
			}
			Vector2 value2;
			return (Vector2)(_vector2Values.TryGetValue(key, out value2) ? value2 : new Vector2(0f, 0f));
		}

		public static IEnumerable<string> GetRegisteredButtonPaths()
		{
			return INewInputSystem.gamepadButtonControls.Keys;
		}

		public static IEnumerable<string> GetRegisteredAxisPaths()
		{
			return _axisControls.Keys;
		}

		public static IEnumerable<string> GetRegisteredVector2Paths()
		{
			return _vector2Controls.Keys;
		}

		private static void Postfix_Vector2ReadValue(object __instance, ref object __result)
		{
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			if (__instance == null || __result == null)
			{
				return;
			}
			try
			{
				if (_deviceProp != null)
				{
					object value = _deviceProp.GetValue(__instance, BindingFlags.Default, null, null, null);
					if (value == null)
					{
						return;
					}
				}
			}
			catch
			{
				return;
			}
			string text = ExtractAndNormalizePath(__instance);
			if (string.IsNullOrEmpty(text))
			{
				return;
			}
			try
			{
				if (_vector2XProp != null && _vector2YProp != null)
				{
					float num = (float)_vector2XProp.GetValue(__result, BindingFlags.Default, null, null, null);
					float num2 = (float)_vector2YProp.GetValue(__result, BindingFlags.Default, null, null, null);
					_vector2Values[text] = new Vector2(num, num2);
					if (_isEnabled && FreeCamPanel.ShouldOverrideInput() && _vector2XProp.CanWrite && _vector2YProp.CanWrite)
					{
						_vector2XProp.SetValue(__result, 0f, BindingFlags.Default, null, null, null);
						_vector2YProp.SetValue(__result, 0f, BindingFlags.Default, null, null, null);
					}
				}
			}
			catch
			{
			}
		}

		private static void Postfix_AxisReadValue(object __instance, ref float __result)
		{
			if (__instance == null)
			{
				return;
			}
			try
			{
				if (_deviceProp != null)
				{
					object value = _deviceProp.GetValue(__instance, BindingFlags.Default, null, null, null);
					if (value == null)
					{
						return;
					}
				}
			}
			catch
			{
				return;
			}
			string text = ExtractAndNormalizePath(__instance);
			if (string.IsNullOrEmpty(text))
			{
				return;
			}
			string text2 = text;
			try
			{
				object gamepadInstance = GetGamepadInstance(_targetGamepadIndex);
				if (gamepadInstance != null)
				{
					if (_gamepadLeftStickProp != null)
					{
						object value2 = _gamepadLeftStickProp.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value2 != null)
						{
							PropertyInfo property = value2.GetType().GetProperty("x", BindingFlags.Instance | BindingFlags.Public);
							PropertyInfo property2 = value2.GetType().GetProperty("y", BindingFlags.Instance | BindingFlags.Public);
							object obj2 = property?.GetValue(value2, BindingFlags.Default, null, null, null);
							object obj3 = property2?.GetValue(value2, BindingFlags.Default, null, null, null);
							if (__instance == obj2 || __instance == obj3)
							{
								text2 = text.Replace("/gamepad/x", "/gamepad/leftstick/x").Replace("/gamepad/y", "/gamepad/leftstick/y");
							}
						}
					}
					if (text2 == text && _gamepadRightStickProp != null)
					{
						object value3 = _gamepadRightStickProp.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value3 != null)
						{
							PropertyInfo property3 = value3.GetType().GetProperty("x", BindingFlags.Instance | BindingFlags.Public);
							PropertyInfo property4 = value3.GetType().GetProperty("y", BindingFlags.Instance | BindingFlags.Public);
							object obj4 = property3?.GetValue(value3, BindingFlags.Default, null, null, null);
							object obj5 = property4?.GetValue(value3, BindingFlags.Default, null, null, null);
							if (__instance == obj4 || __instance == obj5)
							{
								text2 = text.Replace("/gamepad/x", "/gamepad/rightstick/x").Replace("/gamepad/y", "/gamepad/rightstick/y");
							}
						}
					}
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error identifying stick axis: " + ex.Message);
			}
			_axisValues[text2] = __result;
			if (_isEnabled && FreeCamPanel.ShouldOverrideInput())
			{
				__result = 0f;
			}
		}
	}
	public static class IInputManager
	{
		private static InputType currentInputType;

		public static Vector3 MousePosition => InputManager.MousePosition;

		public static void Setup()
		{
			//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_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_0011: 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_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected I4, but got Unknown
			currentInputType = InputManager.CurrentType;
			InputType val = currentInputType;
			InputType val2 = val;
			switch ((int)val2)
			{
			case 1:
				ILegacyInput.Init();
				break;
			case 0:
				INewInputSystem.Init();
				break;
			case 2:
				break;
			}
		}

		public static bool GetKey(KeyCode key)
		{
			//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_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_001b: Expected I4, but got Unknown
			//IL_0026: 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_002f: Unknown result type (might be due to invalid IL or missing references)
			InputType val = currentInputType;
			InputType val2 = val;
			return (int)val2 switch
			{
				1 => ILegacyInput.GetKey(key), 
				0 => INewInputSystem.GetKey(key), 
				_ => InputManager.GetKey(key), 
			};
		}

		public unsafe static bool GetKeyDown(KeyCode key)
		{
			//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_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_001b: Expected I4, but got Unknown
			//IL_001d: 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)
			InputType val = currentInputType;
			InputType val2 = val;
			switch ((int)val2)
			{
			case 1:
				return ILegacyInput.GetKeyDown(key);
			case 0:
			{
				string buttonName = ("/keyboard/" + ((object)(*(KeyCode*)(&key))/*cast due to .constrained prefix*/).ToString()).ToLower();
				return INewInputSystem.GetButtonWasPressed(buttonName);
			}
			default:
				return InputManager.GetKeyDown(key);
			}
		}

		public unsafe static bool GetKeyUp(KeyCode key)
		{
			//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_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_001b: Expected I4, but got Unknown
			//IL_001d: 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)
			InputType val = currentInputType;
			InputType val2 = val;
			switch ((int)val2)
			{
			case 1:
				return ILegacyInput.GetKeyUp(key);
			case 0:
			{
				string buttonName = ("/keyboard/" + ((object)(*(KeyCode*)(&key))/*cast due to .constrained prefix*/).ToString()).ToLower();
				return INewInputSystem.GetButtonWasReleased(buttonName);
			}
			default:
				return InputManager.GetKeyUp(key);
			}
		}

		public static bool GetMouseButton(int button)
		{
			//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_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_001b: Expected I4, but got Unknown
			InputType val = currentInputType;
			InputType val2 = val;
			return (int)val2 switch
			{
				1 => ILegacyInput.GetMouseButton(button), 
				0 => INewInputSystem.GetMouseButton(button), 
				_ => InputManager.GetMouseButton(button), 
			};
		}

		public static bool GetMouseButtonDown(int button)
		{
			//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_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_001b: Expected I4, but got Unknown
			InputType val = currentInputType;
			InputType val2 = val;
			return (int)val2 switch
			{
				1 => ILegacyInput.GetMouseButtonDown(button), 
				0 => INewInputSystem.GetMouseButtonDown(button), 
				_ => InputManager.GetMouseButtonDown(button), 
			};
		}
	}
	public static class ILegacyInput
	{
		public static Dictionary<KeyCode, bool> getKeyDict = new Dictionary<KeyCode, bool>();

		public static Dictionary<KeyCode, bool> getKeyDownDict = new Dictionary<KeyCode, bool>();

		public static Dictionary<KeyCode, bool> getKeyUpDict = new Dictionary<KeyCode, bool>();

		public static Dictionary<int, bool> getMouseButton = new Dictionary<int, bool>();

		public static Dictionary<int, bool> getMouseButtonDown = new Dictionary<int, bool>();

		public static bool GetKey(KeyCode key)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			//IL_000d: 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)key == 0)
			{
				return false;
			}
			InputManager.GetKey(key);
			return getKeyDict[key];
		}

		public static bool GetKeyDown(KeyCode key)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			//IL_000d: 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)key == 0)
			{
				return false;
			}
			InputManager.GetKeyDown(key);
			return getKeyDownDict[key];
		}

		public static bool GetKeyUp(KeyCode key)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			//IL_000d: 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)key == 0)
			{
				return false;
			}
			InputManager.GetKeyUp(key);
			return getKeyUpDict[key];
		}

		public static bool GetMouseButton(int button)
		{
			InputManager.GetMouseButton(button);
			return getMouseButton[button];
		}

		public static bool GetMouseButtonDown(int button)
		{
			InputManager.GetMouseButtonDown(button);
			return getMouseButtonDown[button];
		}

		public static void Init()
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Expected O, but got Unknown
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Expected O, but got Unknown
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			//IL_0225: Expected O, but got Unknown
			//IL_0287: Unknown result type (might be due to invalid IL or missing references)
			//IL_0294: Expected O, but got Unknown
			//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0303: Expected O, but got Unknown
			//IL_0365: Unknown result type (might be due to invalid IL or missing references)
			//IL_0372: Expected O, but got Unknown
			Type typeByName = ReflectionUtility.GetTypeByName("UnityEngine.Input");
			try
			{
				MethodInfo method = typeByName.GetMethod("GetKey", new Type[1] { typeof(string) });
				if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method) == null)
				{
					throw new Exception();
				}
				ExplorerCore.Harmony.Patch((MethodBase)method, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyString", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method2 = typeByName.GetMethod("GetKey", new Type[1] { typeof(KeyCode) });
				if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method2) == null)
				{
					throw new Exception();
				}
				ExplorerCore.Harmony.Patch((MethodBase)method2, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyKeyCode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method3 = typeByName.GetMethod("GetKeyDown", new Type[1] { typeof(string) });
				if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method3) == null)
				{
					throw new Exception();
				}
				ExplorerCore.Harmony.Patch((MethodBase)method3, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyDownString", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method4 = typeByName.GetMethod("GetKeyDown", new Type[1] { typeof(KeyCode) });
				if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method4) == null)
				{
					throw new Exception();
				}
				ExplorerCore.Harmony.Patch((MethodBase)method4, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyDownKeyCode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method5 = typeByName.GetMethod("GetKeyUp", new Type[1] { typeof(string) });
				if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method5) == null)
				{
					throw new Exception();
				}
				ExplorerCore.Harmony.Patch((MethodBase)method5, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyUpString", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method6 = typeByName.GetMethod("GetKeyUp", new Type[1] { typeof(KeyCode) });
				if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method6) == null)
				{
					throw new Exception();
				}
				ExplorerCore.Harmony.Patch((MethodBase)method6, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyUpKeyCode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method7 = typeByName.GetMethod("GetMouseButton", new Type[1] { typeof(int) });
				if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method7) == null)
				{
					throw new Exception();
				}
				ExplorerCore.Harmony.Patch((MethodBase)method7, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideMouseButton", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method8 = typeByName.GetMethod("GetMouseButtonDown", new Type[1] { typeof(int) });
				if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method8) == null)
				{
					throw new Exception();
				}
				ExplorerCore.Harmony.Patch((MethodBase)method8, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideMouseButtonDown", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
		}

		public static void OverrideKeyString(ref bool __result, ref string name)
		{
			//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_001d: Unknown result type (might be due to invalid IL or missing references)
			KeyCode key = (KeyCode)System.Enum.Parse(typeof(KeyCode), name);
			getKeyDict[key] = __result;
			if (FreeCamPanel.ShouldOverrideInput())
			{
				__result = false;
			}
		}

		public static void OverrideKeyKeyCode(ref bool __result, ref KeyCode key)
		{
			if (key)
			{
				getKeyDict[key] = __result;
				if (FreeCamPanel.ShouldOverrideInput())
				{
					__result = false;
				}
			}
		}

		public static void OverrideKeyDownString(ref bool __result, ref string name)
		{
			//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_001d: Unknown result type (might be due to invalid IL or missing references)
			KeyCode key = (KeyCode)System.Enum.Parse(typeof(KeyCode), name);
			getKeyDownDict[key] = __result;
			if (FreeCamPanel.ShouldOverrideInput())
			{
				__result = false;
			}
		}

		public static void OverrideKeyDownKeyCode(ref bool __result, ref KeyCode key)
		{
			if (key)
			{
				getKeyDownDict[key] = __result;
				if (FreeCamPanel.ShouldOverrideInput())
				{
					__result = false;
				}
			}
		}

		public static void OverrideKeyUpString(ref bool __result, ref string name)
		{
			//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_001d: Unknown result type (might be due to invalid IL or missing references)
			KeyCode key = (KeyCode)System.Enum.Parse(typeof(KeyCode), name);
			getKeyUpDict[key] = __result;
			if (FreeCamPanel.ShouldOverrideInput())
			{
				__result = false;
			}
		}

		public static void OverrideKeyUpKeyCode(ref bool __result, ref KeyCode key)
		{
			if (key)
			{
				getKeyUpDict[key] = __result;
				if (FreeCamPanel.ShouldOverrideInput())
				{
					__result = false;
				}
			}
		}

		public static void OverrideMouseButton(ref bool __result, ref int button)
		{
			getMouseButton[button] = __result;
			if (FreeCamPanel.ShouldOverrideInput() && (button != 0 || !UIManager.ShowMenu))
			{
				__result = false;
			}
		}

		public static void OverrideMouseButtonDown(ref bool __result, ref int button)
		{
			getMouseButtonDown[button] = __result;
			if (FreeCamPanel.ShouldOverrideInput() && (button != 0 || !UIManager.ShowMenu))
			{
				__result = false;
			}
		}
	}
	public static class INewInputSystem
	{
		private static PropertyInfo isPressedProp;

		private static PropertyInfo wasPressedProp;

		private static PropertyInfo wasReleasedProp;

		private static MethodInfo isValueConsideredPressed;

		private static MethodInfo isPressedMethod;

		private static MethodInfo isInProgressMethod;

		private static MethodInfo wasPressedMethod;

		private static MethodInfo wasPerformedMethod;

		internal static readonly Dictionary<string, object> buttonControls = new Dictionary<string, object>();

		internal static readonly Dictionary<string, object> gamepadButtonControls = new Dictionary<string, object>();

		internal static readonly Dictionary<string, bool> buttonPressedStates = new Dictionary<string, bool>();

		internal static readonly Dictionary<string, bool> buttonWasPressedStates = new Dictionary<string, bool>();

		internal static readonly Dictionary<string, bool> buttonWasReleasedStates = new Dictionary<string, bool>();

		private static readonly Dictionary<string, bool> buttonIsValueConsideredPressedStates = new Dictionary<string, bool>();

		private static readonly Dictionary<string, bool> actionInProgressStates = new Dictionary<string, bool>();

		private static readonly Dictionary<string, bool> actionWasPerformedStates = new Dictionary<string, bool>();

		public static void Init()
		{
			Type typeByName = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl, Unity.InputSystem");
			Type typeByName2 = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.InputAction, Unity.InputSystem");
			if (typeByName == null || typeByName2 == null)
			{
				ExplorerCore.LogWarning("Unity.InputSystem types not found; InputSystem integration disabled.");
				return;
			}
			PatchButtonControl(typeByName);
			PatchInputAction(typeByName2);
			GetButtonControls();
			IGamepadInputInterceptor.Init();
		}

		private static void PatchButtonControl(Type buttonControlType)
		{
			isPressedProp = buttonControlType.GetProperty("isPressed");
			wasPressedProp = buttonControlType.GetProperty("wasPressedThisFrame");
			wasReleasedProp = buttonControlType.GetProperty("wasReleasedThisFrame");
			isValueConsideredPressed = buttonControlType.GetMethod("IsValueConsideredPressed");
			PatchPropertyGetter(isPressedProp, "Postfix_IsPressed");
			PatchPropertyGetter(wasPressedProp, "Postfix_WasPressedThisFrame");
			PatchPropertyGetter(wasReleasedProp, "Postfix_WasReleasedThisFrame");
			PatchPropertyGetter(wasReleasedProp, "Postfix_IsValueConsideredPressed");
		}

		private static void PatchInputAction(Type inputActionType)
		{
			isPressedMethod = inputActionType.GetMethod("IsPressed");
			isInProgressMethod = inputActionType.GetMethod("IsInProgress");
			wasPressedMethod = inputActionType.GetMethod("WasPressedThisFrame");
			wasPerformedMethod = inputActionType.GetMethod("WasPerformedThisFrame");
			PatchMethod(isPressedMethod, "Postfix_IsPressed");
			PatchMethod(isInProgressMethod, "Postfix_IsInProgress");
			PatchMethod(wasPressedMethod, "Postfix_WasPressedThisFrame");
			PatchMethod(wasPerformedMethod, "Postfix_WasPerformedThisFrame");
		}

		private static void PatchPropertyGetter(PropertyInfo prop, string postfixName)
		{
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			if (!(prop?.GetGetMethod() == null))
			{
				if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)prop.GetGetMethod()) == null)
				{
					throw new Exception();
				}
				ExplorerCore.Harmony.Patch((MethodBase)prop.GetGetMethod(), (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(INewInputSystem), postfixName, (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
		}

		private static void PatchMethod(MethodInfo method, string postfixName)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Expected O, but got Unknown
			if (!(method == null))
			{
				if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method) == null)
				{
					throw new Exception();
				}
				ExplorerCore.Harmony.Patch((MethodBase)method, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(INewInputSystem), postfixName, (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
		}

		public static void GetButtonControls()
		{
			PropertyInfo pathProp = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl, Unity.InputSystem")?.GetProperty("path", BindingFlags.Instance | BindingFlags.Public);
			RegisterDeviceControls("UnityEngine.InputSystem.Keyboard", "UnityEngine.InputSystem.Controls.KeyControl", pathProp);
			RegisterDeviceControls("UnityEngine.InputSystem.Mouse", "UnityEngine.InputSystem.Controls.ButtonControl", pathProp);
		}

		internal static void RegisterDeviceControls(string deviceTypeName, string controlTypeName, PropertyInfo pathProp)
		{
			Type typeByName = ReflectionUtility.GetTypeByName(deviceTypeName + ", Unity.InputSystem");
			if (typeByName == null)
			{
				return;
			}
			object obj = typeByName.GetProperty("current", BindingFlags.Static | BindingFlags.Public)?.GetValue(null, null);
			if (obj == null)
			{
				return;
			}
			PropertyInfo[] properties = typeByName.GetProperties(BindingFlags.Instance | BindingFlags.Public);
			foreach (PropertyInfo propertyInfo in properties)
			{
				if (propertyInfo.GetIndexParameters().Length != 0 || !(propertyInfo.PropertyType.FullName == controlTypeName))
				{
					continue;
				}
				object value = propertyInfo.GetValue(obj, null);
				if (value != null)
				{
					string text = pathProp?.GetValue(value, null) as string;
					if (!string.IsNullOrEmpty(text))
					{
						buttonControls[text.ToLower()] = value;
					}
				}
			}
		}

		public unsafe static bool GetKey(KeyCode key)
		{
			string buttonName = PropToKeycode(("/keyboard/" + ((object)(*(KeyCode*)(&key))/*cast due to .constrained prefix*/).ToString()).ToLower());
			return GetButtonPressed(buttonName);
		}

		public static bool GetButtonPressed(string buttonName)
		{
			string key = buttonName.ToLower();
			if (buttonControls.TryGetValue(key, out var value))
			{
				isPressedProp?.GetValue(value, null);
				bool value2;
				return buttonPressedStates.TryGetValue(key, out value2) && value2;
			}
			return false;
		}

		public static bool GetButtonWasPressed(string buttonName)
		{
			string key = buttonName.ToLower();
			if (buttonControls.TryGetValue(key, out var value))
			{
				wasPressedProp?.GetValue(value, null);
				bool value2;
				return buttonWasPressedStates.TryGetValue(key, out value2) && value2;
			}
			return false;
		}

		public static bool GetButtonWasReleased(string buttonName)
		{
			string key = buttonName.ToLower();
			if (buttonControls.TryGetValue(key, out var value))
			{
				wasReleasedProp?.GetValue(value, null);
				bool value2;
				return buttonWasReleasedStates.TryGetValue(key, out value2) && value2;
			}
			return false;
		}

		public static bool GetMouseButton(int button)
		{
			return GetButtonPressed(button switch
			{
				0 => "/mouse/leftbutton", 
				1 => "/mouse/rightbutton", 
				2 => "/mouse/middlebutton", 
				3 => "/mouse/forwardbutton", 
				4 => "/mouse/backbutton", 
				_ => $"/mouse/button{button}", 
			});
		}

		public static bool GetMouseButtonDown(int button)
		{
			return GetButtonWasPressed(button switch
			{
				0 => "/mouse/leftbutton", 
				1 => "/mouse/rightbutton", 
				2 => "/mouse/middlebutton", 
				3 => "/mouse/forwardbutton", 
				4 => "/mouse/backbutton", 
				_ => $"/mouse/button{button}", 
			});
		}

		private static void Postfix_IsPressed(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, buttonPressedStates);
		}

		private static void Postfix_WasPressedThisFrame(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, buttonWasPressedStates);
		}

		private static void Postfix_WasReleasedThisFrame(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, buttonWasReleasedStates);
		}

		private static void Postfix_IsValueConsideredPressed(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, buttonIsValueConsideredPressedStates);
		}

		private static void Postfix_IsInProgress(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, actionInProgressStates);
		}

		private static void Postfix_WasPerformedThisFrame(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, actionWasPerformedStates);
		}

		private static void StoreState(object __instance, ref bool __result, Dictionary<string, bool> dict)
		{
			try
			{
				Type type = __instance.GetType();
				string rawPath = ((type.GetProperty("path") ?? type.GetProperty("name"))?.GetValue(__instance, null)?.ToString() ?? string.Empty).ToLower();
				rawPath = IGamepadInputInterceptor.NormalizeControlPath(rawPath);
				dict[rawPath] = __result;
				if (FreeCamPanel.ShouldOverrideInput())
				{
					__result = false;
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("Failed to store state: " + ex.Message);
			}
		}

		public static string PropToKeycode(string propName)
		{
			return propName switch
			{
				"/keyboard/leftcontrol" => "/keyboard/leftctrl", 
				"/keyboard/rightcontrol" => "/keyboard/rightctrl", 
				"/keyboard/keypad0" => "/keyboard/numpad0", 
				"/keyboard/keypad1" => "/keyboard/numpad1", 
				"/keyboard/keypad2" => "/keyboard/numpad2", 
				"/keyboard/keypad3" => "/keyboard/numpad3", 
				"/keyboard/keypad4" => "/keyboard/numpad4", 
				"/keyboard/keypad5" => "/keyboard/numpad5", 
				"/keyboard/keypad6" => "/keyboard/numpad6", 
				"/keyboard/keypad7" => "/keyboard/numpad7", 
				"/keyboard/keypad8" => "/keyboard/numpad8", 
				"/keyboard/keypad9" => "/keyboard/numpad9", 
				"/keyboard/keypaddivide" => "/keyboard/numpaddivide", 
				"/keyboard/keypadmultiply" => "/keyboard/numpadmultiply", 
				"/keyboard/keypadminus" => "/keyboard/numpadminus", 
				"/keyboard/keypadplus" => "/keyboard/numpadplus", 
				"/keyboard/keypadperiod" => "/keyboard/numpadperiod", 
				"/keyboard/keypadequals" => "/keyboard/numpadequals", 
				"/keyboard/keypadenter" => "/keyboard/numpadenter", 
				"/keyboard/alpha0" => "/keyboard/0", 
				"/keyboard/alpha1" => "/keyboard/1", 
				"/keyboard/alpha2" => "/keyboard/2", 
				"/keyboard/alpha3" => "/keyboard/3", 
				"/keyboard/alpha4" => "/keyboard/4", 
				"/keyboard/alpha5" => "/keyboard/5", 
				"/keyboard/alpha6" => "/keyboard/6", 
				"/keyboard/alpha7" => "/keyboard/7", 
				"/keyboard/alpha8" => "/keyboard/8", 
				"/keyboard/alpha9" => "/keyboard/9", 
				"/keyboard/print" => "/keyboard/printscreen", 
				_ => propName, 
			};
		}
	}
}
namespace UnityExplorer
{
	public class ArrowGenerator
	{
		public static GameObject CreateArrow(Vector3 arrowPosition, Quaternion arrowRotation, Color color)
		{
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: 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_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_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Expected O, but got Unknown
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Expected O, but got Unknown
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Expected O, but got Unknown
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				float value = ConfigManager.Arrow_Size.Value;
				Vector3 localScale = default(Vector3);
				((Vector3)(ref localScale))..ctor(Math.Max(value, 0.1f), Math.Max(value, 0.1f), Math.Max(value, 0.1f));
				GameObject val = GameObject.CreatePrimitive((PrimitiveType)2);
				val.GetComponent<Collider>().enabled = false;
				val.GetComponent<MeshFilter>().mesh = CreateCylinderMesh(0.01f, 20, 2);
				val.transform.rotation = Quaternion.LookRotation(Vector3.down, Vector3.up);
				Renderer component = val.GetComponent<Renderer>();
				component.material = new Material(Shader.Find("Sprites/Default"));
				component.material.color = color;
				GameObject val2 = GameObject.CreatePrimitive((PrimitiveType)0);
				val2.GetComponent<Collider>().enabled = false;
				val2.GetComponent<MeshFilter>().mesh = CreateConeMesh(10, 0.05f, 0.1f);
				val2.transform.SetParent(val.transform, true);
				Renderer component2 = val2.GetComponent<Renderer>();
				component2.material = new Material(Shader.Find("Sprites/Default"));
				component2.material.color = color;
				val.transform.rotation = Quaternion.LookRotation(Vector3.back, Vector3.up);
				GameObject val3 = new GameObject("CUE-Arrow");
				val.transform.SetParent(val3.transform, true);
				val3.transform.localScale = localScale;
				val3.transform.position = arrowPosition;
				val3.transform.rotation = arrowRotation;
				Transform transform = val3.transform;
				transform.position += 0.5f * val3.transform.forward;
				return val3;
			}
			catch
			{
				return FallbackArrow(arrowPosition, arrowRotation, color);
			}
		}

		private static GameObject FallbackArrow(Vector3 arrowPosition, Quaternion arrowRotation, Color color)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: 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_00a8: 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_00e2: Expected O, but got Unknown
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Expected O, but got Unknown
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: 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_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = GameObject.CreatePrimitive((PrimitiveType)2);
			val.GetComponent<Collider>().enabled = false;
			Renderer component = val.GetComponent<Renderer>();
			component.material = new Material(Shader.Find("Sprites/Default"));
			component.material.color = color;
			val.transform.localScale = new Vector3(0.025f, 0.15f, 0.025f);
			GameObject val2 = GameObject.CreatePrimitive((PrimitiveType)0);
			val2.GetComponent<Collider>().enabled = false;
			val2.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f);
			val2.transform.position = new Vector3(0f, 0.15f, 0f);
			val2.transform.SetParent(val.transform, true);
			Renderer component2 = val2.GetComponent<Renderer>();
			component2.material = new Material(Shader.Find("Sprites/Default"));
			component2.material.color = color;
			GameObject val3 = new GameObject("CUE-Arrow");
			val.transform.SetParent(val3.transform, true);
			val3.transform.position = arrowPosition;
			Vector3 eulerAngles = ((Quaternion)(ref arrowRotation)).eulerAngles;
			eulerAngles.x += 90f;
			val3.transform.rotation = Quaternion.Euler(eulerAngles);
			Transform transform = val3.transform;
			transform.position += 0.15f * val3.transform.up;
			return val3;
		}

		public static void PatchLights()
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			try
			{
				PropertyInfo property = typeof(Light).GetProperty("color");
				MethodInfo setMethod = property.GetSetMethod();
				if (!(Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)setMethod) == null))
				{
					ExplorerCore.Harmony.Patch((MethodBase)setMethod, new HarmonyMethod(AccessTools.Method(typeof(ArrowGenerator), "ChangeArrowColor", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				}
			}
			catch
			{
			}
		}

		private static void ChangeArrowColor(Light __instance, Color __0)
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			if (((Object)__instance).name.Contains("CUE - Light"))
			{
				Renderer[] array = Il2CppArrayBase<Renderer>.op_Implicit(((Component)__instance).GetComponentsInChildren<Renderer>());
				Renderer[] array2 = array;
				foreach (Renderer val in array2)
				{
					val.material.color = __0;
				}
			}
		}

		private static Mesh CreateConeMesh(int subdivisions, float radius, float height)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0026: 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_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_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_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00e1: 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)
			Mesh val = new Mesh();
			Vector3[] array = (Vector3[])(object)new Vector3[subdivisions + 2];
			Vector2[] array2 = (Vector2[])(object)new Vector2[array.Length];
			int[] array3 = new int[subdivisions * 2 * 3];
			array[0] = Vector3.zero;
			array2[0] = new Vector2(0.5f, 0f);
			int i = 0;
			int num = subdivisions - 1;
			for (; i < subdivisions; i++)
			{
				float num2 = (float)i / (float)num;
				float num3 = num2 * (MathF.PI * 2f);
				float num4 = Mathf.Cos(num3) * radius;
				float num5 = Mathf.Sin(num3) * radius;
				array[i + 1] = new Vector3(num4, 0f, num5);
				array2[i + 1] = new Vector2(num2, 0f);
			}
			array[subdivisions + 1] = new Vector3(0f, height, 0f);
			array2[subdivisions + 1] = new Vector2(0.5f, 1f);
			int j = 0;
			for (int num6 = subdivisions - 1; j < num6; j++)
			{
				int num7 = j * 3;
				array3[num7] = 0;
				array3[num7 + 1] = j + 1;
				array3[num7 + 2] = j + 2;
			}
			int num8 = subdivisions * 3;
			int k = 0;
			for (int num9 = subdivisions - 1; k < num9; k++)
			{
				int num10 = k * 3 + num8;
				array3[num10] = k + 1;
				array3[num10 + 1] = subdivisions + 1;
				array3[num10 + 2] = k + 2;
			}
			val.vertices = Il2CppStructArray<Vector3>.op_Implicit(array);
			val.uv = Il2CppStructArray<Vector2>.op_Implicit(array2);
			val.triangles = Il2CppStructArray<int>.op_Implicit(array3);
			val.RecalculateBounds();
			val.RecalculateNormals();
			return val;
		}

		private static Mesh CreateCylinderMesh(float radius = 1f, int iterations = 50, int lenggth = 10, float gap = 0.5f)
		{
			//IL_0021: 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)
			//IL_00cb: 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_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Expected O, but got Unknown
			//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_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			float num2 = 0f;
			int i = 0;
			Vector3[] array = (Vector3[])(object)new Vector3[iterations * lenggth + 2];
			int num3 = 0;
			array[^2] = Vector3.zero;
			for (; i < lenggth; i++)
			{
				int num4 = 0;
				while (num4 < iterations)
				{
					float num5 = (float)num4 * 1f / (float)iterations * MathF.PI * 2f;
					float num6 = Mathf.Sin(num5) * radius;
					float num7 = Mathf.Cos(num5) * radius;
					array[num3] = new Vector3(num6, num7, num2);
					num4++;
					num++;
					num3++;
				}
				num2 += gap;
			}
			array[^1] = new Vector3(0f, 0f, array[^3].z);
			Mesh val = new Mesh();
			val.vertices = Il2CppStructArray<Vector3>.op_Implicit(array);
			int j = 0;
			Vector3[] array2 = (Vector3[])(object)new Vector3[num + 2];
			for (; j < num; j++)
			{
				array2[j] = Vector3.forward;
			}
			val.normals = Il2CppStructArray<Vector3>.op_Implicit(array2);
			j = 0;
			int[] array3 = new int[3 * (lenggth - 1) * iterations * 2 + 3];
			for (; j < (lenggth - 1) * iterations; j++)
			{
				array3[j * 3] = j;
				if ((j + 1) % iterations == 0)
				{
					array3[j * 3 + 1] = 1 + j - iterations;
				}
				else
				{
					array3[j * 3 + 1] = 1 + j;
				}
				array3[j * 3 + 2] = iterations + j;
			}
			int num8 = -1;
			for (int k = (array3.Length - 3) / 2; k < array3.Length - 6; k += 3)
			{
				if ((num8 + 2) % iterations == 0)
				{
					array3[k] = num8 + iterations * 2 + 1;
				}
				else
				{
					array3[k] = num8 + iterations + 1;
				}
				array3[k + 1] = num8 + 2;
				array3[k + 2] = num8 + iterations + 2;
				num8++;
			}
			array3[^3] = 0;
			array3[^2] = iterations * 2 - 1;
			array3[^1] = iterations;
			int[] array4 = new int[iterations * 3 * 2];
			int num9 = 0;
			for (int l = 0; l < array4.Length / 2; l += 3)
			{
				array4[l] = num9;
				if (num9 + 1 != iterations)
				{
					array4[l + 1] = num9 + 1;
				}
				else
				{
					array4[l + 1] = 0;
				}
				array4[l + 2] = array.Length - 2;
				num9++;
			}
			num9 = iterations * (lenggth - 1);
			for (int m = array4.Length / 2; m < array4.Length; m += 3)
			{
				array4[m] = num9;
				if (num9 + 1 != iterations * (lenggth - 1))
				{
					array4[m + 1] = num9 + 1;
				}
				else
				{
					array4[m + 1] = iterations * (lenggth - 1);
				}
				array4[m + 2] = array.Length - 1;
				num9++;
			}
			array4[^3] = iterations * (lenggth - 1);
			array4[^2] = array.Length - 3;
			array4[^1] = array.Length - 1;
			int[] array5 = new int[array3.Length + array4.Length];
			int num10 = 0;
			int num11 = 0;
			num10 = 0;
			num11 = 0;
			for (; num10 < array3.Length; num10++)
			{
				array5[num11++] = array3[num10];
			}
			for (num10 = 0; num10 < array4.Length; num10++)
			{
				array5[num11++] = array4[num10];
			}
			val.triangles = Il2CppStructArray<int>.op_Implicit(array5);
			val.Optimize();
			val.RecalculateNormals();
			return val;
		}
	}
	public class ExplorerBehaviour : MonoBehaviour
	{
		internal bool quitting;

		internal static ExplorerBehaviour Instance { get; private set; }

		public ExplorerBehaviour(IntPtr ptr)
			: base(ptr)
		{
		}

		internal static void Setup()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			ClassInjector.RegisterTypeInIl2Cpp<ExplorerBehaviour>();
			GameObject val = new GameObject("ExplorerBehaviour");
			Object.DontDestroyOnLoad((Object)(object)val);
			((Object)val).hideFlags = (HideFlags)61;
			Instance = val.AddComponent<ExplorerBehaviour>();
		}

		internal void Update()
		{
			ExplorerCore.Update();
		}

		internal void OnDestroy()
		{
			OnApplicationQuit();
		}

		internal void OnApplicationQuit()
		{
			if (!quitting)
			{
				quitting = true;
				if (Object.op_Implicit((Object)(object)UIManager.UIRoot))
				{
					TryDestroy(((Component)UIManager.UIRoot.transform.root).gameObject);
				}
				object? value = typeof(Universe).Assembly.GetType("UniverseLib.UniversalBehaviour").GetProperty("Instance", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null);
				TryDestroy(((Component)((value is Component) ? value : null)).gameObject);
				TryDestroy(((Component)this).gameObject);
			}
		}

		internal void TryDestroy(GameObject obj)
		{
			try
			{
				if (Object.op_Implicit((Object)(object)obj))
				{
					Object.Destroy((Object)(object)obj);
				}
			}
			catch
			{
			}
		}
	}
	public class KeypressListener : MonoBehaviour
	{
		private bool frameSkip;

		internal static KeypressListener Instance { get; private set; }

		public KeypressListener(IntPtr ptr)
			: base(ptr)
		{
		}

		internal static void Setup()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			ClassInjector.RegisterTypeInIl2Cpp<KeypressListener>();
			GameObject val = new GameObject("KeypressListener");
			Object.DontDestroyOnLoad((Object)(object)val);
			((Object)val).hideFlags = (HideFlags)61;
			Instance = val.AddComponent<KeypressListener>();
		}

		public void Update()
		{
			//IL_001b: 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_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: 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_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			stopFrameSkip();
			maybeForcePause();
			maybeTakeScreenshot();
			if (IInputManager.GetKeyDown(ConfigManager.Pause.Value))
			{
				UIManager.GetTimeScaleWidget().PauseToggle();
			}
			if (IInputManager.GetKeyDown(ConfigManager.Frameskip.Value) && UIManager.GetTimeScaleWidget().IsPaused())
			{
				UIManager.GetTimeScaleWidget().PauseToggle();
				frameSkip = true;
			}
			if (IInputManager.GetKeyDown(ConfigManager.Screenshot.Value))
			{
				UIManager.GetPanel<Misc>(UIManager.Panels.Misc).screenshotStatus = Misc.ScreenshotState.TurnOffUI;
			}
			if (IInputManager.GetKeyDown(ConfigManager.HUD_Toggle.Value))
			{
				UIManager.GetPanel<Misc>(UIManager.Panels.Misc).ToggleHUDElements();
			}
			if (IInputManager.GetKeyDown(ConfigManager.Freecam_Toggle.Value))
			{
				FreeCamPanel.ToggleFreecam();
			}
			if (IInputManager.GetKeyDown(ConfigManager.Block_Freecam_Movement.Value))
			{
				FreeCamPanel.blockFreecamMovementToggle.isOn = !FreeCamPanel.blockFreecamMovementToggle.isOn;
			}
			if (IInputManager.GetKeyDown(ConfigManager.Toggle_Animations.Value))
			{
				UIManager.GetPanel<AnimatorPanel>(UIManager.Panels.AnimatorPanel).HotkeyToggleAnimators();
			}
			if (FreeCamPanel.supportedInput && IInputManager.GetKeyDown(ConfigManager.Toggle_Block_Games_Input.Value))
			{
				FreeCamPanel.blockGamesInputOnFreecamToggle.isOn = !FreeCamPanel.blockGamesInputOnFreecamToggle.isOn;
			}
			bool flag = IGamepadInputInterceptor.IsButtonPressed("/gamepad/buttonwest");
			bool flag2 = IGamepadInputInterceptor.IsButtonPressed("/gamepad/leftstickpress");
			bool flag3 = IGamepadInputInterceptor.IsButtonPressed("/gamepad/rightstickpress");
			if (flag && flag2)
			{
				if (IGamepadInputInterceptor.WasButtonPressedThisFrame("/gamepad/buttonwest") || IGamepadInputInterceptor.WasButtonPressedThisFrame("/gamepad/leftstickpress"))
				{
					UIManager.GetTimeScaleWidget().ToggleOverride();
				}
			}
			else if (flag && flag3 && (IGamepadInputInterceptor.WasButtonPressedThisFrame("/gamepad/buttonwest") || IGamepadInputInterceptor.WasButtonPressedThisFrame("/gamepad/rightstickpress")))
			{
				FreeCamPanel.ToggleFreecam();
			}
		}

		private void stopFrameSkip()
		{
			if (frameSkip && !UIManager.GetTimeScaleWidget().IsPaused())
			{
				frameSkip = false;
				UIManager.GetTimeScaleWidget().PauseToggle();
			}
		}

		private void maybeForcePause()
		{
			TimeScaleWidget timeScaleWidget = UIManager.GetTimeScaleWidget();
			if (timeScaleWidget != null && timeScaleWidget.IsPaused() && Time.timeScale != 0f)
			{
				timeScaleWidget.SetTimeScale(0f);
			}
		}

		private void maybeTakeScreenshot()
		{
			UIManager.GetPanel<Misc>(UIManager.Panels.Misc)?.MaybeTakeScreenshot();
		}
	}
	public static class ExplorerCore
	{
		public const string NAME = "CinematicUnityExplorer";

		public const string VERSION = "1.4.0";

		public const string AUTHOR = "originalnicodr, Sinai, yukieiji";

		public const string GUID = "com.originalnicodr.cinematicunityexplorer";

		public const string DEFAULT_EXPLORER_FOLDER_NAME = "CinematicUnityExplorer";

		public static IExplorerLoader Loader { get; private set; }

		public static string ExplorerFolder => Path.Combine(Loader.ExplorerFolderDestination, Loader.ExplorerFolderName);

		public static Harmony Harmony { get; } = new Harmony("com.originalnicodr.cinematicunityexplorer");

		public static void Init(IExplorerLoader loader)
		{
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			if (Loader != null)
			{
				throw new Exception("CinematicUnityExplorer is already loaded.");
			}
			Loader = loader;
			Log("CinematicUnityExplorer 1.4.0 initializing...");
			CheckLegacyExplorerFolder();
			Directory.CreateDirectory(ExplorerFolder);
			ConfigManager.Init(Loader.ConfigHandler);
			Universe.Init(ConfigManager.Startup_Delay_Time.Value, (Action)LateInit, (Action<string, LogType>)Log, new UniverseLibConfig
			{
				Disable_EventSystem_Override = ConfigManager.Disable_EventSystem_Override.Value,
				Force_Unlock_Mouse = ConfigManager.Force_Unlock_Mouse.Value,
				Unhollowed_Modules_Folder = loader.UnhollowedModulesFolder
			});
			UERuntimeHelper.Init();
			ExplorerBehaviour.Setup();
			UnityCrashPrevention.Init();
			ArrowGenerator.PatchLights();
		}

		private static void LateInit()
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			SceneHandler.Init();
			Log("Creating UI...");
			UIManager.InitUI();
			Log($"{"CinematicUnityExplorer"} {"1.4.0"} ({Universe.Context}) initialized.");
			IInputManager.Setup();
			KeypressListener.Setup();
			if (ConfigManager.Auto_Scale_UI.Value)
			{
				MakeUEUIScale();
			}
		}

		internal static void Update()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			if (IInputManager.GetKeyDown(ConfigManager.Master_Toggle.Value))
			{
				UIManager.ShowMenu = !UIManager.ShowMenu;
			}
		}

		public static void Log(object message)
		{
			Log(message, (LogType)3);
		}

		public static void LogWarning(object message)
		{
			Log(message, (LogType)2);
		}

		public static void LogError(object message)
		{
			Log(message, (LogType)0);
		}

		public static void LogUnity(object message, LogType logType)
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			if (ConfigManager.Log_Unity_Debug.Value)
			{
				Log($"[Unity] {message}", logType);
			}
		}

		private static void Log(object message, LogType logType)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: 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_0021: 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_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected I4, but got Unknown
			string text = message?.ToString() ?? "";
			LogPanel.Log(text, logType);
			switch ((int)logType)
			{
			case 1:
			case 3:
				Loader.OnLogMessage(text);
				break;
			case 2:
				Loader.OnLogWarning(text);
				break;
			case 0:
			case 4:
				Loader.OnLogError(text);
				break;
			}
		}

		private static void CheckLegacyExplorerFolder()
		{
			string text = Path.Combine(Loader.ExplorerFolderDestination, "UnityExplorer");
			if (!Directory.Exists(text))
			{
				return;
			}
			LogWarning("Attempting to migrate old 'UnityExplorer/' folder to 'CinematicUnityExplorer/'...");
			if (!Directory.Exists(ExplorerFolder))
			{
				try
				{
					Directory.Move(text, ExplorerFolder);
					Log("Migrated successfully.");
					return;
				}
				catch (Exception value)
				{
					LogWarning($"Exception migrating folder: {value}");
					return;
				}
			}
			try
			{
				CopyAll(new DirectoryInfo(text), new DirectoryInfo(ExplorerFolder));
				Directory.Delete(text, recursive: true);
				Log("Migrated successfully.");
			}
			catch (Exception value2)
			{
				LogWarning($"Exception migrating folder: {value2}");
			}
		}

		public static void CopyAll(DirectoryInfo source, DirectoryInfo target)
		{
			Directory.CreateDirectory(target.FullName);
			FileInfo[] files = source.GetFiles();
			foreach (FileInfo fileInfo in files)
			{
				fileInfo.MoveTo(Path.Combine(target.ToString(), fileInfo.Name));
			}
			DirectoryInfo[] directories = source.GetDirectories();
			foreach (DirectoryInfo directoryInfo in directories)
			{
				DirectoryInfo target2 = target.CreateSubdirectory(directoryInfo.Name);
				CopyAll(directoryInfo, target2);
			}
		}

		private static void MakeUEUIScale()
		{
			List<CanvasScaler> list = (from obj in RuntimeHelper.FindObjectsOfTypeAll(typeof(CanvasScaler))
				select ((Il2CppObjectBase)obj).TryCast<CanvasScaler>() into c
				where ((Object)c).name.Contains("unityexplorer")
				select c).ToList();
			foreach (CanvasScaler item in list)
			{
				item.uiScaleMode = (ScaleMode)1;
				item.screenMatchMode = (ScreenMatchMode)0;
				item.matchWidthOrHeight = 0f;
			}
		}
	}
	public static class InspectorManager
	{
		public static readonly List<InspectorBase> Inspectors = new List<InspectorBase>();

		private static InspectorBase lastActiveInspector;

		public static float PanelWidth;

		public static InspectorBase ActiveInspector { get; private set; }

		public static event Action OnInspectedTabsChanged;

		public static void Inspect(object obj, CacheObjectBase parent = null)
		{
			if (UnityHelpers.IsNullOrDestroyed(obj, true))
			{
				return;
			}
			obj = ReflectionExtensions.TryCast(obj);
			if (!TryFocusActiveInspector(obj))
			{
				if ((Object)(object)ReflectionExtensions.TryCast<GameObject>(obj) != (Object)null)
				{
					CreateInspector<GameObjectInspector>(obj);
				}
				else
				{
					CreateInspector<ReflectionInspector>(obj, staticReflection: false, parent);
				}
			}
		}

		public static void Inspect(Type type)
		{
			if (!TryFocusActiveInspector(type))
			{
				CreateInspector<ReflectionInspector>(type, staticReflection: true);
			}
		}

		private static bool TryFocusActiveInspector(object target)
		{
			foreach (InspectorBase inspector in Inspectors)
			{
				bool flag = false;
				if (target is Type type)
				{
					if (inspector.TargetType.FullName == type.FullName)
					{
						flag = true;
					}
				}
				else if (ReflectionExtensions.ReferenceEqual(inspector.Target, target))
				{
					flag = true;
				}
				if (flag)
				{
					UIManager.SetPanelActive(UIManager.Panels.Inspector, active: true);
					SetInspectorActive(inspector);
					return true;
				}
			}
			return false;
		}

		public static void SetInspectorActive(InspectorBase inspector)
		{
			UnsetActiveInspector();
			ActiveInspector = inspector;
			inspector.OnSetActive();
		}

		public static void UnsetActiveInspector()
		{
			if (ActiveInspector != null)
			{
				lastActiveInspector = ActiveInspector;
				ActiveInspector.OnSetInactive();
				ActiveInspector = null;
			}
		}

		public static void CloseAllTabs()
		{
			if (Inspectors.Any())
			{
				for (int num = Inspectors.Count - 1; num >= 0; num--)
				{
					Inspectors[num].CloseInspector();
				}
				Inspectors.Clear();
			}
			UIManager.SetPanelActive(UIManager.Panels.Inspector, active: false);
		}

		public static void InspectWithFilters(object target, string filterInputField, UnityExplorer.Inspectors.MemberFilter memberFilterFlags = UnityExplorer.Inspectors.MemberFilter.All, bool staticReflection = false, CacheObjectBase parent = null)
		{
			if (!TryFocusActiveInspector(target))
			{
				ReflectionInspector reflectionInspector = CreateInspector<ReflectionInspector>(target, staticReflection, parent);
				reflectionInspector.filterInputField.Text = filterInputField;
				reflectionInspector.memberFilter = memberFilterFlags;
				reflectionInspector.Update();
			}
		}

		private static T CreateInspector<T>(object target, bool staticReflection = false, CacheObjectBase parent = null) where T : InspectorBase
		{
			T val = Pool<T>.Borrow();
			Inspectors.Add(val);
			val.Target = target;
			if (parent != null && parent.CanWrite && target.GetType().IsValueType && val is ReflectionInspector reflectionInspector)
			{
				reflectionInspector.ParentCacheObject = parent;
			}
			UIManager.SetPanelActive(UIManager.Panels.Inspector, active: true);
			val.UIRoot.transform.SetParent(InspectorPanel.Instance.ContentHolder.transform, false);
			if (val is ReflectionInspector reflectionInspector2)
			{
				reflectionInspector2.StaticOnly = staticReflection;
			}
			val.OnBorrowedFromPool(target);
			SetInspectorActive(val);
			InspectorManager.OnInspectedTabsChanged?.Invoke();
			return val;
		}

		public static void ReleaseInspector<T>(T inspector) where T : InspectorBase
		{
			if (lastActiveInspector == inspector)
			{
				lastActiveInspector = null;
			}
			bool flag = ActiveInspector == inspector;
			int num = Inspectors.IndexOf(inspector);
			Inspectors.Remove(inspector);
			inspector.OnReturnToPool();
			Pool<T>.Return(inspector);
			if (flag)
			{
				ActiveInspector = null;
				if (lastActiveInspector != null)
				{
					SetInspectorActive(lastActiveInspector);
					lastActiveInspector = null;
				}
				else if (Inspectors.Any())
				{
					int index = Math.Min(Inspectors.Count - 1, Math.Max(0, num - 1));
					SetInspectorActive(Inspectors[index]);
				}
				else
				{
					UIManager.SetPanelActive(UIManager.Panels.Inspector, active: false);
				}
			}
			InspectorManager.OnInspectedTabsChanged?.Invoke();
		}

		internal static void Update()
		{
			for (int num = Inspectors.Count - 1; num >= 0; num--)
			{
				Inspectors[num].Update();
			}
		}

		internal static void OnPanelResized(float width)
		{
			PanelWidth = width;
			foreach (InspectorBase inspector in Inspectors)
			{
				if (inspector is ReflectionInspector reflectionInspector)
				{
					reflectionInspector.SetLayouts();
				}
			}
		}
	}
	[BepInPlugin("com.originalnicodr.cinematicunityexplorer", "UnityExplorer", "1.4.0")]
	public class ExplorerBepInPlugin : BasePlugin, IExplorerLoader
	{
		public static ExplorerBepInPlugin Instance;

		private const string IL2CPP_LIBS_FOLDER = "interop";

		private BepInExConfigHandler _configHandler;

		private static readonly Harmony s_harmony = new Harmony("com.originalnicodr.cinematicunityexplorer");

		public ManualLogSource LogSource => ((BasePlugin)this).Log;

		public string UnhollowedModulesFolder => Path.Combine(Paths.BepInExRootPath, "interop");

		public ConfigHandler ConfigHandler => _configHandler;

		public Harmony HarmonyInstance => s_harmony;

		public string ExplorerFolderName => "CinematicUnityExplorer";

		public string ExplorerFolderDestination => Paths.PluginPath;

		public Action<object> OnLogMessage => LogSource.LogMessage;

		public Action<object> OnLogWarning => LogSource.LogWarning;

		public Action<object> OnLogError => LogSource.LogError;

		private void Init()
		{
			Instance = this;
			_configHandler = new BepInExConfigHandler();
			ExplorerCore.Init(this);
		}

		public override void Load()
		{
			Init();
		}
	}
	public interface IExplorerLoader
	{
		string ExplorerFolderDestination { get; }

		string ExplorerFolderName { get; }

		string UnhollowedModulesFolder { get; }

		ConfigHandler ConfigHandler { get; }

		Action<object> OnLogMessage { get; }

		Action<object> OnLogWarning { get; }

		Action<object> OnLogError { get; }
	}
}
namespace UnityExplorer.CatmullRom
{
	[Serializable]
	public struct CatmullRomPoint
	{
		public Vector3 position;

		public Quaternion rotation;

		public float fov;

		public CatmullRomPoint(Vector3 position, Quaternion rotation, float fov)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: 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_000a: Unknown result type (might be due to invalid IL or missing references)
			this.position = position;
			this.rotation = rotation;
			this.fov = fov;
		}

		public CatmullRomPoint(Vector3 position, Vector4 rotation, float fov)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: 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_000a: 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)
			this.position = position;
			this.rotation = Vector4ToQuaternion(rotation);
			this.fov = fov;
		}

		public static Vector4 QuaternionToVector4(Quaternion q)
		{
			//IL_0001: 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_000d: 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_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_0021: Unknown result type (might be due to invalid IL or missing references)
			return new Vector4(q.x, q.y, q.z, q.w);
		}

		public static Quaternion Vector4ToQuaternion(Vector4 v)
		{
			//IL_0001: 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_000d: 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_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_0021: Unknown result type (might be due to invalid IL or missing references)
			return new Quaternion(v.x, v.y, v.z, v.w);
		}

		public static CatmullRomPoint operator +(CatmullRomPoint a, CatmullRomPoint b)
		{
			//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_000c: 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_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: 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_001b: 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_0022: 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_0032: 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)
			Vector4 val = QuaternionToVector4(a.rotation);
			Vector4 val2 = QuaternionToVector4(b.rotation);
			Vector4 v = val + val2;
			return new CatmullRomPoint(a.position + b.position, Vector4ToQuaternion(v), a.fov + b.fov);
		}

		public static CatmullRomPoint operator -(CatmullRomPoint a, CatmullRomPoint b)
		{
			//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_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_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: 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_002f: Unknown result type (might be due to invalid IL or missing references)
			Vector4 v = QuaternionToVector4(a.rotation) - QuaternionToVector4(b.rotation);
			return new CatmullRomPoint(a.position - b.position, Vector4ToQuaternion(v), a.fov - b.fov);
		}

		public static CatmullRomPoint operator /(CatmullRomPoint a, float b)
		{
			//IL_0002: 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_000e: Unknown result type (might be due to invalid IL or missing references)
			return new CatmullRomPoint(a.position / b, a.rotation, a.fov);
		}

		public static CatmullRomPoint operator *(CatmullRomPoint a, float b)
		{
			//IL_0002: 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_000e: Unknown result type (might be due to invalid IL or missing references)
			return new CatmullRomPoint(a.position * b, a.rotation, a.fov);
		}

		public CatmullRomPoint Normalize()
		{
			((Vector3)(ref position)).Normalize();
			return this;
		}
	}
	public class CatmullRomMover : MonoBehaviour
	{
		public bool playingPath;

		private bool closedLoop;

		private CatmullRomPoint[] splinePoints;

		private List<CatmullRomPoint> lookaheadPoints = new List<CatmullRomPoint>();

		private CatmullRomPoint lookahead;

		private float lookaheadDelta;

		private float time;

		private float speed;

		private float delta;

		private float tension = 0f;

		private float alpha = 0.5f;

		private CatmullRomPoint pauseCamCache;

		static CatmullRomMover()
		{
			ClassInjector.RegisterTypeInIl2Cpp<CatmullRomMover>();
		}

		public CatmullRomMover(IntPtr ptr)
			: base(ptr)
		{
		}

		public CatmullRomMover()
		{
			splinePoints = new CatmullRomPoint[0];
			lookaheadPoints = new List<CatmullRomPoint>();
		}

		public void StartPath()
		{
			if (splinePoints == null || splinePoints.Length <= 2)
			{
				CatmullRomPoint[] array = splinePoints;
				int value = ((array != null) ? array.Length : 0);
				ExplorerCore.LogWarning($"Cannot start camera path: Need at least 3 nodes, but only {value} node(s) exist. Please add more nodes to create a path.");
				throw new ArgumentException("Catmull Rom Error: Too few spline points!");
			}
			playingPath = true;
			delta = lookaheadDelta;
			MoveCameraToPoint(splinePoints[0]);
			lookahead = lookaheadPoints[1];
		}

		public void TogglePause()
		{
			playingPath = !playingPath;
			if (!playingPath)
			{
				pauseCamCache = GetCurrentPoint();
			}
			else
			{
				MoveCameraToPoint(pauseCamCache);
			}
		}

		public bool IsPaused()
		{
			return playingPath;
		}

		public void Stop()
		{
			playingPath = false;
			delta = lookaheadDelta;
			lookahead = GetPointFromPath(delta);
			MoveCameraToPoint(splinePoints[0]);
			pauseCamCache = GetCurrentPoint();
		}

		public void setClosedLoop(bool newClosedLoop)
		{
			closedLoop = newClosedLoop;
		}

		[HideFromIl2Cpp]
		public void setSplinePoints(CatmullRomPoint[] newSplinePoints)
		{
			splinePoints = newSplinePoints;
		}

		public void setTime(float newTime)
		{
			time = newTime;
		}

		public void setCatmullRomVariables(float newAlpha, float newTension)
		{
			alpha = newAlpha;
			tension = newTension;
		}

		private void Update()
		{
			if (playingPath)
			{
				AdvanceMover(Time.fixedDeltaTime);
			}
		}

		private CatmullRomPoint GetCurrentPoint()
		{
			//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_0009: 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)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			Vector3 cameraPosition = FreeCamPanel.GetCameraPosition();
			Quaternion cameraRotation = FreeCamPanel.GetCameraRotation();
			return new CatmullRomPoint(cameraPosition, cameraRotation, FreeCamPanel.GetFreecam().fieldOfView);
		}

		private void AdvanceMover(float dt)
		{
			//IL_0021: 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_0055: 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_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			float num = 1f / 60f * speed;
			while ((double)num > 0.0)
			{
				CatmullRomPoint currentPoint = GetCurrentPoint();
				float num2 = Vector3.Distance(lookahead.position, currentPoint.position);
				float num3 = Math.Min(num, num2);
				MoveCameraStep(currentPoint, num3, num2);
				num -= num3;
				currentPoint = GetCurrentPoint();
				for (num2 = Vector3.Distance(lookahead.position, currentPoint.position); num2 <= 0.0002f; num2 = Vector3.Distance(lookahead.position, currentPoint.position))
				{
					if (delta >= 1f)
					{
						PathFinished();
					}
					delta = Math.Min(delta + lookaheadDelta, 1f);
					int index = (int)((float)(lookaheadPoints.Count - 1) * delta);
					lookahead = lookaheadPoints[index];
				}
			}
		}

		public void MoveCameraStep(CatmullRomPoint currentPoint, float actual, float room)
		{
			//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_002a: Unknown result type (might be due to invalid IL or m

UniverseLib.BIE.IL2CPP.Interop.dll

Decompiled 17 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using HarmonyLib;
using Il2CppInterop.Common;
using Il2CppInterop.Common.Attributes;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.Attributes;
using Il2CppInterop.Runtime.Injection;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppInterop.Runtime.Runtime;
using Il2CppSystem;
using Il2CppSystem.Collections;
using Il2CppSystem.Collections.Generic;
using Il2CppSystem.Reflection;
using Il2CppSystem.Threading;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UniverseLib.Config;
using UniverseLib.Input;
using UniverseLib.Reflection;
using UniverseLib.Runtime;
using UniverseLib.Runtime.Il2Cpp;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.ObjectPool;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using UniverseLib.UI.Widgets.ScrollView;
using UniverseLib.Utility;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("UniverseLib")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Sinai, yukieiji")]
[assembly: AssemblyProduct("UniverseLib")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")]
[assembly: AssemblyFileVersion("1.5.11")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.5.11.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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]
	[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]
	[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;
		}
	}
}
namespace UniverseLib
{
	public static class ReflectionExtensions
	{
		public static Type GetActualType(this object obj)
		{
			return ReflectionUtility.Instance.Internal_GetActualType(obj);
		}

		public static object TryCast(this object obj)
		{
			return ReflectionUtility.Instance.Internal_TryCast(obj, ReflectionUtility.Instance.Internal_GetActualType(obj));
		}

		public static object TryCast(this object obj, Type castTo)
		{
			return ReflectionUtility.Instance.Internal_TryCast(obj, castTo);
		}

		public static T TryCast<T>(this object obj)
		{
			try
			{
				return (T)ReflectionUtility.Instance.Internal_TryCast(obj, typeof(T));
			}
			catch
			{
				return default(T);
			}
		}

		public static Type[] TryGetTypes(this Assembly asm)
		{
			try
			{
				return asm.GetTypes();
			}
			catch (ReflectionTypeLoadException e)
			{
				return ReflectionUtility.TryExtractTypesFromException(e);
			}
			catch
			{
				try
				{
					return asm.GetExportedTypes();
				}
				catch (ReflectionTypeLoadException e2)
				{
					return ReflectionUtility.TryExtractTypesFromException(e2);
				}
				catch
				{
					return ArgumentUtility.EmptyTypes;
				}
			}
		}

		public static bool ReferenceEqual(this object objA, object objB)
		{
			if (objA == objB)
			{
				return true;
			}
			Object val = (Object)((objA is Object) ? objA : null);
			if (val != null)
			{
				Object val2 = (Object)((objB is Object) ? objB : null);
				if (val2 != null && Object.op_Implicit(val) && Object.op_Implicit(val2) && val.m_CachedPtr == val2.m_CachedPtr)
				{
					return true;
				}
			}
			Object val3 = (Object)((objA is Object) ? objA : null);
			if (val3 != null)
			{
				Object val4 = (Object)((objB is Object) ? objB : null);
				if (val4 != null && ((Il2CppObjectBase)val3).Pointer == ((Il2CppObjectBase)val4).Pointer)
				{
					return true;
				}
			}
			return false;
		}

		public static string ReflectionExToString(this Exception e, bool innerMost = true)
		{
			if (e == null)
			{
				return "The exception was null.";
			}
			if (innerMost)
			{
				e = e.GetInnerMostException();
			}
			return $"{e.GetType()}: {e.Message}";
		}

		public static Exception GetInnerMostException(this Exception e)
		{
			while (e != null && e.InnerException != null && !(e.InnerException is RuntimeWrappedException))
			{
				e = e.InnerException;
			}
			return e;
		}
	}
	internal class Il2CppDictionary : IEnumerator<DictionaryEntry>, IEnumerator, IDisposable
	{
		private readonly Il2CppEnumerator keysEnumerator;

		private readonly Il2CppEnumerator valuesEnumerator;

		public object Current => new DictionaryEntry(keysEnumerator.Current, valuesEnumerator.Current);

		DictionaryEntry IEnumerator<DictionaryEntry>.Current => new DictionaryEntry(keysEnumerator.Current, valuesEnumerator.Current);

		public Il2CppDictionary(Il2CppEnumerator keysEnumerator, Il2CppEnumerator valuesEnumerator)
		{
			this.keysEnumerator = keysEnumerator;
			this.valuesEnumerator = valuesEnumerator;
		}

		public bool MoveNext()
		{
			if (keysEnumerator.MoveNext())
			{
				return valuesEnumerator.MoveNext();
			}
			return false;
		}

		public void Dispose()
		{
			throw new NotImplementedException();
		}

		public void Reset()
		{
			throw new NotImplementedException();
		}
	}
	internal class Il2CppEnumerator : IEnumerator
	{
		private readonly object enumerator;

		private readonly MethodInfo m_GetEnumerator;

		private readonly object instanceForMoveNext;

		private readonly MethodInfo m_MoveNext;

		private readonly object instanceForCurrent;

		private readonly MethodInfo p_Current;

		public object Current => p_Current.Invoke(instanceForCurrent, null);

		public bool MoveNext()
		{
			return (bool)m_MoveNext.Invoke(instanceForMoveNext, null);
		}

		public void Reset()
		{
			throw new NotImplementedException();
		}

		public Il2CppEnumerator(object instance, Type type)
		{
			m_GetEnumerator = type.GetMethod("GetEnumerator") ?? type.GetMethod("System_Collections_IEnumerable_GetEnumerator", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
			enumerator = m_GetEnumerator.Invoke(instance.TryCast(m_GetEnumerator.DeclaringType), ArgumentUtility.EmptyArgs);
			if (enumerator == null)
			{
				throw new Exception("GetEnumerator returned null");
			}
			Type actualType = enumerator.GetActualType();
			m_MoveNext = actualType.GetMethod("MoveNext") ?? actualType.GetMethod("System_Collections_IEnumerator_MoveNext", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
			instanceForMoveNext = enumerator.TryCast(m_MoveNext.DeclaringType);
			p_Current = actualType.GetProperty("Current")?.GetGetMethod() ?? actualType.GetMethod("System_Collections_IEnumerator_get_Current", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
			instanceForCurrent = enumerator.TryCast(p_Current.DeclaringType);
		}
	}
	public class Il2CppReflection : ReflectionUtility
	{
		internal Stopwatch initStopwatch = new Stopwatch();

		internal static readonly Dictionary<string, MethodInfo> unboxMethods = new Dictionary<string, MethodInfo>();

		internal static readonly IReadOnlyDictionary<string, Type> il2cppPrimitivesToMono = new Dictionary<string, Type>
		{
			{
				"Il2CppSystem.Boolean",
				typeof(bool)
			},
			{
				"Il2CppSystem.Byte",
				typeof(byte)
			},
			{
				"Il2CppSystem.SByte",
				typeof(sbyte)
			},
			{
				"Il2CppSystem.Char",
				typeof(char)
			},
			{
				"Il2CppSystem.Double",
				typeof(double)
			},
			{
				"Il2CppSystem.Single",
				typeof(float)
			},
			{
				"Il2CppSystem.Int32",
				typeof(int)
			},
			{
				"Il2CppSystem.UInt32",
				typeof(uint)
			},
			{
				"Il2CppSystem.Int64",
				typeof(long)
			},
			{
				"Il2CppSystem.UInt64",
				typeof(ulong)
			},
			{
				"Il2CppSystem.Int16",
				typeof(short)
			},
			{
				"Il2CppSystem.UInt16",
				typeof(ushort)
			},
			{
				"Il2CppSystem.IntPtr",
				typeof(IntPtr)
			},
			{
				"Il2CppSystem.UIntPtr",
				typeof(UIntPtr)
			}
		};

		private const string IL2CPP_STRING_FULLNAME = "Il2CppSystem.String";

		private const string STRING_FULLNAME = "System.String";

		private static readonly Dictionary<string, IntPtr> cppClassPointers = new Dictionary<string, IntPtr>();

		private static readonly Dictionary<string, Type> obfuscatedToDeobfuscatedTypes = new Dictionary<string, Type>();

		private static readonly Dictionary<string, string> deobfuscatedToObfuscatedNames = new Dictionary<string, string>();

		internal static IntPtr cppIEnumerablePointer;

		internal static IntPtr cppIDictionaryPointer;

		protected override void Initialize()
		{
			base.Initialize();
			ReflectionUtility.Initializing = true;
			((MonoBehaviour)UniversalBehaviour.Instance).StartCoroutine(InitCoroutine().WrapToIl2Cpp());
		}

		private IEnumerator InitCoroutine()
		{
			initStopwatch.Start();
			Stopwatch sw = new Stopwatch();
			sw.Start();
			IEnumerator coro = TryLoadGameModules();
			while (coro.MoveNext())
			{
				yield return null;
			}
			Universe.Log($"Loaded Unhollowed modules in {(float)sw.ElapsedMilliseconds * 0.001f} seconds.");
			sw.Reset();
			sw.Start();
			BuildDeobfuscationCache();
			Universe.Log($"Setup deobfuscation cache in {(float)sw.ElapsedMilliseconds * 0.001f} seconds.");
			ReflectionUtility.OnTypeLoaded += TryCacheDeobfuscatedType;
			ReflectionUtility.Initializing = false;
		}

		internal override Type Internal_GetTypeByName(string fullName)
		{
			if (obfuscatedToDeobfuscatedTypes.TryGetValue(fullName, out var value))
			{
				return value;
			}
			return base.Internal_GetTypeByName(fullName);
		}

		internal override Type Internal_GetActualType(object obj)
		{
			if (obj == null)
			{
				return null;
			}
			Type type = obj.GetType();
			try
			{
				if (il2cppPrimitivesToMono.TryGetValue(type.FullName, out var value))
				{
					return value;
				}
				Il2CppObjectBase val = (Il2CppObjectBase)((obj is Il2CppObjectBase) ? obj : null);
				if (val != null)
				{
					if (type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(Il2CppArrayBase<>))
					{
						return type;
					}
					IntPtr intPtr = IL2CPP.il2cpp_object_get_class(val.Pointer);
					Object val2 = (Object)((obj is Object) ? obj : null);
					Type cppType = ((val2 == null) ? Il2CppType.TypeFromPointer(intPtr, "<unknown type>") : val2.GetIl2CppType());
					return GetUnhollowedType(cppType) ?? type;
				}
			}
			catch (Exception ex)
			{
				Universe.LogWarning("Exception in IL2CPP GetActualType: " + ex);
			}
			return type;
		}

		public static Type GetUnhollowedType(Type cppType)
		{
			if (cppType.IsArray)
			{
				return GetArrayBaseForArray(cppType);
			}
			if (ReflectionUtility.AllTypes.TryGetValue(cppType.FullName, out var value) && value.IsPrimitive)
			{
				return value;
			}
			if (IsString(cppType))
			{
				return typeof(string);
			}
			string text = cppType.FullName;
			if (obfuscatedToDeobfuscatedTypes.TryGetValue(text, out var value2))
			{
				return value2;
			}
			if (text.StartsWith("System."))
			{
				text = "Il2Cpp" + text;
			}
			if (!ReflectionUtility.AllTypes.TryGetValue(text, out var value3))
			{
				string text2;
				try
				{
					text2 = Il2CppTypeRedirector.GetAssemblyQualifiedName(cppType);
				}
				catch
				{
					text2 = cppType.AssemblyQualifiedName;
				}
				for (int i = 0; i < text2.Length; i++)
				{
					char c = text2[i];
					if (c == '<' || c == '>')
					{
						text2 = text2.Remove(i, 1);
						text2 = text2.Insert(i, "_");
					}
				}
				value3 = Type.GetType(text2);
				if (value3 == null)
				{
					Universe.LogWarning($"Failed to get Unhollowed type from '{text2}' (originally '{cppType.AssemblyQualifiedName}')!");
				}
			}
			return value3;
		}

		internal static Type GetArrayBaseForArray(Type cppType)
		{
			Type unhollowedType = GetUnhollowedType(cppType.GetElementType());
			if (unhollowedType == null)
			{
				throw new Exception("Could not get unhollowed Element type for Array: " + cppType.FullName);
			}
			if (unhollowedType.IsValueType)
			{
				return typeof(Il2CppStructArray<>).MakeGenericType(unhollowedType);
			}
			if (unhollowedType == typeof(string))
			{
				return typeof(Il2CppStringArray);
			}
			return typeof(Il2CppReferenceArray<>).MakeGenericType(unhollowedType);
		}

		internal override object Internal_TryCast(object obj, Type toType)
		{
			if (obj == null)
			{
				return null;
			}
			Type type = obj.GetType();
			if (type == toType)
			{
				return obj;
			}
			if (type.IsValueType)
			{
				if (IsIl2CppPrimitive(type) && toType.IsPrimitive)
				{
					return MakeMonoPrimitive(obj);
				}
				if (IsIl2CppPrimitive(toType))
				{
					return MakeIl2CppPrimitive(toType, obj);
				}
				if (typeof(Object).IsAssignableFrom(toType))
				{
					return BoxIl2CppObject(obj).TryCast(toType);
				}
				return obj;
			}
			if (obj is string && typeof(Object).IsAssignableFrom(toType))
			{
				return BoxStringToType(obj, toType);
			}
			Il2CppObjectBase val = (Il2CppObjectBase)((obj is Il2CppObjectBase) ? obj : null);
			if (val == null)
			{
				return obj;
			}
			if (toType.IsValueType)
			{
				return UnboxCppObject(val, toType);
			}
			if (toType == typeof(string))
			{
				return UnboxString(obj);
			}
			if (toType.IsSubclassOf(typeof(Il2CppObjectBase)))
			{
				if (!Il2CppTypeNotNull(toType, out var il2cppPtr))
				{
					return obj;
				}
				IntPtr intPtr = IL2CPP.il2cpp_object_get_class(val.Pointer);
				if (!IL2CPP.il2cpp_class_is_assignable_from(il2cppPtr, intPtr))
				{
					return obj;
				}
				if (RuntimeSpecificsStore.IsInjected(il2cppPtr))
				{
					object monoObjectFromIl2CppPointer = ClassInjectorBase.GetMonoObjectFromIl2CppPointer(val.Pointer);
					if (monoObjectFromIl2CppPointer != null)
					{
						return monoObjectFromIl2CppPointer;
					}
				}
				try
				{
					return Activator.CreateInstance(toType, val.Pointer);
				}
				catch
				{
					return obj;
				}
			}
			return obj;
		}

		public static object UnboxCppObject(Il2CppObjectBase cppObj, Type toType)
		{
			if (!toType.IsValueType)
			{
				return null;
			}
			try
			{
				if (toType.IsEnum)
				{
					Type type = ((object)cppObj).GetType();
					if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
					{
						object obj = cppObj.TryCast(type);
						if ((bool)type.GetProperty("HasValue").GetValue(obj, null))
						{
							PropertyInfo property = type.GetProperty("Value");
							return Enum.Parse(toType, property.GetValue(obj, null).ToString());
						}
						return cppObj;
					}
					return Enum.Parse(toType, ((Object)cppObj.TryCast<Enum>()).ToString());
				}
				string assemblyQualifiedName = toType.AssemblyQualifiedName;
				if (!unboxMethods.ContainsKey(assemblyQualifiedName))
				{
					unboxMethods.Add(assemblyQualifiedName, typeof(Il2CppObjectBase).GetMethod("Unbox").MakeGenericMethod(toType));
				}
				return unboxMethods[assemblyQualifiedName].Invoke(cppObj, ArgumentUtility.EmptyArgs);
			}
			catch (Exception ex)
			{
				Universe.LogWarning("Exception Unboxing Il2Cpp object to struct: " + ex);
				return null;
			}
		}

		public static Object BoxIl2CppObject(object value)
		{
			if (value == null)
			{
				return null;
			}
			try
			{
				Type type = value.GetType();
				if (!type.IsValueType)
				{
					return null;
				}
				if (type.IsEnum)
				{
					return Enum.Parse(Il2CppType.From(type), value.ToString());
				}
				if (type.IsPrimitive && ReflectionUtility.AllTypes.TryGetValue("Il2Cpp" + type.FullName, out var value2))
				{
					return BoxIl2CppObject(MakeIl2CppPrimitive(value2, value), value2);
				}
				return BoxIl2CppObject(value, type);
			}
			catch (Exception ex)
			{
				Universe.LogWarning("Exception in BoxIl2CppObject: " + ex);
				return null;
			}
		}

		private static Object BoxIl2CppObject(object cppStruct, Type structType)
		{
			object? obj = AccessTools.Method(structType, "BoxIl2CppObject", ArgumentUtility.EmptyTypes, (Type[])null).Invoke(cppStruct, ArgumentUtility.EmptyArgs);
			return (Object)((obj is Object) ? obj : null);
		}

		public static bool IsIl2CppPrimitive(object obj)
		{
			return IsIl2CppPrimitive(obj.GetType());
		}

		public static bool IsIl2CppPrimitive(Type type)
		{
			return il2cppPrimitivesToMono.ContainsKey(type.FullName);
		}

		public static object MakeMonoPrimitive(object cppPrimitive)
		{
			return AccessTools.Field(cppPrimitive.GetType(), "m_value").GetValue(cppPrimitive);
		}

		public static object MakeIl2CppPrimitive(Type cppType, object monoValue)
		{
			object obj = Activator.CreateInstance(cppType);
			AccessTools.Field(cppType, "m_value").SetValue(obj, monoValue);
			return obj;
		}

		public static bool IsString(object obj)
		{
			if (obj is string || obj is String)
			{
				return true;
			}
			Object val = (Object)((obj is Object) ? obj : null);
			if (val != null)
			{
				Type il2CppType = val.GetIl2CppType();
				if (!(il2CppType.FullName == "Il2CppSystem.String"))
				{
					return il2CppType.FullName == "System.String";
				}
				return true;
			}
			return false;
		}

		public static bool IsString(Type type)
		{
			if (!(type == typeof(string)))
			{
				return type == typeof(String);
			}
			return true;
		}

		public static bool IsString(Type cppType)
		{
			if (!(cppType.FullName == "System.String"))
			{
				return cppType.FullName == "Il2CppSystem.String";
			}
			return true;
		}

		public static object BoxStringToType(object value, Type castTo)
		{
			if (castTo == typeof(String))
			{
				return String.op_Implicit(value as string);
			}
			return Object.op_Implicit(value as string);
		}

		public static string UnboxString(object value)
		{
			if (value == null)
			{
				throw new ArgumentNullException("value");
			}
			if (value is string result)
			{
				return result;
			}
			Object val = (Object)((value is Object) ? value : null);
			if (val == null)
			{
				throw new NotSupportedException("Unable to unbox string from type " + value.GetActualType().FullName + ".");
			}
			string text = String.op_Implicit((String)(object)((val is String) ? val : null));
			if (string.IsNullOrEmpty(text))
			{
				text = val.ToString();
			}
			return text;
		}

		public static bool Il2CppTypeNotNull(Type type)
		{
			IntPtr il2cppPtr;
			return Il2CppTypeNotNull(type, out il2cppPtr);
		}

		public static bool Il2CppTypeNotNull(Type type, out IntPtr il2cppPtr)
		{
			if (!cppClassPointers.TryGetValue(type.AssemblyQualifiedName, out il2cppPtr))
			{
				il2cppPtr = (IntPtr)typeof(Il2CppClassPointerStore<>).MakeGenericType(type).GetField("NativeClassPtr", BindingFlags.Static | BindingFlags.Public).GetValue(null);
				cppClassPointers.Add(type.AssemblyQualifiedName, il2cppPtr);
			}
			return il2cppPtr != IntPtr.Zero;
		}

		private static void BuildDeobfuscationCache()
		{
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			for (int i = 0; i < assemblies.Length; i++)
			{
				Type[] array = assemblies[i].TryGetTypes();
				for (int j = 0; j < array.Length; j++)
				{
					TryCacheDeobfuscatedType(array[j]);
				}
			}
		}

		private static void TryCacheDeobfuscatedType(Type type)
		{
			try
			{
				if (!type.CustomAttributes.Any())
				{
					return;
				}
				foreach (CustomAttributeData customAttribute in type.CustomAttributes)
				{
					if (customAttribute.AttributeType == typeof(ObfuscatedNameAttribute))
					{
						string text = customAttribute.ConstructorArguments[0].Value.ToString();
						obfuscatedToDeobfuscatedTypes.Add(text, type);
						deobfuscatedToObfuscatedNames.Add(type.FullName, text);
						break;
					}
				}
			}
			catch
			{
			}
		}

		internal override string Internal_ProcessTypeInString(string theString, Type type)
		{
			if (deobfuscatedToObfuscatedNames.TryGetValue(type.FullName, out var value))
			{
				return theString.Replace(value, type.FullName);
			}
			return theString;
		}

		internal override void Internal_FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances)
		{
			foreach (string name in possibleNames)
			{
				PropertyInfo property = type.GetProperty(name, flags);
				if (property != null)
				{
					object value = property.GetValue(null, null);
					if (value != null)
					{
						instances.Add(value);
						return;
					}
				}
			}
			base.Internal_FindSingleton(possibleNames, type, flags, instances);
		}

		internal IEnumerator TryLoadGameModules()
		{
			string unhollowed_Modules_Folder = ConfigManager.Unhollowed_Modules_Folder;
			if (Directory.Exists(unhollowed_Modules_Folder))
			{
				string[] files = Directory.GetFiles(unhollowed_Modules_Folder, "*.dll");
				foreach (string filePath in files)
				{
					if (initStopwatch.ElapsedMilliseconds > 10)
					{
						yield return null;
						initStopwatch.Reset();
						initStopwatch.Start();
					}
					DoLoadModule(filePath);
				}
			}
			else
			{
				Universe.LogWarning("Expected Unhollowed folder path does not exist: '" + unhollowed_Modules_Folder + "'. If you are using the standalone release, you can specify the Unhollowed modules path when you call CreateInstance().");
			}
		}

		internal bool DoLoadModule(string fullPath)
		{
			if (string.IsNullOrEmpty(fullPath) || !File.Exists(fullPath))
			{
				return false;
			}
			try
			{
				Assembly.LoadFrom(fullPath);
				return true;
			}
			catch
			{
				return false;
			}
		}

		protected override bool Internal_IsEnumerable(Type type)
		{
			if (base.Internal_IsEnumerable(type))
			{
				return true;
			}
			try
			{
				if (cppIEnumerablePointer == IntPtr.Zero)
				{
					Il2CppTypeNotNull(typeof(IEnumerable), out cppIEnumerablePointer);
				}
				if (cppIEnumerablePointer != IntPtr.Zero && Il2CppTypeNotNull(type, out var il2cppPtr) && IL2CPP.il2cpp_class_is_assignable_from(cppIEnumerablePointer, il2cppPtr))
				{
					return true;
				}
			}
			catch (Exception value)
			{
				Universe.LogWarning($"IEnumerable of type [{type.FullName}] failed to check: {value}");
			}
			return false;
		}

		protected override bool Internal_TryGetEntryType(Type enumerableType, out Type type)
		{
			if (base.Internal_TryGetEntryType(enumerableType, out type))
			{
				return true;
			}
			if (type.IsGenericType)
			{
				type = type.GetGenericArguments()[0];
				return true;
			}
			type = typeof(object);
			return false;
		}

		protected override bool Internal_TryGetEnumerator(object instance, out IEnumerator enumerator)
		{
			if (instance == null)
			{
				throw new ArgumentNullException("instance");
			}
			if (instance is IEnumerable)
			{
				return base.Internal_TryGetEnumerator(instance, out enumerator);
			}
			enumerator = null;
			Type actualType = instance.GetActualType();
			try
			{
				enumerator = new Il2CppEnumerator(instance, actualType);
				return true;
			}
			catch (Exception value)
			{
				Universe.LogWarning($"IEnumerable of type {actualType.FullName} failed to get enumerator: {value}");
				return false;
			}
		}

		protected override bool Internal_IsDictionary(Type type)
		{
			if (base.Internal_IsDictionary(type))
			{
				return true;
			}
			try
			{
				if (cppIDictionaryPointer == IntPtr.Zero && !Il2CppTypeNotNull(typeof(IDictionary), out cppIDictionaryPointer))
				{
					return false;
				}
				if (Il2CppTypeNotNull(type, out var il2cppPtr) && IL2CPP.il2cpp_class_is_assignable_from(cppIDictionaryPointer, il2cppPtr))
				{
					return true;
				}
			}
			catch (Exception value)
			{
				Universe.LogWarning($"IDictionary of type [{type.FullName}] failed to check : {value}");
			}
			return false;
		}

		protected override bool Internal_TryGetEntryTypes(Type type, out Type keys, out Type values)
		{
			if (base.Internal_TryGetEntryTypes(type, out keys, out values))
			{
				return true;
			}
			if (type.IsGenericType)
			{
				Type[] genericArguments = type.GetGenericArguments();
				if (genericArguments.Length == 2)
				{
					keys = genericArguments[0];
					values = genericArguments[1];
					return true;
				}
			}
			keys = typeof(object);
			values = typeof(object);
			return false;
		}

		protected override bool Internal_TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator)
		{
			if (dictionary is IDictionary)
			{
				return base.Internal_TryGetDictEnumerator(dictionary, out dictEnumerator);
			}
			try
			{
				Type actualType = dictionary.GetActualType();
				if (typeof(Hashtable).IsAssignableFrom(actualType))
				{
					dictEnumerator = EnumerateCppHashTable(dictionary.TryCast<Hashtable>());
					return true;
				}
				PropertyInfo property = actualType.GetProperty("Keys");
				object value = property.GetValue(dictionary.TryCast(property.DeclaringType), null);
				PropertyInfo property2 = actualType.GetProperty("Values");
				object? value2 = property2.GetValue(dictionary.TryCast(property2.DeclaringType), null);
				Il2CppEnumerator keysEnumerator = new Il2CppEnumerator(value, value.GetActualType());
				Il2CppEnumerator valuesEnumerator = new Il2CppEnumerator(value2, value2.GetActualType());
				dictEnumerator = new Il2CppDictionary(keysEnumerator, valuesEnumerator);
				return true;
			}
			catch (Exception value3)
			{
				Universe.LogWarning($"IDictionary failed to enumerate: {value3}");
				dictEnumerator = null;
				return false;
			}
		}

		private static IEnumerator<DictionaryEntry> EnumerateCppHashTable(Hashtable hashtable)
		{
			for (int i = 0; i < ((Il2CppArrayBase<bucket>)(object)hashtable.buckets).Count; i++)
			{
				bucket val = ((Il2CppArrayBase<bucket>)(object)hashtable.buckets)[i];
				if (val != null && val.key != null)
				{
					yield return new DictionaryEntry(val.key, val.val);
				}
			}
		}
	}
	public class ReflectionUtility
	{
		public static bool Initializing;

		public const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;

		public static readonly SortedDictionary<string, Type> AllTypes = new SortedDictionary<string, Type>(StringComparer.OrdinalIgnoreCase);

		public static readonly List<string> AllNamespaces = new List<string>();

		private static readonly HashSet<string> uniqueNamespaces = new HashSet<string>();

		private static string[] allTypeNamesArray;

		private static readonly IReadOnlyDictionary<string, Type> shorthandToType = new Dictionary<string, Type>
		{
			{
				"object",
				typeof(object)
			},
			{
				"string",
				typeof(string)
			},
			{
				"bool",
				typeof(bool)
			},
			{
				"byte",
				typeof(byte)
			},
			{
				"sbyte",
				typeof(sbyte)
			},
			{
				"char",
				typeof(char)
			},
			{
				"decimal",
				typeof(decimal)
			},
			{
				"double",
				typeof(double)
			},
			{
				"float",
				typeof(float)
			},
			{
				"int",
				typeof(int)
			},
			{
				"uint",
				typeof(uint)
			},
			{
				"long",
				typeof(long)
			},
			{
				"ulong",
				typeof(ulong)
			},
			{
				"short",
				typeof(short)
			},
			{
				"ushort",
				typeof(ushort)
			},
			{
				"void",
				typeof(void)
			}
		};

		internal static readonly Dictionary<string, Type[]> baseTypes = new Dictionary<string, Type[]>();

		internal static ReflectionUtility Instance { get; private set; }

		public static event Action<Type> OnTypeLoaded;

		internal static void Init()
		{
			Instance = new Il2CppReflection();
			Instance.Initialize();
		}

		protected virtual void Initialize()
		{
			SetupTypeCache();
			Initializing = false;
		}

		public static string[] GetTypeNameArray()
		{
			if (allTypeNamesArray == null || allTypeNamesArray.Length != AllTypes.Count)
			{
				allTypeNamesArray = new string[AllTypes.Count];
				int num = 0;
				foreach (string key in AllTypes.Keys)
				{
					allTypeNamesArray[num] = key;
					num++;
				}
			}
			return allTypeNamesArray;
		}

		private static void SetupTypeCache()
		{
			if (!ConfigManager.Disable_Setup_Force_ReLoad_ManagedAssemblies && Universe.Context == RuntimeContext.Mono)
			{
				ForceLoadManagedAssemblies();
			}
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			for (int i = 0; i < assemblies.Length; i++)
			{
				CacheTypes(assemblies[i]);
			}
			AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoaded;
		}

		private static void AssemblyLoaded(object sender, AssemblyLoadEventArgs args)
		{
			if (!(args.LoadedAssembly == null) && !(args.LoadedAssembly.GetName().Name == "completions"))
			{
				CacheTypes(args.LoadedAssembly);
			}
		}

		private static void ForceLoadManagedAssemblies()
		{
			string path = Path.Combine(Application.dataPath, "Managed");
			if (!Directory.Exists(path))
			{
				return;
			}
			string[] files = Directory.GetFiles(path, "*.dll");
			foreach (string assemblyFile in files)
			{
				try
				{
					Assembly.LoadFrom(assemblyFile).TryGetTypes();
				}
				catch
				{
				}
			}
		}

		internal static void CacheTypes(Assembly asm)
		{
			Type[] array = asm.TryGetTypes();
			foreach (Type type in array)
			{
				try
				{
					string text = type.Namespace;
					if (!string.IsNullOrEmpty(text) && uniqueNamespaces.Add(text))
					{
						int num = 0;
						foreach (string allNamespace in AllNamespaces)
						{
							if (text.CompareTo(allNamespace) >= 0)
							{
								num++;
								continue;
							}
							break;
						}
						AllNamespaces.Insert(num, text);
					}
				}
				catch (Exception value)
				{
					Universe.LogWarning($"THIS WARNING IS NOT BUG!!!! DON'T REPORT THIS!!!!!\n Can't cache type named {type.Name} Error: {value}");
				}
				AllTypes[type.FullName] = type;
				ReflectionUtility.OnTypeLoaded?.Invoke(type);
			}
		}

		public static Type GetTypeByName(string fullName)
		{
			return Instance.Internal_GetTypeByName(fullName);
		}

		internal virtual Type Internal_GetTypeByName(string fullName)
		{
			if (shorthandToType.TryGetValue(fullName, out var value))
			{
				return value;
			}
			AllTypes.TryGetValue(fullName, out var value2);
			if (value2 == null)
			{
				return Type.GetType(fullName);
			}
			return value2;
		}

		internal virtual Type Internal_GetActualType(object obj)
		{
			return obj?.GetType();
		}

		internal virtual object Internal_TryCast(object obj, Type castTo)
		{
			return obj;
		}

		public static string ProcessTypeInString(Type type, string theString)
		{
			return Instance.Internal_ProcessTypeInString(theString, type);
		}

		internal virtual string Internal_ProcessTypeInString(string theString, Type type)
		{
			return theString;
		}

		public static void FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances)
		{
			Instance.Internal_FindSingleton(possibleNames, type, flags, instances);
		}

		internal virtual void Internal_FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances)
		{
			foreach (string name in possibleNames)
			{
				FieldInfo field = type.GetField(name, flags);
				if (field != null)
				{
					object value = field.GetValue(null);
					if (value != null)
					{
						instances.Add(value);
						break;
					}
				}
			}
		}

		public static Type[] TryExtractTypesFromException(ReflectionTypeLoadException e)
		{
			try
			{
				return e.Types.Where((Type it) => it != null).ToArray();
			}
			catch
			{
				return ArgumentUtility.EmptyTypes;
			}
		}

		public static Type[] GetAllBaseTypes(object obj)
		{
			return GetAllBaseTypes(obj?.GetActualType());
		}

		public static Type[] GetAllBaseTypes(Type type)
		{
			if (type == null)
			{
				throw new ArgumentNullException("type");
			}
			string assemblyQualifiedName = type.AssemblyQualifiedName;
			if (baseTypes.TryGetValue(assemblyQualifiedName, out var value))
			{
				return value;
			}
			List<Type> list = new List<Type>();
			while (type != null)
			{
				list.Add(type);
				type = type.BaseType;
			}
			value = list.ToArray();
			baseTypes.Add(assemblyQualifiedName, value);
			return value;
		}

		public static void GetImplementationsOf(Type baseType, Action<HashSet<Type>> onResultsFetched, bool allowAbstract, bool allowGeneric, bool allowEnum)
		{
			RuntimeHelper.StartCoroutine(DoGetImplementations(onResultsFetched, baseType, allowAbstract, allowGeneric, allowEnum));
		}

		private static IEnumerator DoGetImplementations(Action<HashSet<Type>> onResultsFetched, Type baseType, bool allowAbstract, bool allowGeneric, bool allowEnum)
		{
			List<Type> resolvedTypes = new List<Type>();
			OnTypeLoaded += ourListener;
			HashSet<Type> set = new HashSet<Type>();
			IEnumerator coro = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, DefaultTypesEnumerator());
			while (coro.MoveNext())
			{
				yield return null;
			}
			OnTypeLoaded -= ourListener;
			if (resolvedTypes.Count > 0)
			{
				coro = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, resolvedTypes.GetEnumerator());
				while (coro.MoveNext())
				{
					yield return null;
				}
			}
			onResultsFetched(set);
			void ourListener(Type t)
			{
				resolvedTypes.Add(t);
			}
		}

		private static IEnumerator<Type> DefaultTypesEnumerator()
		{
			string[] names = GetTypeNameArray();
			foreach (string key in names)
			{
				yield return AllTypes[key];
			}
		}

		private static IEnumerator GetImplementationsAsync(Type baseType, HashSet<Type> set, bool allowAbstract, bool allowGeneric, bool allowEnum, IEnumerator<Type> enumerator)
		{
			Stopwatch sw = new Stopwatch();
			sw.Start();
			bool isGenericParam = baseType != null && baseType.IsGenericParameter;
			while (enumerator.MoveNext())
			{
				if (sw.ElapsedMilliseconds > 10)
				{
					yield return null;
					sw.Reset();
					sw.Start();
				}
				try
				{
					Type type = enumerator.Current;
					if (set.Contains(type) || (!allowAbstract && type.IsAbstract) || (!allowGeneric && type.IsGenericType) || (!allowEnum && type.IsEnum) || type.FullName.Contains("PrivateImplementationDetails") || type.FullName.Contains("DisplayClass") || type.FullName.Contains('<'))
					{
						continue;
					}
					if (!isGenericParam)
					{
						if (!(baseType != null) || baseType.IsAssignableFrom(type))
						{
							goto IL_01ee;
						}
					}
					else if ((!type.IsClass || !baseType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint)) && (!type.IsValueType || !baseType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint)) && !baseType.GetGenericParameterConstraints().Any((Type it) => !it.IsAssignableFrom(type)))
					{
						goto IL_01ee;
					}
					goto end_IL_0092;
					IL_01ee:
					set.Add(type);
					end_IL_0092:;
				}
				catch
				{
				}
			}
		}

		public static bool IsEnumerable(Type type)
		{
			return Instance.Internal_IsEnumerable(type);
		}

		protected virtual bool Internal_IsEnumerable(Type type)
		{
			return typeof(IEnumerable).IsAssignableFrom(type);
		}

		public static bool TryGetEnumerator(object ienumerable, out IEnumerator enumerator)
		{
			return Instance.Internal_TryGetEnumerator(ienumerable, out enumerator);
		}

		protected virtual bool Internal_TryGetEnumerator(object list, out IEnumerator enumerator)
		{
			enumerator = (list as IEnumerable).GetEnumerator();
			return true;
		}

		public static bool TryGetEntryType(Type enumerableType, out Type type)
		{
			return Instance.Internal_TryGetEntryType(enumerableType, out type);
		}

		protected virtual bool Internal_TryGetEntryType(Type enumerableType, out Type type)
		{
			if (enumerableType.IsArray)
			{
				type = enumerableType.GetElementType();
				return true;
			}
			Type[] interfaces = enumerableType.GetInterfaces();
			foreach (Type type2 in interfaces)
			{
				if (type2.IsGenericType)
				{
					Type genericTypeDefinition = type2.GetGenericTypeDefinition();
					if (genericTypeDefinition == typeof(IEnumerable<>) || genericTypeDefinition == typeof(IList<>) || genericTypeDefinition == typeof(ICollection<>))
					{
						type = type2.GetGenericArguments()[0];
						return true;
					}
				}
			}
			type = typeof(object);
			return false;
		}

		public static bool IsDictionary(Type type)
		{
			return Instance.Internal_IsDictionary(type);
		}

		protected virtual bool Internal_IsDictionary(Type type)
		{
			return typeof(IDictionary).IsAssignableFrom(type);
		}

		public static bool TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator)
		{
			return Instance.Internal_TryGetDictEnumerator(dictionary, out dictEnumerator);
		}

		protected virtual bool Internal_TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator)
		{
			dictEnumerator = EnumerateDictionary((IDictionary)dictionary);
			return true;
		}

		private IEnumerator<DictionaryEntry> EnumerateDictionary(IDictionary dict)
		{
			IDictionaryEnumerator enumerator = dict.GetEnumerator();
			while (enumerator.MoveNext())
			{
				yield return new DictionaryEntry(enumerator.Key, enumerator.Value);
			}
		}

		public static bool TryGetEntryTypes(Type dictionaryType, out Type keys, out Type values)
		{
			return Instance.Internal_TryGetEntryTypes(dictionaryType, out keys, out values);
		}

		protected virtual bool Internal_TryGetEntryTypes(Type dictionaryType, out Type keys, out Type values)
		{
			Type[] interfaces = dictionaryType.GetInterfaces();
			foreach (Type type in interfaces)
			{
				if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IDictionary<, >))
				{
					Type[] genericArguments = type.GetGenericArguments();
					keys = genericArguments[0];
					values = genericArguments[1];
					return true;
				}
			}
			keys = typeof(object);
			values = typeof(object);
			return false;
		}
	}
	public abstract class RuntimeHelper
	{
		internal static RuntimeHelper Instance { get; private set; }

		internal static void Init()
		{
			Instance = new Il2CppProvider();
			Instance.OnInitialize();
		}

		protected internal abstract void OnInitialize();

		public static Coroutine StartCoroutine(IEnumerator routine)
		{
			return Instance.Internal_StartCoroutine(routine);
		}

		protected internal abstract Coroutine Internal_StartCoroutine(IEnumerator routine);

		public static void StopCoroutine(Coroutine coroutine)
		{
			Instance.Internal_StopCoroutine(coroutine);
		}

		protected internal abstract void Internal_StopCoroutine(Coroutine coroutine);

		public static T AddComponent<T>(GameObject obj, Type type) where T : Component
		{
			return Instance.Internal_AddComponent<T>(obj, type);
		}

		protected internal abstract T Internal_AddComponent<T>(GameObject obj, Type type) where T : Component;

		public static ScriptableObject CreateScriptable(Type type)
		{
			return Instance.Internal_CreateScriptable(type);
		}

		protected internal abstract ScriptableObject Internal_CreateScriptable(Type type);

		public static string LayerToName(int layer)
		{
			return Instance.Internal_LayerToName(layer);
		}

		protected internal abstract string Internal_LayerToName(int layer);

		public static T[] FindObjectsOfTypeAll<T>() where T : Object
		{
			return Instance.Internal_FindObjectsOfTypeAll<T>();
		}

		public static Object[] FindObjectsOfTypeAll(Type type)
		{
			return Instance.Internal_FindObjectsOfTypeAll(type);
		}

		protected internal abstract T[] Internal_FindObjectsOfTypeAll<T>() where T : Object;

		protected internal abstract Object[] Internal_FindObjectsOfTypeAll(Type type);

		public static void GraphicRaycast(GraphicRaycaster raycaster, PointerEventData data, List<RaycastResult> list)
		{
			Instance.Internal_GraphicRaycast(raycaster, data, list);
		}

		protected internal abstract void Internal_GraphicRaycast(GraphicRaycaster raycaster, PointerEventData data, List<RaycastResult> list);

		public static GameObject[] GetRootGameObjects(Scene scene)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Instance.Internal_GetRootGameObjects(scene);
		}

		protected internal abstract GameObject[] Internal_GetRootGameObjects(Scene scene);

		public static int GetRootCount(Scene scene)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Instance.Internal_GetRootCount(scene);
		}

		protected internal abstract int Internal_GetRootCount(Scene scene);

		public static void SetColorBlockAuto(Selectable selectable, Color baseColor)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: 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_001c: 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)
			Instance.Internal_SetColorBlock(selectable, baseColor, baseColor * 1.2f, baseColor * 0.8f);
		}

		public static void SetColorBlock(Selectable selectable, ColorBlock colors)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Instance.Internal_SetColorBlock(selectable, colors);
		}

		protected internal abstract void Internal_SetColorBlock(Selectable selectable, ColorBlock colors);

		public static void SetColorBlock(Selectable selectable, Color? normal = null, Color? highlighted = null, Color? pressed = null, Color? disabled = null)
		{
			Instance.Internal_SetColorBlock(selectable, normal, highlighted, pressed, disabled);
		}

		protected internal abstract void Internal_SetColorBlock(Selectable selectable, Color? normal = null, Color? highlighted = null, Color? pressed = null, Color? disabled = null);
	}
	public class AssetBundle : Object
	{
		internal delegate IntPtr d_LoadFromFile(IntPtr path, uint crc, ulong offset);

		private delegate IntPtr d_LoadFromMemory(IntPtr binary, uint crc);

		public delegate IntPtr d_GetAllLoadedAssetBundles_Native();

		internal delegate IntPtr d_LoadAssetWithSubAssets_Internal(IntPtr _this, IntPtr name, IntPtr type);

		internal delegate IntPtr d_LoadAsset_Internal(IntPtr _this, IntPtr name, IntPtr type);

		internal delegate void d_Unload(IntPtr _this, bool unloadAllLoadedObjects);

		public readonly IntPtr m_bundlePtr = IntPtr.Zero;

		static AssetBundle()
		{
			ClassInjector.RegisterTypeInIl2Cpp<AssetBundle>();
		}

		[HideFromIl2Cpp]
		public static AssetBundle LoadFromFile(string path)
		{
			IntPtr intPtr = ICallManager.GetICallUnreliable<d_LoadFromFile>(new string[2] { "UnityEngine.AssetBundle::LoadFromFile_Internal", "UnityEngine.AssetBundle::LoadFromFile" })(IL2CPP.ManagedStringToIl2Cpp(path), 0u, 0uL);
			if (!(intPtr != IntPtr.Zero))
			{
				return null;
			}
			return new AssetBundle(intPtr);
		}

		[HideFromIl2Cpp]
		public static AssetBundle LoadFromMemory(byte[] binary, uint crc = 0u)
		{
			IntPtr intPtr = ICallManager.GetICallUnreliable<d_LoadFromMemory>(new string[2] { "UnityEngine.AssetBundle::LoadFromMemory_Internal", "UnityEngine.AssetBundle::LoadFromMemory" })(((Il2CppObjectBase)Il2CppStructArray<byte>.op_Implicit(binary)).Pointer, crc);
			if (!(intPtr != IntPtr.Zero))
			{
				return null;
			}
			return new AssetBundle(intPtr);
		}

		[HideFromIl2Cpp]
		public static AssetBundle[] GetAllLoadedAssetBundles()
		{
			IntPtr intPtr = ICallManager.GetICall<d_GetAllLoadedAssetBundles_Native>("UnityEngine.AssetBundle::GetAllLoadedAssetBundles_Native")();
			if (!(intPtr != IntPtr.Zero))
			{
				return null;
			}
			return Il2CppArrayBase<AssetBundle>.op_Implicit((Il2CppArrayBase<AssetBundle>)(object)new Il2CppReferenceArray<AssetBundle>(intPtr));
		}

		public AssetBundle(IntPtr ptr)
			: base(ptr)
		{
			m_bundlePtr = ptr;
		}

		[HideFromIl2Cpp]
		public Object[] LoadAllAssets()
		{
			IntPtr intPtr = ICallManager.GetICall<d_LoadAssetWithSubAssets_Internal>("UnityEngine.AssetBundle::LoadAssetWithSubAssets_Internal")(m_bundlePtr, IL2CPP.ManagedStringToIl2Cpp(""), ((Il2CppObjectBase)Il2CppType.Of<Object>()).Pointer);
			if (!(intPtr != IntPtr.Zero))
			{
				return (Object[])(object)new Object[0];
			}
			return Il2CppArrayBase<Object>.op_Implicit((Il2CppArrayBase<Object>)(object)new Il2CppReferenceArray<Object>(intPtr));
		}

		[HideFromIl2Cpp]
		public T LoadAsset<T>(string name) where T : Object
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			IntPtr intPtr = ICallManager.GetICall<d_LoadAsset_Internal>("UnityEngine.AssetBundle::LoadAsset_Internal")(m_bundlePtr, IL2CPP.ManagedStringToIl2Cpp(name), ((Il2CppObjectBase)Il2CppType.Of<T>()).Pointer);
			if (!(intPtr != IntPtr.Zero))
			{
				return default(T);
			}
			return ((Il2CppObjectBase)new Object(intPtr)).TryCast<T>();
		}

		[HideFromIl2Cpp]
		public void Unload(bool unloadAllLoadedObjects)
		{
			ICallManager.GetICall<d_Unload>("UnityEngine.AssetBundle::Unload")(m_bundlePtr, unloadAllLoadedObjects);
		}
	}
	public static class Il2CppExtensions
	{
		public static void AddListener(this UnityEvent action, Action listener)
		{
			action.AddListener(UnityAction.op_Implicit(listener));
		}

		public static void AddListener<T>(this UnityEvent<T> action, Action<T> listener)
		{
			action.AddListener(UnityAction<T>.op_Implicit(listener));
		}

		public static void RemoveListener(this UnityEvent action, Action listener)
		{
			action.RemoveListener(UnityAction.op_Implicit(listener));
		}

		public static void RemoveListener<T>(this UnityEvent<T> action, Action<T> listener)
		{
			action.RemoveListener(UnityAction<T>.op_Implicit(listener));
		}

		public static void SetChildControlHeight(this HorizontalOrVerticalLayoutGroup group, bool value)
		{
			group.childControlHeight = value;
		}

		public static void SetChildControlWidth(this HorizontalOrVerticalLayoutGroup group, bool value)
		{
			group.childControlWidth = value;
		}
	}
	internal class UniversalBehaviour : MonoBehaviour
	{
		private static Delegate queuedDelegate;

		internal static UniversalBehaviour Instance { get; private set; }

		internal static void Setup()
		{
			//IL_000a: 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)
			//IL_0015: Expected O, but got Unknown
			//IL_0015: 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_0017: 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)
			ClassInjector.RegisterTypeInIl2Cpp<UniversalBehaviour>();
			GameObject val = new GameObject("UniverseLibBehaviour");
			Object.DontDestroyOnLoad((Object)val);
			((Object)val).hideFlags = (HideFlags)(((Object)val).hideFlags | 0x3D);
			Instance = val.AddComponent<UniversalBehaviour>();
		}

		internal void Update()
		{
			Universe.Update();
		}

		public UniversalBehaviour(IntPtr ptr)
			: base(ptr)
		{
		}

		internal static void InvokeDelegate(Delegate method)
		{
			queuedDelegate = method;
			((MonoBehaviour)Instance).Invoke("InvokeQueuedAction", 0f);
		}

		private void InvokeQueuedAction()
		{
			try
			{
				Delegate obj = queuedDelegate;
				queuedDelegate = null;
				obj?.DynamicInvoke();
			}
			catch (Exception value)
			{
				Universe.LogWarning($"Exception invoking action from IL2CPP thread: {value}");
			}
		}
	}
	public static class Universe
	{
		public enum GlobalState
		{
			WaitingToSetup,
			SettingUp,
			SetupCompleted
		}

		public const string NAME = "UniverseLib";

		public const string VERSION = "1.5.11";

		public const string AUTHOR = "Sinai, yukieiji";

		public const string GUID = "com.sinai.universelib";

		private static float startupDelay;

		private static Action<string, LogType> logHandler;

		public static RuntimeContext Context { get; } = RuntimeContext.IL2CPP;

		public static GlobalState CurrentGlobalState { get; private set; }

		internal static Harmony Harmony { get; } = new Harmony("com.sinai.universelib");

		private static event Action OnInitialized;

		public static void Init(Action onInitialized = null, Action<string, LogType> logHandler = null)
		{
			Init(1f, onInitialized, logHandler, default(UniverseLibConfig));
		}

		public static void Init(float startupDelay, Action onInitialized, Action<string, LogType> logHandler, UniverseLibConfig config)
		{
			if (CurrentGlobalState == GlobalState.SetupCompleted)
			{
				InvokeOnInitialized(onInitialized);
				return;
			}
			if (startupDelay > Universe.startupDelay)
			{
				Universe.startupDelay = startupDelay;
			}
			ConfigManager.LoadConfig(config);
			OnInitialized += onInitialized;
			if (logHandler != null && Universe.logHandler == null)
			{
				Universe.logHandler = logHandler;
			}
			if (CurrentGlobalState == GlobalState.WaitingToSetup)
			{
				CurrentGlobalState = GlobalState.SettingUp;
				Log("UniverseLib 1.5.11 initializing...");
				UniversalBehaviour.Setup();
				ReflectionUtility.Init();
				RuntimeHelper.Init();
				RuntimeHelper.Instance.Internal_StartCoroutine(SetupCoroutine());
				Log("Finished UniverseLib initial setup.");
			}
		}

		internal static void Update()
		{
			UniversalUI.Update();
		}

		private static IEnumerator SetupCoroutine()
		{
			yield return null;
			Stopwatch sw = new Stopwatch();
			sw.Start();
			while (ReflectionUtility.Initializing || (float)sw.ElapsedMilliseconds * 0.001f < startupDelay)
			{
				yield return null;
			}
			InputManager.Init();
			UniversalUI.Init();
			Log("UniverseLib 1.5.11 initialized.");
			CurrentGlobalState = GlobalState.SetupCompleted;
			InvokeOnInitialized(Universe.OnInitialized);
		}

		private static void InvokeOnInitialized(Action onInitialized)
		{
			if (onInitialized == null)
			{
				return;
			}
			Delegate[] invocationList = onInitialized.GetInvocationList();
			foreach (Delegate obj in invocationList)
			{
				try
				{
					obj.DynamicInvoke();
				}
				catch (Exception value)
				{
					LogWarning($"Exception invoking onInitialized callback! {value}");
				}
			}
		}

		internal static void Log(object message)
		{
			Log(message, (LogType)3);
		}

		internal static void LogWarning(object message)
		{
			Log(message, (LogType)2);
		}

		internal static void LogError(object message)
		{
			Log(message, (LogType)0);
		}

		private static void Log(object message, LogType logType)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			if (logHandler != null)
			{
				logHandler("[UniverseLib] " + (message?.ToString() ?? string.Empty), logType);
			}
		}

		internal static bool Patch(Type type, string methodName, MethodType methodType, Type[] arguments = null, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Invalid comparison between Unknown and I4
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Invalid comparison between Unknown and I4
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Expected O, but got Unknown
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Expected O, but got Unknown
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Expected O, but got Unknown
			try
			{
				string text = (((int)methodType == 1) ? "get_" : (((int)methodType != 2) ? string.Empty : "set_"));
				string text2 = text;
				MethodInfo methodInfo = ((arguments == null) ? type.GetMethod(text2 + methodName, AccessTools.all) : type.GetMethod(text2 + methodName, AccessTools.all, null, arguments, null));
				if (methodInfo == null)
				{
					return false;
				}
				if (Il2CppType.From(type, false) != (Type)null && Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)methodInfo) == null)
				{
					Log("\t IL2CPP method has no corresponding pointer, aborting patch of " + type.FullName + "." + methodName);
					return false;
				}
				PatchProcessor val = Harmony.CreateProcessor((MethodBase)methodInfo);
				if (prefix != null)
				{
					val.AddPrefix(new HarmonyMethod(prefix));
				}
				if (postfix != null)
				{
					val.AddPostfix(new HarmonyMethod(postfix));
				}
				if (finalizer != null)
				{
					val.AddFinalizer(new HarmonyMethod(finalizer));
				}
				val.Patch();
				return true;
			}
			catch (Exception value)
			{
				LogWarning($"\t Exception patching {type.FullName}.{methodName}: {value}");
				return false;
			}
		}

		internal static bool Patch(Type type, string[] possibleNames, MethodType methodType, Type[] arguments = null, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			foreach (string methodName in possibleNames)
			{
				if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
				{
					return true;
				}
			}
			return false;
		}

		internal static bool Patch(Type type, string[] possibleNames, MethodType methodType, Type[][] possibleArguments, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			foreach (string methodName in possibleNames)
			{
				foreach (Type[] arguments in possibleArguments)
				{
					if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
					{
						return true;
					}
				}
			}
			return false;
		}

		internal static bool Patch(Type type, string methodName, MethodType methodType, Type[][] possibleArguments, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			foreach (Type[] arguments in possibleArguments)
			{
				if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
				{
					return true;
				}
			}
			return false;
		}
	}
}
namespace UniverseLib.Utility
{
	public static class ArgumentUtility
	{
		public static readonly Type[] EmptyTypes = new Type[0];

		public static readonly object[] EmptyArgs = new object[0];

		public static readonly Type[] ParseArgs = new Type[1] { typeof(string) };
	}
	public static class IOUtility
	{
		private static readonly char[] invalidDirectoryCharacters = Path.GetInvalidPathChars();

		private static readonly char[] invalidFilenameCharacters = Path.GetInvalidFileNameChars();

		public static string EnsureValidFilePath(string fullPathWithFile)
		{
			fullPathWithFile = string.Concat(fullPathWithFile.Split(invalidDirectoryCharacters));
			Directory.CreateDirectory(Path.GetDirectoryName(fullPathWithFile));
			return fullPathWithFile;
		}

		public static string EnsureValidFilename(string filename)
		{
			return string.Concat(filename.Split(invalidFilenameCharacters));
		}
	}
	public static class MiscUtility
	{
		public static bool ContainsIgnoreCase(this string _this, string s)
		{
			return CultureInfo.CurrentCulture.CompareInfo.IndexOf(_this, s, CompareOptions.IgnoreCase) >= 0;
		}

		public static bool HasFlag(this Enum flags, Enum value)
		{
			try
			{
				ulong num = Convert.ToUInt64(value);
				return (Convert.ToUInt64(flags) & num) == num;
			}
			catch
			{
				long num2 = Convert.ToInt64(value);
				return (Convert.ToInt64(flags) & num2) == num2;
			}
		}

		public static bool EndsWith(this StringBuilder sb, string _string)
		{
			int length = _string.Length;
			if (sb.Length < length)
			{
				return false;
			}
			int num = 0;
			int num2 = sb.Length - length;
			while (num2 < sb.Length)
			{
				if (sb[num2] != _string[num])
				{
					return false;
				}
				num2++;
				num++;
			}
			return true;
		}
	}
	public static class ParseUtility
	{
		internal delegate object ParseMethod(string input);

		internal delegate string ToStringMethod(object obj);

		public static readonly string NumberFormatString = "0.####";

		private static readonly Dictionary<int, string> numSequenceStrings = new Dictionary<int, string>();

		private static readonly HashSet<Type> nonPrimitiveTypes = new HashSet<Type>
		{
			typeof(string),
			typeof(decimal),
			typeof(DateTime)
		};

		private static readonly HashSet<Type> formattedTypes = new HashSet<Type>
		{
			typeof(float),
			typeof(double),
			typeof(decimal)
		};

		private static readonly Dictionary<string, string> typeInputExamples = new Dictionary<string, string>();

		private static readonly Dictionary<string, ParseMethod> customTypes = new Dictionary<string, ParseMethod>
		{
			{
				typeof(Vector2).FullName,
				TryParseVector2
			},
			{
				typeof(Vector3).FullName,
				TryParseVector3
			},
			{
				typeof(Vector4).FullName,
				TryParseVector4
			},
			{
				typeof(Quaternion).FullName,
				TryParseQuaternion
			},
			{
				typeof(Rect).FullName,
				TryParseRect
			},
			{
				typeof(Color).FullName,
				TryParseColor
			},
			{
				typeof(Color32).FullName,
				TryParseColor32
			},
			{
				typeof(LayerMask).FullName,
				TryParseLayerMask
			}
		};

		private static readonly Dictionary<string, ToStringMethod> customTypesToString = new Dictionary<string, ToStringMethod>
		{
			{
				typeof(Vector2).FullName,
				Vector2ToString
			},
			{
				typeof(Vector3).FullName,
				Vector3ToString
			},
			{
				typeof(Vector4).FullName,
				Vector4ToString
			},
			{
				typeof(Quaternion).FullName,
				QuaternionToString
			},
			{
				typeof(Rect).FullName,
				RectToString
			},
			{
				typeof(Color).FullName,
				ColorToString
			},
			{
				typeof(Color32).FullName,
				Color32ToString
			},
			{
				typeof(LayerMask).FullName,
				LayerMaskToString
			}
		};

		public static string FormatDecimalSequence(params object[] numbers)
		{
			if (numbers.Length == 0)
			{
				return null;
			}
			return string.Format(CultureInfo.CurrentCulture, GetSequenceFormatString(numbers.Length), numbers);
		}

		internal static string GetSequenceFormatString(int count)
		{
			if (count <= 0)
			{
				return null;
			}
			if (numSequenceStrings.ContainsKey(count))
			{
				return numSequenceStrings[count];
			}
			string[] array = new string[count];
			for (int i = 0; i < count; i++)
			{
				array[i] = $"{{{i}:{NumberFormatString}}}";
			}
			string text = string.Join(" ", array);
			numSequenceStrings.Add(count, text);
			return text;
		}

		public static bool CanParse(Type type)
		{
			if (!string.IsNullOrEmpty(type?.FullName))
			{
				if (!type.IsPrimitive && !type.IsEnum && !nonPrimitiveTypes.Contains(type))
				{
					return customTypes.ContainsKey(type.FullName);
				}
				return true;
			}
			return false;
		}

		public static bool CanParse<T>()
		{
			return CanParse(typeof(T));
		}

		public static bool TryParse<T>(string input, out T obj, out Exception parseException)
		{
			object obj2;
			bool result = TryParse(input, typeof(T), out obj2, out parseException);
			if (obj2 != null)
			{
				obj = (T)obj2;
				return result;
			}
			obj = default(T);
			return result;
		}

		public static bool TryParse(string input, Type type, out object obj, out Exception parseException)
		{
			obj = null;
			parseException = null;
			if (type == null)
			{
				return false;
			}
			if (type == typeof(string))
			{
				obj = input;
				return true;
			}
			if (type.IsEnum)
			{
				try
				{
					obj = Enum.Parse(type, input);
					return true;
				}
				catch (Exception e)
				{
					parseException = e.GetInnerMostException();
					return false;
				}
			}
			try
			{
				if (customTypes.ContainsKey(type.FullName))
				{
					obj = customTypes[type.FullName](input);
				}
				else
				{
					obj = AccessTools.Method(type, "Parse", ArgumentUtility.ParseArgs, (Type[])null).Invoke(null, new object[1] { input });
				}
				return true;
			}
			catch (Exception e2)
			{
				Exception innerMostException = e2.GetInnerMostException();
				parseException = innerMostException;
			}
			return false;
		}

		public static string ToStringForInput<T>(object obj)
		{
			return ToStringForInput(obj, typeof(T));
		}

		public static string ToStringForInput(object obj, Type type)
		{
			if (type == null || obj == null)
			{
				return null;
			}
			if (type == typeof(string))
			{
				return obj as string;
			}
			if (type.IsEnum)
			{
				if (!Enum.IsDefined(type, obj))
				{
					return obj.ToString();
				}
				return Enum.GetName(type, obj);
			}
			try
			{
				if (customTypes.ContainsKey(type.FullName))
				{
					return customTypesToString[type.FullName](obj);
				}
				if (formattedTypes.Contains(type))
				{
					return AccessTools.Method(type, "ToString", new Type[2]
					{
						typeof(string),
						typeof(IFormatProvider)
					}, (Type[])null).Invoke(obj, new object[2]
					{
						NumberFormatString,
						CultureInfo.CurrentCulture
					}) as string;
				}
				return obj.ToString();
			}
			catch (Exception value)
			{
				Universe.LogWarning($"Exception formatting object for input: {value}");
				return null;
			}
		}

		public static string GetExampleInput<T>()
		{
			return GetExampleInput(typeof(T));
		}

		public static string GetExampleInput(Type type)
		{
			if (!typeInputExamples.ContainsKey(type.AssemblyQualifiedName))
			{
				try
				{
					if (type.IsEnum)
					{
						typeInputExamples.Add(type.AssemblyQualifiedName, Enum.GetNames(type).First());
					}
					else
					{
						object obj = Activator.CreateInstance(type);
						typeInputExamples.Add(type.AssemblyQualifiedName, ToStringForInput(obj, type));
					}
				}
				catch (Exception message)
				{
					Universe.LogWarning("Exception generating default instance for example input for '" + type.FullName + "'");
					Universe.Log(message);
					return "";
				}
			}
			return typeInputExamples[type.AssemblyQualifiedName];
		}

		internal static object TryParseVector2(string input)
		{
			//IL_0002: 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)
			Vector2 val = default(Vector2);
			string[] array = input.Split(' ');
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector2ToString(object obj)
		{
			//IL_0009: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector2 val))
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y);
		}

		internal static object TryParseVector3(string input)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			string[] array = input.Split(' ');
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector3ToString(object obj)
		{
			//IL_0009: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: 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)
			if (!(obj is Vector3 val))
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y, val.z);
		}

		internal static object TryParseVector4(string input)
		{
			//IL_0002: 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)
			Vector4 val = default(Vector4);
			string[] array = input.Split(' ');
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			val.w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector4ToString(object obj)
		{
			//IL_0009: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: 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_0045: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector4 val))
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y, val.z, val.w);
		}

		internal static object TryParseQuaternion(string input)
		{
			//IL_0002: 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_00d7: 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_0084: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			string[] array = input.Split(' ');
			if (array.Length == 4)
			{
				return (object)new Quaternion
				{
					x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture),
					y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture),
					z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture),
					w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture)
				};
			}
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			return Quaternion.Euler(val);
		}

		internal static string QuaternionToString(object obj)
		{
			//IL_0009: 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_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_0023: 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_003f: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Quaternion val))
			{
				return null;
			}
			Vector3 eulerAngles = ((Quaternion)(ref val)).eulerAngles;
			return FormatDecimalSequence(eulerAngles.x, eulerAngles.y, eulerAngles.z);
		}

		internal static object TryParseRect(string input)
		{
			//IL_0002: 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)
			Rect val = default(Rect);
			string[] array = input.Split(' ');
			((Rect)(ref val)).x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).width = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).height = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string RectToString(object obj)
		{
			//IL_0009: 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)
			if (!(obj is Rect val))
			{
				return null;
			}
			return FormatDecimalSequence(((Rect)(ref val)).x, ((Rect)(ref val)).y, ((Rect)(ref val)).width, ((Rect)(ref val)).height);
		}

		internal static object TryParseColor(string input)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			Color val = default(Color);
			string[] array = input.Split(' ');
			val.r = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.g = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.b = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			if (array.Length > 3)
			{
				val.a = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			}
			else
			{
				val.a = 1f;
			}
			return val;
		}

		internal static string ColorToString(object obj)
		{
			//IL_0009: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: 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_0045: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Color val))
			{
				return null;
			}
			return FormatDecimalSequence(val.r, val.g, val.b, val.a);
		}

		internal static object TryParseColor32(string input)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			Color32 val = default(Color32);
			string[] array = input.Split(' ');
			val.r = byte.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.g = byte.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.b = byte.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			if (array.Length > 3)
			{
				val.a = byte.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			}
			else
			{
				val.a = byte.MaxValue;
			}
			return val;
		}

		internal static string Color32ToString(object obj)
		{
			//IL_0009: 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_001e: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Color32 val))
			{
				return null;
			}
			return $"{val.r} {val.g} {val.b} {val.a}";
		}

		internal static object TryParseLayerMask(string input)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return LayerMask.op_Implicit(int.Parse(input));
		}

		internal static string LayerMaskToString(object obj)
		{
			//IL_0009: 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)
			if (!(obj is LayerMask val))
			{
				return null;
			}
			return ((LayerMask)(ref val)).value.ToString();
		}
	}
	public static class SignatureHighlighter
	{
		public const string NAMESPACE = "#a8a8a8";

		public const string CONST = "#92c470";

		public const string CLASS_STATIC = "#3a8d71";

		public const string CLASS_INSTANCE = "#2df7b2";

		public const string STRUCT = "#0fba3a";

		public const string INTERFACE = "#9b9b82";

		public const string FIELD_STATIC = "#8d8dc6";

		public const string FIELD_INSTANCE = "#c266ff";

		public const string METHOD_STATIC = "#b55b02";

		public const string METHOD_INSTANCE = "#ff8000";

		public const string PROP_STATIC = "#588075";

		public const string PROP_INSTANCE = "#55a38e";

		public const string LOCAL_ARG = "#a6e9e9";

		public const string OPEN_COLOR = "<color=";

		public const string CLOSE_COLOR = "</color>";

		public const string OPEN_ITALIC = "<i>";

		public const string CLOSE_ITALIC = "</i>";

		public static readonly Regex ArrayTokenRegex = new Regex("\\[,*?\\]");

		private static readonly Regex colorTagRegex = new Regex("<color=#?[\\d|\\w]*>");

		public static readonly Color StringOrange = new Color(0.83f, 0.61f, 0.52f);

		public static readonly Color EnumGreen = new Color(0.57f, 0.76f, 0.43f);

		public static readonly Color KeywordBlue = new Color(0.3f, 0.61f, 0.83f);

		public static readonly string keywordBlueHex = KeywordBlue.ToHex();

		public static readonly Color NumberGreen = new Color(0.71f, 0.8f, 0.65f);

		private static readonly Dictionary<string, string> typeToRichType = new Dictionary<string, string>();

		private static readonly Dictionary<string, string> highlightedMethods = new Dictionary<string, string>();

		private static readonly Dictionary<Type, string> builtInTypesToShorthand = new Dictionary<Type, string>
		{
			{
				typeof(object),
				"object"
			},
			{
				typeof(string),
				"string"
			},
			{
				typeof(bool),
				"bool"
			},
			{
				typeof(byte),
				"byte"
			},
			{
				typeof(sbyte),
				"sbyte"
			},
			{
				typeof(char),
				"char"
			},
			{
				typeof(decimal),
				"decimal"
			},
			{
				typeof(double),
				"double"
			},
			{
				typeof(float),
				"float"
			},
			{
				typeof(int),
				"int"
			},
			{
				typeof(uint),
				"uint"
			},
			{
				typeof(long),
				"long"
			},
			{
				typeof(ulong),
				"ulong"
			},
			{
				typeof(short),
				"short"
			},
			{
				typeof(ushort),
				"ushort"
			},
			{
				typeof(void),
				"void"
			}
		};

		public static string Parse(Type type, bool includeNamespace, MemberInfo memberInfo = null)
		{
			if (type == null)
			{
				throw new ArgumentNullException("type");
			}
			if (memberInfo is MethodInfo method)
			{
				return ParseMethod(method);
			}
			if (memberInfo is ConstructorInfo ctor)
			{
				return ParseConstructor(ctor);
			}
			StringBuilder stringBuilder = new StringBuilder();
			if (type.IsByRef)
			{
				AppendOpenColor(stringBuilder, "#" + keywordBlueHex).Append("ref ").Append("</color>");
			}
			Type type2 = type;
			while (type2.HasElementType)
			{
				type2 = type2.GetElementType();
			}
			includeNamespace &= !builtInTypesToShorthand.ContainsKey(type2);
			if (!type.IsGenericParameter && (!type.HasElementType || !type.GetElementType().IsGenericParameter) && includeNamespace && TryGetNamespace(type, out var ns))
			{
				AppendOpenColor(stringBuilder, "#a8a8a8").Append(ns).Append("</color>").Append('.');
			}
			stringBuilder.Append(ProcessType(type));
			if (memberInfo != null)
			{
				stringBuilder.Append('.');
				int index = stringBuilder.Length - 1;
				AppendOpenColor(stringBuilder, GetMemberInfoColor(memberInfo, out var isStatic)).Append(memberInfo.Name).Append("</color>");
				if (isStatic)
				{
					stringBuilder.Insert(index, "<i>");
					stringBuilder.Append("</i>");
				}
			}
			return stringBuilder.ToString();
		}

		private static string ProcessType(Type type)
		{
			string key = type.ToString();
			if (typeToRichType.ContainsKey(key))
			{
				return typeToRichType[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			if (!type.IsGenericParameter)
			{
				int length = stringBuilder.Length;
				Type declaringType = type.DeclaringType;
				while (declaringType != null)
				{
					stringBuilder.Insert(length, HighlightType(declaringType) + ".");
					declaringType = declaringType.DeclaringType;
				}
				stringBuilder.Append(HighlightType(type));
				if (type.IsGenericType)
				{
					ProcessGenericArguments(type, stringBuilder);
				}
			}
			else
			{
				stringBuilder.Append("<color=").Append("#92c470").Append('>')
					.Append(type.Name)
					.Append("</color>");
			}
			string text = stringBuilder.ToString();
			typeToRichType.Add(key, text);
			return text;
		}

		internal static string GetClassColor(Type type)
		{
			if (type.IsAbstract && type.IsSealed)
			{
				return "#3a8d71";
			}
			if (type.IsEnum || type.IsGenericParameter)
			{
				return "#92c470";
			}
			if (type.IsValueType)
			{
				return "#0fba3a";
			}
			if (type.IsInterface)
			{
				return "#9b9b82";
			}
			return "#2df7b2";
		}

		private static bool TryGetNamespace(Type type, out string ns)
		{
			return !string.IsNullOrEmpty(ns = type.Namespace?.Trim());
		}

		private static StringBuilder AppendOpenColor(StringBuilder sb, string color)
		{
			return sb.Append("<color=").Append(color).Append('>');
		}

		private static string HighlightType(Type type)
		{
			StringBuilder stringBuilder = new StringBuilder();
			if (type.IsByRef)
			{
				type = type.GetElementType();
			}
			int num = 0;
			Match match = ArrayTokenRegex.Match(type.Name);
			if (match != null && match.Success)
			{
				num = 1 + match.Value.Count((char c) => c == ',');
				type = type.GetElementType();
			}
			if (builtInTypesToShorthand.TryGetValue(type, out var value))
			{
				AppendOpenColor(stringBuilder, "#" + keywordBlueHex).Append(value).Append("</color>");
			}
			else
			{
				StringBuilder stringBuilder2 = stringBuilder;
				StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(1, 2, stringBuilder2);
				handler.AppendFormatted("<color=");
				handler.AppendFormatted(GetClassColor(type));
				handler.AppendLiteral(">");
				stringBuilder2.Append(ref handler).Append(type.Name).Append("</color>");
			}
			if (num > 0)
			{
				stringBuilder.Append('[').Append(new string(',', num - 1)).Append(']');
			}
			return stringBuilder.ToString();
		}

		private static void ProcessGenericArguments(Type type, StringBuilder sb)
		{
			List<Type> list = type.GetGenericArguments().ToList();
			for (int i = 0; i < sb.Length; i++)
			{
				if (!list.Any())
				{
					break;
				}
				if (sb[i] != '`')
				{
					continue;
				}
				int num = i;
				i++;
				StringBuilder stringBuilder = new StringBuilder();
				for (; char.IsDigit(sb[i]); i++)
				{
					stringBuilder.Append(sb[i]);
				}
				string text = stringBuilder.ToString();
				int num2 = int.Parse(text);
				sb.Remove(num, text.Length + 1);
				int num3 = 1;
				num++;
				while (num3 < "</color>".Length && sb[num] == "</color>"[num3])
				{
					num3++;
					num++;
				}
				sb.Insert(num, '<');
				num++;
				int length = sb.Length;
				while (num2 > 0 && list.Any())
				{
					num2--;
					Type type2 = list.First();
					list.RemoveAt(0);
					sb.Insert(num, ProcessType(type2));
					if (num2 > 0)
					{
						num += sb.Length - length;
						sb.Insert(num, ", ");
						num += 2;
						length = sb.Length;
					}
				}
				sb.Insert(num + sb.Length - length, '>');
			}
		}

		public static string RemoveHighlighting(string _string)
		{
			if (_string == null)
			{
				throw new ArgumentNullException("_string");
			}
			_string = _string.Replace("<i>", string.Empty);
			_string = _string.Replace("</i>", string.Empty);
			_string = colorTagRegex.Replace(_string, string.Empty);
			_string = _string.Replace("</color>", string.Empty);
			return _string;
		}

		[Obsolete("Use 'ParseMethod(MethodInfo)' instead (rename).")]
		public static string HighlightMethod(MethodInfo method)
		{
			return ParseMethod(method);
		}

		public static string ParseMethod(MethodInfo method)
		{
			string key = GeneralExtensions.FullDescription((MethodBase)method);
			if (highlightedMethods.ContainsKey(key))
			{
				return highlightedMethods[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(Parse(method.DeclaringType, includeNamespace: false));
			stringBuilder.Append('.');
			string value = ((!method.IsStatic) ? "#ff8000" : "#b55b02");
			StringBuilder stringBuilder2 = stringBuilder;
			StringBuilder stringBuilder3 = stringBuilder2;
			StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(16, 2, stringBuilder2);
			handler.AppendLiteral("<color=");
			handler.AppendFormatted(value);
			handler.AppendLiteral(">");
			handler.AppendFormatted(method.Name);
			handler.AppendLiteral("</color>");
			stringBuilder3.Append(ref handler);
			if (method.IsGenericMethod)
			{
				stringBuilder.Append("<");
				Type[] genericArguments = method.GetGenericArguments();
				for (int i = 0; i < genericArguments.Length; i++)
				{
					Type type = genericArguments[i];
					if (type.IsGenericParameter)
					{
						stringBuilder2 = stringBuilder;
						StringBuilder stringBuilder4 = stringBuilder2;
						handler = new StringBuilder.AppendInterpolatedStringHandler(16, 2, stringBuilder2);
						handler.AppendLiteral("<color=");
						handler.AppendFormatted("#92c470");
						handler.AppendLiteral(">");
						handler.AppendFormatted(genericArguments[i].Name);
						handler.AppendLiteral("</color>");
						stringBuilder4.Append(ref handler);
					}
					else
					{
						stringBuilder.Append(Parse(type, includeNamespace: false));
					}
					if (i < genericArguments.Length - 1)
					{
						stringBuilder.Append(", ");
					}
				}
				stringBuilder.Append(">");
			}
			stringBuilder.Append('(');
			ParameterInfo[] parameters = method.GetParameters();
			for (int j = 0; j < parameters.Length; j++)
			{
				ParameterInfo parameterInfo = parameters[j];
				stringBuilder.Append(Parse(parameterInfo.ParameterType, includeNamespace: false));
				if (j < parameters.Length - 1)
				{
					stringBuilder.Append(", ");
				}
			}
			stringBuilder.Append(')');
			string text = stringBuilder.ToString();
			highlightedMethods.Add(key, text);
			return text;
		}

		[Obsolete("Use 'ParseConstructor(ConstructorInfo)' instead (rename).")]
		public static string HighlightConstructor(ConstructorInfo ctor)
		{
			return ParseConstructor(ctor);
		}

		public static string ParseConstructor(ConstructorInfo ctor)
		{
			string key = GeneralExtensions.FullDescription((MethodBase)ctor);
			if (highlightedMethods.ContainsKey(key))
			{
				return highlightedMethods[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(Parse(ctor.DeclaringType, includeNamespace: false));
			string value = stringBuilder.ToString();
			stringBuilder.Append('.');
			stringBuilder.Append(value);
			stringBuilder.Append('(');
			ParameterInfo[] parameters = ctor.GetParameters();
			for (int i = 0; i < parameters.Length; i++)
			{
				ParameterInfo parameterInfo = parameters[i];
				stringBuilder.Append(Parse(parameterInfo.ParameterType, includeNamespace: false));
				if (i < parameters.Length - 1)
				{
					stringBuilder.Append(", ");
				}
			}
			stringBuilder.Append(')');
			string text = stringBuilder.ToString();
			highlightedMethods.Add(key, text);
			return text;
		}

		public static string GetMemberInfoColor(MemberInfo memberInfo, out bool isStatic)
		{
			isStatic = false;
			if (memberInfo is FieldInfo fieldInfo)
			{
				if (fieldInfo.IsStatic)
				{
					isStatic = true;
					return "#8d8dc6";
				}
				return "#c266ff";
			}
			if (memberInfo is MethodInfo methodInfo)
			{
				if (methodInfo.IsStatic)
				{
					isStatic = true;
					return "#b55b02";
				}
				return "#ff8000";
			}
			if (memberInfo is PropertyInfo propertyInfo)
			{
				if (propertyInfo.GetAccessors(nonPublic: true)[0].IsStatic)
				{
					isStatic = true;
					return "#588075";
				}
				return "#55a38e";
			}
			if (memberInfo is ConstructorInfo)
			{
				isStatic = true;
				return "#2df7b2";
			}
			throw new NotImplementedException(memberInfo.GetType().Name + " is not supported");
		}
	}
	public static class ToStringUtility
	{
		internal static Dictionary<string, MethodInfo> toStringMethods = new Dictionary<string, MethodInfo>();

		private const string nullString = "<color=grey>null</color>";

		private const string nullUnknown = "<color=grey>null</color> (?)";

		private const string destroyedString = "<color=red>Destroyed</color>";

		private const string untitledString = "<i><color=grey>untitled</color></i>";

		private const string eventSystemNamespace = "UnityEngine.EventSystem";

		public static string PruneString(string s, int chars = 200, int lines = 5)
		{
			if (string.IsNullOrEmpty(s))
			{
				return s;
			}
			StringBuilder stringBuilder = new StringBuilder(Math.Max(chars, s.Length));
			int num = 0;
			for (int i = 0; i < s.Length; i++)
			{
				if (num >= lines || i >= chars)
				{
					stringBuilder.Append("...");
					break;
				}
				char c = s[i];
				if (c == '\r' || c == '\n')
				{
					num++;
				}
				stringBuilder.Append(c);
			}
			return stringBuilder.ToString();
		}

		public static string ToStringWithType(object value, Type fallbackType, bool includeNamespace = true)
		{
			if (value.IsNullOrDestroyed() && fallbackType == null)
			{
				return "<color=grey>null</color> (?)";
			}
			Type type = value?.GetActualType() ?? fallbackType;
			string text = SignatureHighlighter.Parse(type, includeNamespace);
			StringBuilder stringBuilder = new StringBuilder();
			if (value.IsNullOrDestroyed())
			{
				if (value == null)
				{
					stringBuilder.Append("<color=grey>null</color>");
					AppendRichType(stringBuilder, text);
					return stringBuilder.ToString();
				}
				stringBuilder.Append("<color=red>Destroyed</color>");
				AppendRichType(stringBuilder, text);
				return stringBuilder.ToString();
			}
			Object val = (Object)((value is Object) ? value : null);
			if (val != null)
			{
				if (string.IsNullOrEmpty(val.name))
				{
					stringBuilder.Append("<i><color=grey>untitled</color></i>");
				}
				else
				{
					stringBuilder.Append('"');
					stringBuilder.Append(PruneString(val.name, 50, 1));
					stringBuilder.Append('"');
				}
				AppendRichType(stringBuilder, text);
			}
			else if (type.FullName.StartsWith("UnityEngine.EventSystem"))
			{
				stringBuilder.Append(text);
			}
			else
			{
				string text2 = ToString(value);
				if (type.IsGenericType || text2 == type.FullName || text2 == type.FullName + " " + type.FullName || text2 == "Il2Cpp" + type.FullName || type.FullName == "Il2Cpp" + text2)
				{
					stringBuilder.Append(text);
				}
				else
				{
					stringBuilder.Append(PruneString(text2));
					AppendRichType(stringBuilder, text);
				}
			}
			return stringBuilder.ToString();
		}

		private static void AppendRichType(StringBuilder sb, string richType)
		{
			sb.Append(' ');
			sb.Append('(');
			sb.Append(richType);
			sb.Append(')');
		}

		private static string ToString(object value)
		{
			if (value.IsNullOrDestroyed())
			{
				if (value == null)
				{
					return "<color=grey>null</color>";
				}
				return "<color=red>Destroyed</color>";
			}
			Type actualType = value.GetActualType();
			if (!toStringMethods.ContainsKey(actualType.AssemblyQualifiedName))
			{
				MethodInfo method = actualType.GetMethod("ToString", ArgumentUtility.EmptyTypes);
				toStringMethods.Add(actualType.AssemblyQualifiedName, method);
			}
			value = value.TryCast(actualType);
			string theString;
			try
			{
				theString = (string)toStringMethods[actualType.AssemblyQualifiedName].Invoke(value, ArgumentUtility.EmptyArgs);
			}
			catch (Exception e)
			{
				theString = e.ReflectionExToString();
			}
			theString = ReflectionUtility.ProcessTypeInString(actualType, theString);
			Type val = (Type)((value is Type) ? value : null);
			if (val != null)
			{
				Type unhollowedType = Il2CppReflection.GetUnhollowedType(val);
				if (unhollowedType != null)
				{
					theString = ReflectionUtility.ProcessTypeInString(unhollowedType, theString);
				}
			}
			return theString;
		}
	}
	public static class UnityHelpers
	{
		private static PropertyInfo onEndEdit;

		public static bool OccuredEarlierThanDefault(this float time)
		{
			return Time.realtimeSinceStartup - 0.01f >= time;
		}

		public static bool OccuredEarlierThan(this float time, float secondsAgo)
		{
			return Time.realtimeSinceStartup - secondsAgo >= time;
		}

		public static bool IsNullOrDestroyed(this object obj, bool suppressWarning = true)
		{
			try
			{
				if (obj == null)
				{
					if (!suppressWarning)
					{
						Universe.LogWarning("The target instance is null!");
					}
					return true;
				}
				Object val = (Object)((obj is Object) ? obj : null);
				if (val != null && !Object.op_Implicit(val))
				{
					if (!suppressWarning)
					{
						Universe.LogWarning("The target UnityEngine.Object was destroyed!");
					}
					return true;
				}
				return false;
			}
			catch
			{
				return true;
			}
		}

		public static string GetTransformPath(this Transform transform, bool includeSelf = false)
		{
			StringBuilder stringBuilder = new StringBuilder();
			if (includeSelf)
			{
				stringBuilder.Append(((Object)transform).name);
			}
			while (Object.op_Implicit((Object)(object)transform.parent))
			{
				transform = transform.parent;
				stringBuilder.Insert(0, '/');
				stringBuilder.Insert(0, ((Object)transform).name);
			}
			return stringBuilder.ToString();
		}

		public static string ToHex(this Color color)
		{
			//IL_0000: 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_003c: Unknown result type (might be due to invalid IL or missing references)
			byte value = (byte)Mathf.Clamp(Mathf.RoundToInt(color.r * 255f), 0, 255);
			byte value2 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.g * 255f), 0, 255);
			byte value3 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.b * 255f), 0, 255);
			return $"{value:X2}{value2:X2}{value3:X2}";
		}

		public static Color ToColor(this string _string)
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: 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)
			_string = _string.Replace("#", "");
			if (_string.Length != 6)
			{
				return Color.magenta;
			}
			byte b = byte.Parse(_string.Substring(0, 2), NumberStyles.HexNumber);
			byte b2 = byte.Parse(_string.Substring(2, 2), NumberStyles.HexNumber);
			byte b3 = byte.Parse(_string.Substring(4, 2), NumberStyles.HexNumber);
			return new Color
			{
				r = (float)((decimal)b / 255m),
				g = (float)((decimal)b2 / 255m),
				b = (float)((decimal)b3 / 255m),
				a = 1f
			};
		}

		public static UnityEvent<string> GetOnEndEdit(this InputField _this)
		{
			if (onEndEdit == null)
			{
				onEndEdit = AccessTools.Property(typeof(InputField), "onEndEdit") ?? throw new Exception("Could not get InputField.onEndEdit property!");
			}
			return onEndEdit.GetValue(_this, null).TryCast<UnityEvent<string>>();
		}
	}
}
namespace UniverseLib.UI
{
	public class UIBase
	{
		internal static readonly int TOP_SORTORDER = 30000;

		public string ID { get; }

		public GameObject RootObject { get; }

		public RectTransform RootRect { get; }

		public Canvas Canvas { get; }

		public Action UpdateMethod { get; }

		public PanelManager Panels { get; }

		public bool Enabled
		{
			get
			{
				if (Object.op_Implicit((Object)(object)RootObject))
				{
					return RootObject.activeSelf;
				}
				return false;
			}
			set
			{
				UniversalUI.SetUIActive(ID, value);
			}
		}

		public UIBase(string id, Action updateMethod)
		{
			//IL_005d: 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)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: 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_0131: Unknown result type (might be due to invalid IL or missing references)
			if (string.IsNullOrEmpty(id))
			{
				throw new ArgumentException("Cannot register a UI with a null or empty id!");
			}
			if (UniversalUI.registeredUIs.ContainsKey(id))
			{
				throw new ArgumentException("A UI with the id '" + id + "' is already registered!");
			}
			ID = id;
			UpdateMethod = updateMethod;
			RootObject = UIFactory.CreateUIObject(id + "_Root", UniversalUI.CanvasRoot);
			RootObject.SetActive(false);
			RootRect = RootObject.GetComponent<RectTransform>();
			Canvas = RootObject.AddComponent<Canvas>();
			Canvas.renderMode = (RenderMode)1;
			Canvas.referencePixelsPerUnit = 100f;
			Canvas.sortingOrder = TOP_SORTORDER;
			Canvas.overrideSorting = true;
			CanvasScaler obj = RootObject.AddComponent<CanvasScaler>();
			obj.referenceResolution = new Vector2(1920f, 1080f);
			obj.screenMatchMode = (ScreenMatchMode)1;
			RootObject.AddComponent<GraphicRaycaster>();
			RectTransform component = RootObject.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.pivot = new Vector2(0.5f, 0.5f);
			Panels = CreatePanelManager();
			RootObject.SetActive(true);
			UniversalUI.registeredUIs.Add(id, this);
			UniversalUI.uiBases.Add(this);
		}

		protected virtual PanelManager CreatePanelManager()
		{
			return new PanelManager(this);
		}

		public void SetOnTop()
		{
			RootObject.transform.SetAsLastSibling();
			foreach (UIBase uiBasis in UniversalUI.uiBases)
			{
				int num = UniversalUI.CanvasRoot.transform.childCount - ((Transform)uiBasis.RootRect).GetSiblingIndex();
				uiBasis.Canvas.sortingOrder = TOP_SORTORDER - num;
			}
			UniversalUI.uiBases.Sort((UIBase a, UIBase b) => b.RootObject.transform.GetSiblingIndex().CompareTo(a.RootObject.transform.GetSiblingIndex()));
		}

		internal void Update()
		{
			try
			{
				Panels.Update();
				UpdateMethod?.Invoke();
			}
			catch (Exception value)
			{
				Universe.LogWarning($"Exception invoking update method for {ID}: {value}");
			}
		}
	}
	public static class UIFactory
	{
		internal static Vector2 largeElementSize = new Vector2(100f, 30f);

		internal static Vector2 smallElementSize = new Vector2(25f, 25f);

		internal static Color defaultTextColor = Color.white;

		public static GameObject CreateUIObject(string name, GameObject parent, Vector2 sizeDelta = default(Vector2))
		{
			//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_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name)
			{
				layer = 5,
				hideFlags = (HideFlags)61
			};
			if (Object.op_Implicit((Object)(object)parent))
			{
				val.transform.SetParent(parent.transform, false);
			}
			val.AddComponent<RectTransform>().sizeDelta = sizeDelta;
			return val;
		}

		internal static void SetDefaultTextValues(Text text)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)text).color = defaultTextColor;
			text.font = UniversalUI.DefaultFont;
			text.fontSize = 14;
		}

		internal static void SetDefaultSelectableValues(Selectable selectable)
		{
			//IL_002a: 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_005c: Unknown result type (might be due to invalid IL or missing references)
			Navigation navigation = selectable.navigation;
			navigation.mode = (Mode)4;
			selectable.navigation = navigation;
			RuntimeHelper.Instance.Internal_SetColorBlock(selectable, (Color?)new Color(0.2f, 0.2f, 0.2f), (Color?)new Color(0.3f, 0.3f, 0.3f), (Color?)new Color(0.15f, 0.15f, 0.15f), (Color?)null);
		}

		public static LayoutElement SetLayoutElement(GameObject gameObject, int? minWidth = null, int? minHeight = null, int? flexibleWidth = null, int? flexibleHeight = null, int? preferredWidth = null, int? preferredHeight = null, bool? ignoreLayout = null)
		{
			LayoutElement val = gameObject.GetComponent<LayoutElement>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = gameObject.AddComponent<LayoutElement>();
			}
			if (minWidth.HasValue)
			{
				val.minWidth = minWidth.Value;
			}
			if (minHeight.HasValue)
			{
				val.minHeight = minHeight.Value;
			}
			if (flexibleWidth.HasValue)
			{
				val.flexibleWidth = flexibleWidth.Value;
			}
			if (flexibleHeight.HasValue)
			{
				val.flexibleHeight = flexibleHeight.Value;
			}
			if (preferredWidth.HasValue)
			{
				val.preferredWidth = preferredWidth.Value;
			}
			if (preferredHeight.HasValue)
			{
				val.preferredHeight = preferredHeight.Value;
			}
			if (ignoreLayout.HasValue)
			{
				val.ignoreLayout = ignoreLayout.Value;
			}
			return val;
		}

		public static T SetLayoutGroup<T>(GameObject gameObject, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup
		{
			T val = gameObject.GetComponent<T>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = gameObject.AddComponent<T>();
			}
			return SetLayoutGroup(val, forceWidth, forceHeight, childControlWidth, childControlHeight, spacing, padTop, padBottom, padLeft, padRight, childAlignment);
		}

		public static T SetLayoutGroup<T>(T group, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup
		{
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			if (forceWidth.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childForceExpandWidth = forceWidth.Value;
			}
			if (forceHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childForceExpandHeight = forceHeight.Value;
			}
			if (childControlWidth.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlWidth(childControlWidth.Value);
			}
			if (childControlHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlHeight(childControlHeight.Value);
			}
			if (spacing.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).spacing = spacing.Value;
			}
			if (padTop.HasValue)
			{
				((LayoutGroup)(object)group).padding.top = padTop.Value;
			}
			if (padBottom.HasValue)
			{
				((LayoutGroup)(object)group).padding.bottom = padBottom.Value;
			}
			if (padLeft.HasValue)
			{
				((LayoutGroup)(object)group).padding.left = padLeft.Value;
			}
			if (padRight.HasValue)
			{
				((LayoutGroup)(object)group).padding.right = padRight.Value;
			}
			if (childAlignment.HasValue)
			{
				((LayoutGroup)(object)group).childAlignment = childAlignment.Value;
			}
			return group;
		}

		public static GameObject CreatePanel(string name, GameObject parent, out GameObject contentHolder, Color? bgColor = null)
		{
			//IL_0004: 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_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: 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_008e: 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_00ae: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)1, (int?)1, (int?)1, (int?)1, (TextAnchor?)null)