Decompiled source of Obeliskial Essentials v1.3.0

BepInEx/patchers/BepInExConfigManager.Mono.Patcher.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Mono.Cecil;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("BepInExConfigManager.Patcher")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BepInExConfigManager.Patcher")]
[assembly: AssemblyCopyright("Copyright ©  2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("beabe9b7-0c1c-4071-a99c-1ced983287e9")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("1.0.0.0")]
public static class Patcher
{
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	internal static class ConfigFile_ctor
	{
		internal static void Postfix(ConfigFile __instance, BepInPlugin ownerMetadata)
		{
			CachedConfigFile cachedConfigFile = new CachedConfigFile(__instance, ownerMetadata);
			ConfigFiles.Add(cachedConfigFile);
			ConfigFileCreated?.Invoke(cachedConfigFile);
		}
	}

	internal const string GUID = "com.sinai.bepinexconfigmanager.patcher";

	public static Action<CachedConfigFile> ConfigFileCreated;

	public static List<CachedConfigFile> ConfigFiles { get; }

	public static IEnumerable<string> TargetDLLs { get; }

	public static void Patch(AssemblyDefinition _)
	{
	}

	static Patcher()
	{
		ConfigFiles = new List<CachedConfigFile>();
		TargetDLLs = Enumerable.Empty<string>();
		Init();
	}

	internal static void Init()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		new Harmony("com.sinai.bepinexconfigmanager.patcher").PatchAll();
	}
}
public class CachedConfigFile
{
	public readonly ConfigFile configFile;

	public readonly BepInPlugin metadata;

	public CachedConfigFile(ConfigFile configFile, BepInPlugin metadata)
	{
		this.configFile = configFile;
		this.metadata = metadata;
	}
}

BepInEx/plugins/BepInExConfigManager.Mono.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using ConfigManager.UI;
using ConfigManager.UI.InteractiveValues;
using HarmonyLib;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using UniverseLib;
using UniverseLib.Config;
using UniverseLib.Input;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using UniverseLib.Utility;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("BepInExConfigManager")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BepInExConfigManager")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("51308bd5-5872-4a72-85d2-6194673c8a5f")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace ConfigManager
{
	[BepInPlugin("com.sinai.BepInExConfigManager", "BepInExConfigManager", "1.3.0")]
	public class ConfigManager : BaseUnityPlugin
	{
		public const string GUID = "com.sinai.BepInExConfigManager";

		public const string NAME = "BepInExConfigManager";

		public const string AUTHOR = "Sinai";

		public const string VERSION = "1.3.0";

		internal const string CTG_ID = "BepInExConfigManager";

		internal static string CTG = "Settings";

		internal static ConfigEntry<KeyCode> Main_Menu_Toggle;

		internal static ConfigEntry<bool> Auto_Save_Configs;

		internal static ConfigEntry<float> Startup_Delay;

		internal static ConfigEntry<bool> Disable_EventSystem_Override;

		public static ConfigManager Instance { get; private set; }

		public static ManualLogSource LogSource => ((BaseUnityPlugin)Instance).Logger;

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


		internal void Awake()
		{
			Instance = this;
			Init();
		}

		internal void Update()
		{
			DoUpdate();
		}

		public static void Init()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			InitConfig();
			Universe.Init(Startup_Delay.Value, (Action)LateInit, (Action<string, LogType>)LogHandler, new UniverseLibConfig
			{
				Disable_EventSystem_Override = Disable_EventSystem_Override.Value,
				Force_Unlock_Mouse = true,
				Unhollowed_Modules_Folder = Path.Combine(Paths.BepInExRootPath, "unhollowed")
			});
		}

		private static void LateInit()
		{
			UIManager.Init();
		}

		public static void DoUpdate()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			if (UIManager.uiBase != null && InputManager.GetKeyDown(Main_Menu_Toggle.Value))
			{
				UIManager.ShowMenu = !UIManager.ShowMenu;
			}
		}

		public static void InitConfig()
		{
			//IL_0015: 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_0035: Expected O, but got Unknown
			//IL_0035: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Expected O, but got Unknown
			//IL_006a: Expected O, but got Unknown
			Main_Menu_Toggle = ((BaseUnityPlugin)Instance).Config.Bind<KeyCode>(new ConfigDefinition(CTG, "Main Menu Toggle"), (KeyCode)286, new ConfigDescription("The toggle for the Config Manager menu", (AcceptableValueBase)null, new object[0]));
			Auto_Save_Configs = ((BaseUnityPlugin)Instance).Config.Bind<bool>(new ConfigDefinition(CTG, "Auto-save settings"), false, new ConfigDescription("Automatically save settings after changing them? This will mean the undo feature will be unavailable.", (AcceptableValueBase)null, new object[0]));
			Auto_Save_Configs.SettingChanged += Auto_Save_Configs_SettingChanged;
			Startup_Delay = ((BaseUnityPlugin)Instance).Config.Bind<float>(CTG, "Startup Delay", 1f, "Delays the core startup process. Adjust it if you experience issues.");
			Disable_EventSystem_Override = ((BaseUnityPlugin)Instance).Config.Bind<bool>(CTG, "Disable EventSystem Override", false, "Disables the overriding of the EventSystem from the game, if you experience issues with UI Input.");
			Disable_EventSystem_Override.SettingChanged += Disable_EventSystem_Override_SettingChanged;
		}

		private static void Disable_EventSystem_Override_SettingChanged(object sender, EventArgs e)
		{
			bool disable_EventSystem_Override = (bool)((SettingChangedEventArgs)((e is SettingChangedEventArgs) ? e : null)).ChangedSetting.BoxedValue;
			ConfigManager.Disable_EventSystem_Override = disable_EventSystem_Override;
		}

		private static void Auto_Save_Configs_SettingChanged(object sender, EventArgs e)
		{
			bool flag = (bool)((SettingChangedEventArgs)((e is SettingChangedEventArgs) ? e : null)).ChangedSetting.BoxedValue;
			((Component)UIManager.saveButton.Component).gameObject.SetActive(!flag);
		}

		private static void LogHandler(string log, LogType logType)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected I4, but got Unknown
			switch ((int)logType)
			{
			case 3:
				LogSource.LogMessage((object)log);
				break;
			case 1:
			case 2:
				LogSource.LogWarning((object)log);
				break;
			case 0:
			case 4:
				LogSource.LogError((object)log);
				break;
			}
		}
	}
}
namespace ConfigManager.UI
{
	public class CachedConfigEntry
	{
		public InteractiveValue IValue;

		public bool UIConstructed;

		public GameObject parentContent;

		public GameObject ContentGroup;

		public RectTransform ContentRect;

		public GameObject SubContentGroup;

		public Text mainLabel;

		internal GameObject UIroot;

		internal GameObject undoButton;

		public ConfigEntryBase RefConfig { get; }

		public object EditedValue { get; internal set; }

		public Type FallbackType => RefConfig.SettingType;

		public CachedConfigEntry(ConfigEntryBase config, GameObject parent)
		{
			RefConfig = config;
			parentContent = parent;
			EditedValue = config.BoxedValue;
			CreateIValue(config.BoxedValue, FallbackType);
		}

		internal void OnSettingChanged(object sender, EventArgs e)
		{
			object value = (EditedValue = ((SettingChangedEventArgs)((e is SettingChangedEventArgs) ? e : null)).ChangedSetting.BoxedValue);
			IValue.Value = value;
			IValue.OnValueUpdated();
		}

		public void CreateIValue(object value, Type fallbackType)
		{
			ConfigDescription description = RefConfig.Description;
			if (((description != null) ? description.AcceptableValues : null) != null && ((object)RefConfig.Description.AcceptableValues).GetType().Name.StartsWith("AcceptableValueList"))
			{
				Type actualType = ReflectionExtensions.GetActualType(value);
				IValue = new InteractiveValueList(value, actualType);
			}
			else
			{
				IValue = InteractiveValue.Create(value, fallbackType);
			}
			IValue.Owner = this;
			IValue.mainContentParent = ContentGroup;
			IValue.subContentParent = SubContentGroup;
		}

		public void UpdateValue()
		{
			IValue.Value = RefConfig.BoxedValue;
			EditedValue = RefConfig.BoxedValue;
			IValue.OnValueUpdated();
			IValue.RefreshSubContentState();
		}

		public void SetValueFromIValue()
		{
			if (RefConfig.Description.AcceptableValues != null)
			{
				IValue.Value = RefConfig.Description.AcceptableValues.Clamp(IValue.Value);
			}
			object editedValue = EditedValue;
			if ((editedValue == null && IValue.Value == null) || (editedValue != null && editedValue.Equals(IValue.Value)))
			{
				return;
			}
			if (ConfigManager.Auto_Save_Configs.Value)
			{
				RefConfig.BoxedValue = IValue.Value;
				if (!RefConfig.ConfigFile.SaveOnConfigSet)
				{
					RefConfig.ConfigFile.Save();
				}
				UpdateValue();
			}
			else
			{
				EditedValue = IValue.Value;
				UIManager.OnEntryEdit(this);
				undoButton.SetActive(true);
			}
		}

		public void UndoEdits()
		{
			EditedValue = RefConfig.BoxedValue;
			IValue.Value = EditedValue;
			IValue.OnValueUpdated();
			OnSaveOrUndo();
		}

		public void RevertToDefault()
		{
			RefConfig.BoxedValue = RefConfig.DefaultValue;
			UpdateValue();
			OnSaveOrUndo();
		}

		internal void OnSaveOrUndo()
		{
			undoButton.SetActive(false);
			UIManager.OnEntrySaveOrUndo(this);
		}

		public void Enable()
		{
			if (!UIConstructed)
			{
				ConstructUI();
				UpdateValue();
			}
			UIroot.SetActive(true);
			UIroot.transform.SetAsLastSibling();
		}

		public void Disable()
		{
			if (Object.op_Implicit((Object)(object)UIroot))
			{
				UIroot.SetActive(false);
			}
		}

		public void Destroy()
		{
			if (Object.op_Implicit((Object)(object)UIroot))
			{
				Object.Destroy((Object)(object)UIroot);
			}
		}

		internal void ConstructUI()
		{
			//IL_001b: 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_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: 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_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_027d: Unknown result type (might be due to invalid IL or missing references)
			//IL_032f: Unknown result type (might be due to invalid IL or missing references)
			//IL_047a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0480: Unknown result type (might be due to invalid IL or missing references)
			//IL_0495: Unknown result type (might be due to invalid IL or missing references)
			//IL_040b: Unknown result type (might be due to invalid IL or missing references)
			UIConstructed = true;
			UIroot = UIFactory.CreateVerticalGroup(parentContent, "CacheObjectBase.MainContent", true, false, true, true, 0, default(Vector4), new Color(1f, 1f, 1f, 0f), (TextAnchor?)null);
			ContentRect = UIroot.GetComponent<RectTransform>();
			ContentRect.SetSizeWithCurrentAnchors((Axis)1, 25f);
			GameObject uIroot = UIroot;
			int? num = 25;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(uIroot, (int?)200, num, (int?)5000, num2, (int?)null, (int?)null, (bool?)null);
			ContentGroup = UIFactory.CreateVerticalGroup(UIroot, "ConfigHolder", true, false, true, true, 5, new Vector4(2f, 2f, 5f, 5f), new Color(0.12f, 0.12f, 0.12f), (TextAnchor?)null);
			GameObject val = UIFactory.CreateHorizontalGroup(ContentGroup, "ConfigEntryHolder", false, false, true, true, 5, default(Vector4), new Color(1f, 1f, 1f, 0f), (TextAnchor?)(TextAnchor)3);
			num2 = 30;
			num = 0;
			UIFactory.SetLayoutElement(val, (int?)null, num2, (int?)null, num, (int?)null, (int?)null, (bool?)null);
			mainLabel = UIFactory.CreateLabel(val, "ConfigLabel", RefConfig.Definition.Key, (TextAnchor)3, new Color(0.9f, 0.9f, 0.7f), true, 14);
			Text obj = mainLabel;
			obj.text = obj.text + " <i>(" + SignatureHighlighter.Parse(RefConfig.SettingType, false, (MemberInfo)null) + ")</i>";
			UIFactory.SetLayoutElement(((Component)mainLabel).gameObject, (int?)200, (int?)22, (int?)9999, (int?)0, (int?)null, (int?)null, (bool?)null);
			ButtonRef val2 = UIFactory.CreateButton(val, "UndoButton", "Undo", (Color?)new Color(0.3f, 0.3f, 0.3f));
			val2.OnClick = (Action)Delegate.Combine(val2.OnClick, new Action(UndoEdits));
			undoButton = ((Component)val2.Component).gameObject;
			undoButton.SetActive(false);
			UIFactory.SetLayoutElement(undoButton, (int?)80, (int?)22, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef val3 = UIFactory.CreateButton(val, "DefaultButton", "Default", (Color?)new Color(0.3f, 0.3f, 0.3f));
			val3.OnClick = (Action)Delegate.Combine(val3.OnClick, new Action(RevertToDefault));
			UIFactory.SetLayoutElement(((Component)val3.Component).gameObject, (int?)80, (int?)22, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			if (RefConfig.Description != null && !string.IsNullOrEmpty(RefConfig.Description.Description))
			{
				Text val4 = UIFactory.CreateLabel(ContentGroup, "Description", "<i>" + RefConfig.Description.Description + "</i>", (TextAnchor)3, Color.grey, true, 14);
				UIFactory.SetLayoutElement(((Component)val4).gameObject, (int?)250, (int?)18, (int?)9999, (int?)0, (int?)null, (int?)null, (bool?)null);
			}
			SubContentGroup = UIFactory.CreateVerticalGroup(ContentGroup, "CacheObjectBase.SubContent", true, false, true, true, 0, default(Vector4), new Color(1f, 1f, 1f, 0f), (TextAnchor?)null);
			GameObject subContentGroup = SubContentGroup;
			num = 30;
			num2 = 9999;
			UIFactory.SetLayoutElement(subContentGroup, (int?)125, num, (int?)9000, num2, (int?)null, (int?)null, (bool?)null);
			SubContentGroup.SetActive(false);
			if (IValue != null)
			{
				IValue.mainContentParent = ContentGroup;
				IValue.subContentParent = SubContentGroup;
			}
		}
	}
	internal class ConfigFileInfo
	{
		public ConfigFile RefConfigFile;

		public BepInPlugin Meta;

		private List<EntryInfo> entries = new List<EntryInfo>();

		internal bool isCompletelyHidden;

		internal ButtonRef listButton;

		internal GameObject contentObj;

		internal IEnumerable<GameObject> HiddenEntries => from it in Entries
			where it.IsHidden
			select it.content;

		internal List<EntryInfo> Entries
		{
			get
			{
				return entries;
			}
			set
			{
				entries = value;
			}
		}
	}
	internal class EntryInfo
	{
		public ConfigEntryBase RefEntry;

		internal GameObject content;

		public CachedConfigEntry Cached { get; }

		public bool IsHidden { get; internal set; }

		public EntryInfo(CachedConfigEntry cached)
		{
			Cached = cached;
		}
	}
	public class UIManager : PanelBase
	{
		private static readonly Dictionary<string, ConfigFileInfo> ConfigFiles = new Dictionary<string, ConfigFileInfo>();

		private static readonly Dictionary<ConfigEntryBase, CachedConfigEntry> configsToCached = new Dictionary<ConfigEntryBase, CachedConfigEntry>();

		private static ConfigFileInfo currentCategory;

		private static readonly HashSet<CachedConfigEntry> editingEntries = new HashSet<CachedConfigEntry>();

		internal static ButtonRef saveButton;

		internal static UIBase uiBase;

		internal static GameObject CategoryListContent;

		internal static GameObject ConfigEditorContent;

		private static string currentFilter;

		private static Color normalInactiveColor = new Color(0.38f, 0.34f, 0.34f);

		private static Color normalActiveColor = UnityHelpers.ToColor("c2b895");

		public static UIManager Instance { get; internal set; }

		public override string Name => "<b>BepInExConfigManager</b> <i>1.3.0</i>";

		public override int MinWidth => 750;

		public override int MinHeight => 750;

		public override Vector2 DefaultAnchorMin => new Vector2(0.2f, 0.02f);

		public override Vector2 DefaultAnchorMax => new Vector2(0.8f, 0.98f);

		public static bool ShowMenu
		{
			get
			{
				return uiBase != null && uiBase.Enabled;
			}
			set
			{
				if (uiBase != null && Object.op_Implicit((Object)(object)uiBase.RootObject) && uiBase.Enabled != value)
				{
					UniversalUI.SetUIActive("com.sinai.BepInExConfigManager", value);
					((UIModel)Instance).SetActive(value);
				}
			}
		}

		public static bool ShowHiddenConfigs { get; internal set; }

		internal static string Filter => currentFilter ?? "";

		public UIManager(UIBase owner)
			: base(owner)
		{
			Instance = this;
		}

		internal static void Init()
		{
			uiBase = UniversalUI.RegisterUI("com.sinai.BepInExConfigManager", (Action)null);
			CreateMenu();
			Canvas.ForceUpdateCanvases();
			ShowMenu = false;
			SetupCategories();
		}

		internal static void SetupCategories()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected O, but got Unknown
			ConfigFile val = (ConfigFile)AccessTools.Property(typeof(ConfigFile), "CoreConfig").GetValue(null, null);
			if (val != null)
			{
				SetupCategory(val, null, new BepInPlugin("bepinex.core.config", "BepInEx", "1.0"), isCoreConfig: true, forceAdvanced: true);
			}
			foreach (CachedConfigFile configFile in Patcher.ConfigFiles)
			{
				ProcessConfigFile(configFile);
			}
			Patcher.ConfigFileCreated = (Action<CachedConfigFile>)Delegate.Combine(Patcher.ConfigFileCreated, new Action<CachedConfigFile>(ProcessConfigFile));
		}

		private static void ProcessConfigFile(CachedConfigFile cachedConfig)
		{
			RuntimeHelper.StartCoroutine(DelayedProcess(cachedConfig));
		}

		private static IEnumerator DelayedProcess(CachedConfigFile cachedConfig)
		{
			yield return null;
			SetupCategory(cachedConfig.configFile, null, cachedConfig.metadata, isCoreConfig: false);
			cachedConfig.configFile.SettingChanged += ConfigFile_SettingChanged;
		}

		private static void ConfigFile_SettingChanged(object sender, SettingChangedEventArgs e)
		{
			try
			{
				configsToCached[(ConfigEntryBase)((sender is ConfigEntryBase) ? sender : null)].OnSettingChanged(sender, (EventArgs)(object)e);
			}
			catch (Exception ex)
			{
				ConfigManager.LogSource.LogWarning((object)ex);
			}
		}

		internal static void SetupCategory(ConfigFile configFile, object plugin, BepInPlugin meta, bool isCoreConfig, bool forceAdvanced = false)
		{
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0332: Unknown result type (might be due to invalid IL or missing references)
			//IL_0338: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				string GUID = ((meta != null) ? meta.GUID : null) ?? Path.GetFileNameWithoutExtension(configFile.ConfigFilePath);
				string text = ((meta != null) ? meta.Name : null) ?? GUID;
				BaseUnityPlugin val = (BaseUnityPlugin)((plugin is BaseUnityPlugin) ? plugin : null);
				if (!forceAdvanced && (Object)(object)val != (Object)null)
				{
					Type type = ((object)val).GetType();
					if (type.GetCustomAttributes(typeof(BrowsableAttribute), inherit: false).Cast<BrowsableAttribute>().Any((BrowsableAttribute it) => !it.Browsable))
					{
						forceAdvanced = true;
					}
				}
				ConfigFileInfo configFileInfo = new ConfigFileInfo
				{
					RefConfigFile = configFile,
					Meta = meta
				};
				ButtonRef val2 = UIFactory.CreateButton(CategoryListContent, "BUTTON_" + GUID, text, (Color?)null);
				val2.OnClick = (Action)Delegate.Combine(val2.OnClick, (Action)delegate
				{
					SetActiveCategory(GUID);
				});
				GameObject gameObject = ((Component)val2.Component).gameObject;
				int? num = 9999;
				int? num2 = 30;
				int? num3 = 0;
				UIFactory.SetLayoutElement(gameObject, (int?)null, num2, num, num3, (int?)null, (int?)null, (bool?)null);
				RuntimeHelper.SetColorBlock((Selectable)(object)val2.Component, (Color?)normalInactiveColor, (Color?)new Color(0.6f, 0.55f, 0.45f), (Color?)new Color(0.2f, 0.18f, 0.15f), (Color?)null);
				configFileInfo.listButton = val2;
				GameObject val3 = UIFactory.CreateVerticalGroup(ConfigEditorContent, "CATEGORY_" + GUID, true, false, true, true, 4, default(Vector4), new Color(0.05f, 0.05f, 0.05f), (TextAnchor?)null);
				Dictionary<string, List<ConfigEntryBase>> dictionary = new Dictionary<string, List<ConfigEntryBase>> { 
				{
					"",
					new List<ConfigEntryBase>()
				} };
				foreach (ConfigDefinition key in configFile.Keys)
				{
					string text2 = key.Section;
					if (text2 == null)
					{
						text2 = "";
					}
					if (!dictionary.ContainsKey(text2))
					{
						dictionary.Add(text2, new List<ConfigEntryBase>());
					}
					dictionary[text2].Add(configFile[key]);
				}
				foreach (KeyValuePair<string, List<ConfigEntryBase>> item in dictionary)
				{
					if (!string.IsNullOrEmpty(item.Key))
					{
						GameObject val4 = UIFactory.CreateHorizontalGroup(val3, "TitleBG", true, true, true, true, 0, default(Vector4), new Color(0.07f, 0.07f, 0.07f), (TextAnchor?)null);
						Text val5 = UIFactory.CreateLabel(val4, "Title_" + item.Key, item.Key, (TextAnchor)4, default(Color), true, 17);
						GameObject gameObject2 = ((Component)val5).gameObject;
						num3 = 30;
						UIFactory.SetLayoutElement(gameObject2, (int?)200, num3, (int?)9999, (int?)null, (int?)null, (int?)null, (bool?)null);
					}
					foreach (ConfigEntryBase item2 in item.Value)
					{
						CachedConfigEntry cachedConfigEntry = new CachedConfigEntry(item2, val3);
						cachedConfigEntry.Enable();
						configsToCached.Add(item2, cachedConfigEntry);
						GameObject uIroot = cachedConfigEntry.UIroot;
						bool flag = forceAdvanced;
						if (!flag)
						{
							ConfigDescription description = item2.Description;
							object[] array = ((description != null) ? description.Tags : null);
							if (array != null && array.Any())
							{
								if (array.Any((object it) => it is string text3 && text3 == "Advanced"))
								{
									flag = true;
								}
								else
								{
									object obj = array.FirstOrDefault((object it) => it.GetType().Name == "ConfigurationManagerAttributes");
									if (obj != null)
									{
										flag = (bool?)obj.GetType().GetField("IsAdvanced")?.GetValue(obj) == true;
									}
								}
							}
						}
						configFileInfo.Entries.Add(new EntryInfo(cachedConfigEntry)
						{
							RefEntry = item2,
							content = uIroot,
							IsHidden = flag
						});
					}
				}
				if (!configFileInfo.Entries.Any((EntryInfo it) => !it.IsHidden))
				{
					((Component)val2.Component).gameObject.SetActive(false);
					configFileInfo.isCompletelyHidden = true;
				}
				val3.SetActive(false);
				configFileInfo.contentObj = val3;
				ConfigFiles.Add(GUID, configFileInfo);
			}
			catch (Exception arg)
			{
				if (meta != null)
				{
					ConfigManager.LogSource.LogWarning((object)$"Exception setting up category '{meta.GUID}'!\r\n{arg}");
					return;
				}
				string arg2;
				try
				{
					arg2 = Path.GetFileNameWithoutExtension(configFile.ConfigFilePath);
				}
				catch
				{
					arg2 = "UNKNOWN";
				}
				ConfigManager.LogSource.LogWarning((object)$"Exception setting up category (no meta): {arg2}\n{arg}");
			}
		}

		internal static void CreateMenu()
		{
			if (Instance != null)
			{
				ConfigManager.LogSource.LogWarning((object)"An instance of ConfigurationEditor already exists, cannot create another!");
			}
			else
			{
				new UIManager(uiBase);
			}
		}

		public static void OnEntryEdit(CachedConfigEntry entry)
		{
			if (!editingEntries.Contains(entry))
			{
				editingEntries.Add(entry);
			}
			if (!((Selectable)saveButton.Component).interactable)
			{
				((Selectable)saveButton.Component).interactable = true;
			}
		}

		public static void OnEntrySaveOrUndo(CachedConfigEntry entry)
		{
			if (editingEntries.Contains(entry))
			{
				editingEntries.Remove(entry);
			}
			if (!editingEntries.Any())
			{
				((Selectable)saveButton.Component).interactable = false;
			}
		}

		public static void SavePreferences()
		{
			foreach (ConfigFileInfo value in ConfigFiles.Values)
			{
				foreach (EntryInfo entry in value.Entries)
				{
					entry.RefEntry.BoxedValue = entry.Cached.EditedValue;
				}
				ConfigFile refConfigFile = value.RefConfigFile;
				if (!refConfigFile.SaveOnConfigSet)
				{
					refConfigFile.Save();
				}
			}
			for (int num = editingEntries.Count - 1; num >= 0; num--)
			{
				editingEntries.ElementAt(num).OnSaveOrUndo();
			}
			editingEntries.Clear();
			((Selectable)saveButton.Component).interactable = false;
		}

		public static void SetHiddenConfigVisibility(bool show)
		{
			if (ShowHiddenConfigs == show)
			{
				return;
			}
			ShowHiddenConfigs = show;
			foreach (KeyValuePair<string, ConfigFileInfo> configFile in ConfigFiles)
			{
				ConfigFileInfo value = configFile.Value;
				if (value.isCompletelyHidden)
				{
					((Component)value.listButton.Component).gameObject.SetActive(ShowHiddenConfigs);
				}
			}
			if (currentCategory != null && !ShowHiddenConfigs && currentCategory.isCompletelyHidden)
			{
				UnsetActiveCategory();
			}
			RefreshFilter();
		}

		public static void FilterConfigs(string search)
		{
			currentFilter = search.ToLower();
			RefreshFilter();
		}

		internal static void RefreshFilter()
		{
			if (currentCategory == null)
			{
				return;
			}
			using List<EntryInfo>.Enumerator enumerator = currentCategory.Entries.GetEnumerator();
			EntryInfo current;
			int num;
			bool active;
			for (; enumerator.MoveNext(); active = (byte)num != 0, current.content.SetActive(active))
			{
				current = enumerator.Current;
				if (!string.IsNullOrEmpty(currentFilter) && !current.RefEntry.Definition.Key.ToLower().Contains(currentFilter))
				{
					ConfigDescription description = current.RefEntry.Description;
					if (!((description == null) ? null : description.Description?.Contains(currentFilter)).GetValueOrDefault())
					{
						num = 0;
						continue;
					}
				}
				num = ((!current.IsHidden || ShowHiddenConfigs) ? 1 : 0);
			}
		}

		public static void SetActiveCategory(string categoryIdentifier)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			if (ConfigFiles.ContainsKey(categoryIdentifier))
			{
				UnsetActiveCategory();
				ConfigFileInfo configFileInfo = (currentCategory = ConfigFiles[categoryIdentifier]);
				GameObject contentObj = configFileInfo.contentObj;
				contentObj.SetActive(true);
				ButtonRef listButton = configFileInfo.listButton;
				RuntimeHelper.SetColorBlock((Selectable)(object)listButton.Component, (Color?)normalActiveColor, (Color?)null, (Color?)null, (Color?)null);
				RefreshFilter();
			}
		}

		internal static void UnsetActiveCategory()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			if (currentCategory != null)
			{
				RuntimeHelper.SetColorBlock((Selectable)(object)currentCategory.listButton.Component, (Color?)normalInactiveColor, (Color?)null, (Color?)null, (Color?)null);
				currentCategory.contentObj.SetActive(false);
				currentCategory = null;
			}
		}

		protected override void ConstructPanelContent()
		{
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(((PanelBase)this).ContentRoot, (bool?)true, (bool?)false, (bool?)true, (bool?)true, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			ConstructTitleBar();
			ConstructSaveButton();
			ConstructToolbar();
			ConstructEditorViewport();
		}

		protected override void OnClosePanelClicked()
		{
			((PanelBase)this).OnClosePanelClicked();
			ShowMenu = false;
		}

		private void ConstructTitleBar()
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: 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_0093: Unknown result type (might be due to invalid IL or missing references)
			Text component = ((Component)((PanelBase)this).TitleBar.transform.GetChild(0)).GetComponent<Text>();
			component.text = "<b><color=#8b736b>BepInExConfigManager</color></b> <i><color=#ffe690>v1.3.0</color></i>";
			Button componentInChildren = ((PanelBase)this).TitleBar.GetComponentInChildren<Button>();
			RuntimeHelper.SetColorBlock((Selectable)(object)componentInChildren, (Color?)new Color(1f, 0.2f, 0.2f), (Color?)new Color(1f, 0.6f, 0.6f), (Color?)new Color(0.3f, 0.1f, 0.1f), (Color?)null);
			Text componentInChildren2 = ((Component)componentInChildren).GetComponentInChildren<Text>();
			((Graphic)componentInChildren2).color = Color.white;
			componentInChildren2.resizeTextForBestFit = true;
			componentInChildren2.resizeTextMinSize = 8;
			componentInChildren2.resizeTextMaxSize = 14;
		}

		private void ConstructSaveButton()
		{
			//IL_00c0: 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_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			saveButton = UIFactory.CreateButton(((PanelBase)this).ContentRoot, "SaveButton", "Save Preferences", (Color?)null);
			ButtonRef obj = saveButton;
			obj.OnClick = (Action)Delegate.Combine(obj.OnClick, new Action(SavePreferences));
			GameObject gameObject = ((Component)saveButton.Component).gameObject;
			int? num = 35;
			int? num2 = 0;
			int? num3 = 9999;
			UIFactory.SetLayoutElement(gameObject, (int?)null, num, num3, num2, (int?)null, (int?)null, (bool?)null);
			RuntimeHelper.SetColorBlock((Selectable)(object)saveButton.Component, (Color?)new Color(0.1f, 0.3f, 0.1f), (Color?)new Color(0.2f, 0.5f, 0.2f), (Color?)new Color(0.1f, 0.2f, 0.1f), (Color?)new Color(0.2f, 0.2f, 0.2f));
			((Selectable)saveButton.Component).interactable = false;
			((Component)saveButton.Component).gameObject.SetActive(!ConfigManager.Auto_Save_Configs.Value);
		}

		private void ConstructToolbar()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			GameObject val2 = UIFactory.CreateHorizontalGroup(((PanelBase)this).ContentRoot, "Toolbar", false, false, true, true, 4, new Vector4(3f, 3f, 3f, 3f), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
			Toggle val3 = default(Toggle);
			Text val4 = default(Text);
			GameObject val5 = UIFactory.CreateToggle(val2, "HiddenConfigsToggle", ref val3, ref val4, default(Color), 20, 20);
			val3.isOn = false;
			((UnityEvent<bool>)(object)val3.onValueChanged).AddListener((UnityAction<bool>)delegate(bool val)
			{
				SetHiddenConfigVisibility(val);
			});
			val4.text = "Show Advanced Settings";
			int? num = 280;
			int? num2 = 25;
			int? num3 = 0;
			UIFactory.SetLayoutElement(val5, num, num2, (int?)0, num3, (int?)null, (int?)null, (bool?)null);
			InputFieldRef val6 = UIFactory.CreateInputField(val2, "FilterInput", "Search...");
			GameObject gameObject = ((Component)val6.Component).gameObject;
			num3 = 9999;
			int? num4 = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)null, num4, num3, (int?)null, (int?)null, (int?)null, (bool?)null);
			val6.OnValueChanged += FilterConfigs;
		}

		private void ConstructEditorViewport()
		{
			//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_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIFactory.CreateHorizontalGroup(((PanelBase)this).ContentRoot, "Main", true, true, true, true, 2, default(Vector4), new Color(0.08f, 0.08f, 0.08f), (TextAnchor?)null);
			GameObject val2 = default(GameObject);
			AutoSliderScrollbar val3 = default(AutoSliderScrollbar);
			GameObject val4 = UIFactory.CreateScrollView(val, "CategoryList", ref val2, ref val3, new Color(0.1f, 0.1f, 0.1f));
			int? num = 300;
			int? num2 = 0;
			UIFactory.SetLayoutElement(val4, num, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			CategoryListContent = val2;
			GameObject obj = val2;
			num2 = 3;
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(obj, (bool?)null, (bool?)null, (bool?)null, (bool?)null, num2, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			GameObject configEditorContent = default(GameObject);
			GameObject val5 = UIFactory.CreateScrollView(val, "ConfigEditor", ref configEditorContent, ref val3, new Color(0.05f, 0.05f, 0.05f));
			num2 = 9999;
			UIFactory.SetLayoutElement(val5, (int?)null, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			ConfigEditorContent = configEditorContent;
		}
	}
}
namespace ConfigManager.UI.InteractiveValues
{
	public class InteractiveBool : InteractiveValue
	{
		internal Toggle toggle;

		private Text labelText;

		public InteractiveBool(object value, Type valueType)
			: base(value, valueType)
		{
		}

		public override bool SupportsType(Type type)
		{
			return (object)type == typeof(bool);
		}

		public override void RefreshUIForValue()
		{
			bool flag = (bool)Value;
			if (!((Component)toggle).gameObject.activeSelf)
			{
				((Component)toggle).gameObject.SetActive(true);
			}
			if (flag != toggle.isOn)
			{
				toggle.isOn = flag;
			}
			string arg = (flag ? "6bc981" : "c96b6b");
			labelText.text = $"<color=#{arg}>{flag}</color>";
		}

		internal void OnToggleValueChanged(bool val)
		{
			Value = val;
			RefreshUIForValue();
			Owner.SetValueFromIValue();
		}

		public override void ConstructUI(GameObject parent)
		{
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			base.ConstructUI(parent);
			bool flag = false;
			Text val2 = default(Text);
			while (!flag)
			{
				GameObject val = null;
				try
				{
					val = UIFactory.CreateToggle(mainContent, "InteractiveBoolToggle", ref toggle, ref val2, new Color(0.1f, 0.1f, 0.1f), 20, 20);
					UIFactory.SetLayoutElement(val, (int?)24, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
					((UnityEvent<bool>)(object)toggle.onValueChanged).AddListener((UnityAction<bool>)OnToggleValueChanged);
					flag = true;
				}
				catch
				{
					if (Object.op_Implicit((Object)(object)val))
					{
						Object.Destroy((Object)(object)val);
					}
				}
			}
			labelText = UIFactory.CreateLabel(mainContent, "TrueFalseLabel", "False", (TextAnchor)3, default(Color), true, 14);
			UIFactory.SetLayoutElement(((Component)labelText).gameObject, (int?)60, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			RefreshUIForValue();
		}
	}
	public class InteractiveColor : InteractiveValue
	{
		private Image colorImage;

		private readonly InputField[] inputs = (InputField[])(object)new InputField[4];

		private readonly Slider[] sliders = (Slider[])(object)new Slider[4];

		private static readonly string[] fieldNames = new string[4] { "R", "G", "B", "A" };

		public InteractiveColor(object value, Type valueType)
			: base(value, valueType)
		{
		}

		public override bool SupportsType(Type type)
		{
			return (object)type == typeof(Color) || (object)type == typeof(Color32);
		}

		public override void RefreshUIForValue()
		{
			base.RefreshUIForValue();
			RefreshColorUI();
		}

		private void RefreshColorUI()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			if (Value is Color32 val)
			{
				inputs[0].text = val.r.ToString();
				inputs[1].text = val.g.ToString();
				inputs[2].text = val.b.ToString();
				inputs[3].text = val.a.ToString();
				if (Object.op_Implicit((Object)(object)colorImage))
				{
					((Graphic)colorImage).color = Color32.op_Implicit(val);
				}
				return;
			}
			object value = Value;
			if (!(value is Color))
			{
				return;
			}
			Color color = (Color)value;
			if (true)
			{
				inputs[0].text = color.r.ToString();
				inputs[1].text = color.g.ToString();
				inputs[2].text = color.b.ToString();
				inputs[3].text = color.a.ToString();
				if (Object.op_Implicit((Object)(object)colorImage))
				{
					((Graphic)colorImage).color = color;
				}
			}
		}

		protected internal override void OnToggleSubcontent(bool toggle)
		{
			base.OnToggleSubcontent(toggle);
			RefreshColorUI();
		}

		public override void ConstructUI(GameObject parent)
		{
			//IL_001b: 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_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_00e3: 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_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			base.ConstructUI(parent);
			GameObject val = UIFactory.CreateHorizontalGroup(mainContent, "ColorEditor", false, false, true, true, 5, default(Vector4), new Color(1f, 1f, 1f, 0f), (TextAnchor?)(TextAnchor)3);
			GameObject val2 = UIFactory.CreateVerticalGroup(val, "ImgHolder", true, true, true, true, 0, new Vector4(1f, 1f, 1f, 1f), new Color(0.08f, 0.08f, 0.08f), (TextAnchor?)null);
			UIFactory.SetLayoutElement(val2, (int?)50, (int?)25, (int?)999, (int?)0, (int?)null, (int?)null, (bool?)null);
			GameObject val3 = UIFactory.CreateUIObject("ColorImageHelper", val2, new Vector2(100f, 25f));
			colorImage = val3.AddComponent<Image>();
			((Graphic)colorImage).color = (Color)((Value is Color) ? ((Color)Value) : Color32.op_Implicit((Color32)Value));
			GameObject val4 = UIFactory.CreateVerticalGroup(val, "EditorsGroup", false, false, true, true, 3, new Vector4(3f, 3f, 3f, 3f), new Color(1f, 1f, 1f, 0f), (TextAnchor?)null);
			GameObject val5 = UIFactory.CreateGridGroup(val4, "Grid", new Vector2(140f, 25f), new Vector2(2f, 2f), new Color(1f, 1f, 1f, 0f));
			UIFactory.SetLayoutElement(val5, (int?)580, (int?)25, (int?)900, (int?)null, (int?)null, (int?)null, (bool?)null);
			for (int i = 0; i < 4; i++)
			{
				AddEditorRow(i, val5);
			}
			RefreshUIForValue();
		}

		internal void AddEditorRow(int index, GameObject groupObj)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIFactory.CreateHorizontalGroup(groupObj, "EditorRow_" + fieldNames[index], false, true, true, true, 5, default(Vector4), new Color(1f, 1f, 1f, 0f), (TextAnchor?)null);
			Text val2 = UIFactory.CreateLabel(val, "RowLabel", fieldNames[index] + ":", (TextAnchor)5, Color.cyan, true, 14);
			GameObject gameObject = ((Component)val2).gameObject;
			int? num = 17;
			int? num2 = 0;
			UIFactory.SetLayoutElement(gameObject, num, (int?)25, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			InputFieldRef inputField = UIFactory.CreateInputField(val, "InputField", "...");
			UIFactory.SetLayoutElement(((Component)inputField.Component).gameObject, (int?)40, (int?)25, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			inputs[index] = inputField.Component;
			inputField.Component.characterValidation = (CharacterValidation)((!(Value is Color)) ? 1 : 2);
			inputField.OnValueChanged += delegate(string value)
			{
				if (Value is Color)
				{
					float num3 = float.Parse(value);
					SetValueToColor(num3);
					sliders[index].value = num3;
				}
				else
				{
					byte b = byte.Parse(value);
					SetValueToColor32(b);
					sliders[index].value = (int)b;
				}
			};
			Slider val3 = default(Slider);
			GameObject val4 = UIFactory.CreateSlider(val, "Slider", ref val3);
			sliders[index] = val3;
			num2 = 25;
			UIFactory.SetLayoutElement(val4, (int?)70, num2, (int?)999, (int?)0, (int?)null, (int?)null, (bool?)null);
			val3.minValue = 0f;
			if (Value is Color)
			{
				val3.maxValue = 1f;
				val3.value = GetValueFromColor();
			}
			else
			{
				val3.maxValue = 255f;
				val3.value = (int)GetValueFromColor32();
			}
			((UnityEvent<float>)(object)val3.onValueChanged).AddListener((UnityAction<float>)delegate(float value)
			{
				try
				{
					if (Value is Color32)
					{
						string text = ((byte)value).ToString();
						inputField.Text = text;
						SetValueToColor32((byte)value);
						inputs[index].text = text;
					}
					else
					{
						inputField.Text = value.ToString();
						SetValueToColor(value);
						inputs[index].text = value.ToString();
					}
				}
				catch (Exception ex)
				{
					ConfigManager.LogSource.LogMessage((object)ex.ToString());
				}
			});
			float GetValueFromColor()
			{
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0047: 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)
				Color val6 = (Color)Value;
				if (1 == 0)
				{
				}
				float result2 = index switch
				{
					0 => val6.r, 
					1 => val6.g, 
					2 => val6.b, 
					3 => val6.a, 
					_ => throw new NotImplementedException(), 
				};
				if (1 == 0)
				{
				}
				return result2;
			}
			byte GetValueFromColor32()
			{
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0047: 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)
				Color32 val5 = (Color32)Value;
				if (1 == 0)
				{
				}
				byte result = index switch
				{
					0 => val5.r, 
					1 => val5.g, 
					2 => val5.b, 
					3 => val5.a, 
					_ => throw new NotImplementedException(), 
				};
				if (1 == 0)
				{
				}
				return result;
			}
			void SetValueToColor(float floatValue)
			{
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0061: 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)
				Color val8 = (Color)Value;
				switch (index)
				{
				case 0:
					val8.r = floatValue;
					break;
				case 1:
					val8.g = floatValue;
					break;
				case 2:
					val8.b = floatValue;
					break;
				case 3:
					val8.a = floatValue;
					break;
				}
				Value = val8;
				((Graphic)colorImage).color = val8;
				Owner.SetValueFromIValue();
			}
			void SetValueToColor32(byte byteValue)
			{
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0061: 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_0078: Unknown result type (might be due to invalid IL or missing references)
				Color32 val7 = (Color32)Value;
				switch (index)
				{
				case 0:
					val7.r = byteValue;
					break;
				case 1:
					val7.g = byteValue;
					break;
				case 2:
					val7.b = byteValue;
					break;
				case 3:
					val7.a = byteValue;
					break;
				}
				Value = val7;
				((Graphic)colorImage).color = Color32.op_Implicit(val7);
				Owner.SetValueFromIValue();
			}
		}
	}
	public class InteractiveEnum : InteractiveValue
	{
		internal static Dictionary<Type, KeyValuePair<long, string>[]> enumNamesCache = new Dictionary<Type, KeyValuePair<long, string>[]>();

		internal KeyValuePair<long, string>[] values = new KeyValuePair<long, string>[0];

		internal Dictionary<string, OptionData> dropdownOptions = new Dictionary<string, OptionData>();

		internal Dropdown dropdown;

		public InteractiveEnum(object value, Type valueType)
			: base(value, valueType)
		{
			if (value != null)
			{
				GetNames();
			}
		}

		public override bool SupportsType(Type type)
		{
			return type.IsEnum;
		}

		internal void GetNames()
		{
			Type type = Value?.GetType() ?? FallbackType;
			if (!enumNamesCache.ContainsKey(type))
			{
				Array array = Enum.GetValues(type);
				List<KeyValuePair<long, string>> list = new List<KeyValuePair<long, string>>();
				HashSet<string> hashSet = new HashSet<string>();
				foreach (object item in array)
				{
					string text = item.ToString();
					if (!hashSet.Contains(text))
					{
						hashSet.Add(text);
						Type underlyingType = Enum.GetUnderlyingType(type);
						long key;
						try
						{
							object value = Convert.ChangeType(item, underlyingType);
							key = (long)Convert.ChangeType(value, typeof(long));
						}
						catch (Exception ex)
						{
							ConfigManager.LogSource.LogWarning((object)("[InteractiveEnum] Could not Unbox underlying type " + underlyingType.Name + " from " + type.FullName));
							ConfigManager.LogSource.LogMessage((object)ex.ToString());
							continue;
						}
						list.Add(new KeyValuePair<long, string>(key, text));
					}
				}
				enumNamesCache.Add(type, list.ToArray());
			}
			values = enumNamesCache[type];
		}

		public override void OnValueUpdated()
		{
			GetNames();
			base.OnValueUpdated();
		}

		public override void RefreshUIForValue()
		{
			base.RefreshUIForValue();
			if (!(this is InteractiveFlags))
			{
				string key = Value.ToString();
				if (dropdownOptions.ContainsKey(key))
				{
					dropdown.value = dropdown.options.IndexOf(dropdownOptions[key]);
				}
			}
		}

		private void SetValueFromDropdown()
		{
			Type type = Value?.GetType() ?? FallbackType;
			int value = dropdown.value;
			object obj = Enum.Parse(type, enumNamesCache[type][value].Value);
			if (obj != null)
			{
				Value = obj;
				Owner.SetValueFromIValue();
				RefreshUIForValue();
			}
		}

		public override void ConstructUI(GameObject parent)
		{
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Expected O, but got Unknown
			base.ConstructUI(parent);
			if (!(this is InteractiveFlags))
			{
				GameObject val2 = UIFactory.CreateDropdown(mainContent, "InteractiveDropdown", ref dropdown, "", 14, (Action<int>)null, (string[])null);
				UIFactory.SetLayoutElement(val2, (int?)400, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
				((UnityEvent<int>)(object)dropdown.onValueChanged).AddListener((UnityAction<int>)delegate
				{
					SetValueFromDropdown();
				});
				KeyValuePair<long, string>[] array = values;
				for (int i = 0; i < array.Length; i++)
				{
					KeyValuePair<long, string> keyValuePair = array[i];
					OptionData val3 = new OptionData
					{
						text = keyValuePair.Value
					};
					dropdown.options.Add(val3);
					dropdownOptions.Add(keyValuePair.Value, val3);
				}
			}
		}
	}
	public class InteractiveFlags : InteractiveEnum
	{
		internal bool[] enabledFlags;

		internal Toggle[] toggles;

		private bool refreshingToggleStates;

		public override bool HasSubContent => true;

		public override bool SubContentWanted => true;

		public InteractiveFlags(object value, Type valueType)
			: base(value, valueType)
		{
			toggles = (Toggle[])(object)new Toggle[values.Length];
			enabledFlags = new bool[values.Length];
		}

		public override bool SupportsType(Type type)
		{
			return type.IsEnum && type.GetCustomAttributes(inherit: true).Any((object it) => it is FlagsAttribute);
		}

		public override void OnValueUpdated()
		{
			List<string> list = new List<string>();
			IEnumerable<string> enumerable = (from it in Value?.ToString().Split(new char[1] { ',' })
				select it.Trim());
			if (enumerable != null)
			{
				list.AddRange(enumerable);
			}
			for (int i = 0; i < values.Length; i++)
			{
				enabledFlags[i] = list.Contains(values[i].Value);
			}
			base.OnValueUpdated();
		}

		public override void RefreshUIForValue()
		{
			base.RefreshUIForValue();
			if (!subContentConstructed)
			{
				return;
			}
			refreshingToggleStates = true;
			for (int i = 0; i < values.Length; i++)
			{
				Toggle val = toggles[i];
				if (val.isOn != enabledFlags[i])
				{
					val.isOn = enabledFlags[i];
				}
			}
			refreshingToggleStates = false;
		}

		private void SetValueFromToggles()
		{
			string text = "";
			for (int i = 0; i < values.Length; i++)
			{
				if (enabledFlags[i])
				{
					if (text != "")
					{
						text += ", ";
					}
					text += values[i].Value;
				}
			}
			if (!string.IsNullOrEmpty(text))
			{
				Type enumType = Value?.GetType() ?? FallbackType;
				Value = Enum.Parse(enumType, text);
				RefreshUIForValue();
				Owner.SetValueFromIValue();
			}
		}

		protected internal override void OnToggleSubcontent(bool toggle)
		{
			base.OnToggleSubcontent(toggle);
			RefreshUIForValue();
		}

		public override void ConstructUI(GameObject parent)
		{
			base.ConstructUI(parent);
		}

		public override void ConstructSubcontent()
		{
			//IL_002c: 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)
			subContentConstructed = true;
			GameObject groupObj = UIFactory.CreateVerticalGroup(subContentParent, "InteractiveFlagsContent", false, true, true, true, 5, new Vector4(3f, 3f, 3f, 3f), new Color(1f, 1f, 1f, 0f), (TextAnchor?)null);
			for (int i = 0; i < values.Length; i++)
			{
				AddToggle(i, groupObj);
			}
		}

		internal void AddToggle(int index, GameObject groupObj)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			KeyValuePair<long, string> keyValuePair = values[index];
			Toggle val2 = default(Toggle);
			Text val3 = default(Text);
			GameObject val4 = UIFactory.CreateToggle(groupObj, "FlagToggle", ref val2, ref val3, new Color(0.1f, 0.1f, 0.1f), 20, 20);
			int? num = 100;
			int? num2 = 2000;
			UIFactory.SetLayoutElement(val4, num, (int?)25, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			toggles[index] = val2;
			((UnityEvent<bool>)(object)val2.onValueChanged).AddListener((UnityAction<bool>)delegate(bool val)
			{
				if (!refreshingToggleStates)
				{
					enabledFlags[index] = val;
					SetValueFromToggles();
					RefreshUIForValue();
				}
			});
			val3.text = keyValuePair.Value;
		}
	}
	public class InteractiveFloatStruct : InteractiveValue
	{
		public class StructInfo
		{
			private readonly FieldInfo[] fields;

			public string[] FieldNames { get; }

			public StructInfo(Type type)
			{
				fields = (from it in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
					where !it.IsLiteral
					select it).ToArray();
				FieldNames = fields.Select((FieldInfo it) => it.Name).ToArray();
			}

			public object SetValue(ref object instance, int fieldIndex, float val)
			{
				fields[fieldIndex].SetValue(instance, val);
				return instance;
			}

			public float GetValue(object instance, int fieldIndex)
			{
				return (float)fields[fieldIndex].GetValue(instance);
			}

			public void RefreshUI(InputField[] inputs, object instance)
			{
				try
				{
					for (int i = 0; i < fields.Length; i++)
					{
						FieldInfo fieldInfo = fields[i];
						float num = (float)fieldInfo.GetValue(instance);
						inputs[i].text = num.ToString();
					}
				}
				catch (Exception ex)
				{
					ConfigManager.LogSource.LogMessage((object)ex);
				}
			}
		}

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

		public StructInfo structInfo;

		internal Type lastStructType;

		internal InputField[] inputs;

		public static bool IsTypeSupported(Type type)
		{
			if (!type.IsValueType)
			{
				return false;
			}
			if (_typeSupportCache.TryGetValue(type.AssemblyQualifiedName, out var value))
			{
				return value;
			}
			value = true;
			FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			FieldInfo[] array = fields;
			foreach (FieldInfo fieldInfo in array)
			{
				if (!fieldInfo.IsLiteral && !typeof(float).IsAssignableFrom(fieldInfo.FieldType))
				{
					value = false;
					break;
				}
			}
			_typeSupportCache.Add(type.AssemblyQualifiedName, value);
			return value;
		}

		public InteractiveFloatStruct(object value, Type valueType)
			: base(value, valueType)
		{
		}

		public override bool SupportsType(Type type)
		{
			return IsTypeSupported(type);
		}

		public override void RefreshUIForValue()
		{
			InitializeStructInfo();
			base.RefreshUIForValue();
			structInfo.RefreshUI(inputs, Value);
		}

		internal void InitializeStructInfo()
		{
			Type type = Value?.GetType() ?? FallbackType;
			if (structInfo == null || (object)type != lastStructType)
			{
				lastStructType = type;
				structInfo = new StructInfo(type);
			}
		}

		public override void ConstructUI(GameObject parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				InitializeStructInfo();
				base.ConstructUI(parent);
				GameObject val = UIFactory.CreateGridGroup(mainContent, "EditorContent", new Vector2(150f, 25f), new Vector2(5f, 5f), new Color(1f, 1f, 1f, 0f));
				int? num = 300;
				int? num2 = 9999;
				UIFactory.SetLayoutElement(val, num, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
				inputs = (InputField[])(object)new InputField[structInfo.FieldNames.Length];
				for (int i = 0; i < structInfo.FieldNames.Length; i++)
				{
					AddEditorRow(i, val);
				}
				RefreshUIForValue();
			}
			catch (Exception ex)
			{
				ConfigManager.LogSource.LogMessage((object)ex);
			}
		}

		internal void AddEditorRow(int index, GameObject groupObj)
		{
			//IL_0023: 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_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				GameObject val2 = UIFactory.CreateHorizontalGroup(groupObj, "EditorRow", false, true, true, true, 5, default(Vector4), new Color(1f, 1f, 1f, 0f), (TextAnchor?)null);
				string text = structInfo.FieldNames[index];
				if (text.StartsWith("m_"))
				{
					text = text.Substring(2, text.Length - 2);
				}
				if (text.Length > 1)
				{
					text = text.Substring(0, 1);
				}
				Text val3 = UIFactory.CreateLabel(val2, "RowLabel", text + ":", (TextAnchor)5, Color.cyan, true, 14);
				GameObject gameObject = ((Component)val3).gameObject;
				int? num = 30;
				int? num2 = 0;
				UIFactory.SetLayoutElement(gameObject, num, (int?)25, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
				InputFieldRef val4 = UIFactory.CreateInputField(val2, "InputField", "...");
				UIFactory.SetLayoutElement(((Component)val4.Component).gameObject, (int?)120, (int?)25, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
				inputs[index] = val4.Component;
				val4.OnValueChanged += delegate(string val)
				{
					try
					{
						float val5 = float.Parse(val);
						Value = structInfo.SetValue(ref Value, index, val5);
						Owner.SetValueFromIValue();
					}
					catch
					{
					}
				};
			}
			catch (Exception ex)
			{
				ConfigManager.LogSource.LogMessage((object)ex);
			}
		}
	}
	public class InteractiveKeycode : InteractiveValue
	{
		internal Text labelText;

		internal ButtonRef rebindButton;

		internal ButtonRef confirmButton;

		internal ButtonRef cancelButton;

		private readonly bool isInputSystem;

		public InteractiveKeycode(object value, Type valueType)
			: base(value, valueType)
		{
			isInputSystem = !(value is KeyCode);
		}

		public override bool SupportsType(Type type)
		{
			return (object)type == typeof(KeyCode) || type.FullName == "UnityEngine.InputSystem.Key";
		}

		public override void RefreshUIForValue()
		{
			base.RefreshUIForValue();
			labelText.text = Value.ToString();
		}

		public override void OnValueUpdated()
		{
			base.OnValueUpdated();
		}

		public void BeginRebind()
		{
			((Component)rebindButton.Component).gameObject.SetActive(false);
			((Component)confirmButton.Component).gameObject.SetActive(true);
			((Selectable)confirmButton.Component).interactable = false;
			((Component)cancelButton.Component).gameObject.SetActive(true);
			labelText.text = "<i>Press a key...</i>";
			InputManager.BeginRebind((Action<KeyCode>)OnRebindKeyPressed, (Action<KeyCode?>)OnKeycodeConfirmed);
		}

		private void OnRebindKeyPressed(KeyCode kc)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			if (!isInputSystem)
			{
				labelText.text = "<i>" + ((object)(KeyCode)(ref kc)).ToString() + "</i>";
			}
			else
			{
				object obj = InputSystem.KeyCodeToKeyEnum(kc);
				labelText.text = "<i>" + obj.ToString() + "</i>";
			}
			((Selectable)confirmButton.Component).interactable = true;
		}

		private void OnKeycodeConfirmed(KeyCode? kc)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			if (kc.HasValue)
			{
				if (!isInputSystem)
				{
					Value = kc;
				}
				else
				{
					Value = InputSystem.KeyCodeToKeyEnum(kc.Value);
				}
			}
			Owner.SetValueFromIValue();
			RefreshUIForValue();
		}

		public void ConfirmEndRebind()
		{
			InputManager.EndRebind();
			OnRebindEnd();
		}

		public void CancelEndRebind()
		{
			InputManager.LastRebindKey = null;
			InputManager.EndRebind();
			OnRebindEnd();
		}

		internal void OnRebindEnd()
		{
			((Component)rebindButton.Component).gameObject.SetActive(true);
			((Component)confirmButton.Component).gameObject.SetActive(false);
			((Component)cancelButton.Component).gameObject.SetActive(false);
		}

		public override void ConstructUI(GameObject parent)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_021f: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			base.ConstructUI(parent);
			labelText = UIFactory.CreateLabel(mainContent, "Label", Value?.ToString() ?? "<notset>", (TextAnchor)3, default(Color), true, 14);
			UIFactory.SetLayoutElement(((Component)labelText).gameObject, (int?)150, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			rebindButton = UIFactory.CreateButton(mainContent, "RebindButton", "Rebind", (Color?)null);
			ButtonRef obj = rebindButton;
			obj.OnClick = (Action)Delegate.Combine(obj.OnClick, new Action(BeginRebind));
			GameObject gameObject = ((Component)rebindButton.Component).gameObject;
			int? num = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)100, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			confirmButton = UIFactory.CreateButton(mainContent, "ConfirmButton", "Confirm", (Color?)new Color(0.1f, 0.4f, 0.1f));
			ButtonRef obj2 = confirmButton;
			obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, new Action(ConfirmEndRebind));
			GameObject gameObject2 = ((Component)confirmButton.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)100, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Component)confirmButton.Component).gameObject.SetActive(false);
			Button component = confirmButton.Component;
			Color? val = new Color(0.3f, 0.3f, 0.3f);
			RuntimeHelper.SetColorBlock((Selectable)(object)component, (Color?)null, (Color?)null, (Color?)null, val);
			cancelButton = UIFactory.CreateButton(mainContent, "EndButton", "Cancel", (Color?)new Color(0.4f, 0.1f, 0.1f));
			ButtonRef obj3 = cancelButton;
			obj3.OnClick = (Action)Delegate.Combine(obj3.OnClick, new Action(CancelEndRebind));
			GameObject gameObject3 = ((Component)cancelButton.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject3, (int?)100, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Component)cancelButton.Component).gameObject.SetActive(false);
		}
	}
	public class InteractiveNumber : InteractiveValue
	{
		internal InputFieldRef valueInput;

		private Slider slider;

		private MethodInfo parseMethod;

		public MethodInfo ParseMethod => parseMethod ?? (parseMethod = Value.GetType().GetMethod("Parse", new Type[1] { typeof(string) }));

		public InteractiveNumber(object value, Type valueType)
			: base(value, valueType)
		{
		}

		public override bool SupportsType(Type type)
		{
			return (type.IsPrimitive && (object)type != typeof(bool)) || (object)type == typeof(decimal);
		}

		public override void RefreshUIForValue()
		{
			valueInput.Text = Value.ToString();
			if (!((Component)valueInput.Component).gameObject.activeSelf)
			{
				((Component)valueInput.Component).gameObject.SetActive(true);
			}
			if (Object.op_Implicit((Object)(object)slider))
			{
				slider.value = (float)Convert.ChangeType(Value, typeof(float));
			}
		}

		internal void SetValueFromInput()
		{
			//IL_00a8: 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)
			try
			{
				Value = ParseMethod.Invoke(null, new object[1] { valueInput.Text });
				ConfigDescription description = Owner.RefConfig.Description;
				AcceptableValueBase val = ((description != null) ? description.AcceptableValues : null);
				if (val != null && !val.IsValid(Value))
				{
					throw new Exception();
				}
				Owner.SetValueFromIValue();
				RefreshUIForValue();
				((Graphic)valueInput.Component.textComponent).color = Color.white;
			}
			catch
			{
				((Graphic)valueInput.Component.textComponent).color = Color.red;
			}
		}

		public override void ConstructUI(GameObject parent)
		{
			base.ConstructUI(parent);
			valueInput = UIFactory.CreateInputField(mainContent, "InteractiveNumberInput", "...");
			UIFactory.SetLayoutElement(((Component)valueInput.Component).gameObject, (int?)120, (int?)25, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Component)valueInput.Component).gameObject.SetActive(false);
			valueInput.OnValueChanged += delegate
			{
				SetValueFromInput();
			};
			AcceptableValueBase acceptableValues = Owner.RefConfig.Description.AcceptableValues;
			if (acceptableValues != null)
			{
				Type type = typeof(AcceptableValueRange<>).MakeGenericType(acceptableValues.ValueType);
				object value = AccessTools.Property(type, "MinValue").GetValue(acceptableValues, null);
				object value2 = AccessTools.Property(type, "MaxValue").GetValue(acceptableValues, null);
				Text mainLabel = Owner.mainLabel;
				mainLabel.text = mainLabel.text + " <color=grey><i>[" + value.ToString() + " - " + value2.ToString() + "]</i></color>";
				GameObject val2 = UIFactory.CreateSlider(mainContent, "ValueSlider", ref slider);
				UIFactory.SetLayoutElement(val2, (int?)250, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
				slider.minValue = (float)Convert.ChangeType(value, typeof(float));
				slider.maxValue = (float)Convert.ChangeType(value2, typeof(float));
				slider.value = (float)Convert.ChangeType(Value, typeof(float));
				((UnityEvent<float>)(object)slider.onValueChanged).AddListener((UnityAction<float>)delegate(float val)
				{
					Value = Convert.ChangeType(val, FallbackType);
					Owner.SetValueFromIValue();
					valueInput.Text = Value.ToString();
				});
			}
		}
	}
	public class InteractiveString : InteractiveValue
	{
		internal InputFieldRef valueInput;

		internal GameObject hiddenObj;

		internal Text placeholderText;

		public InteractiveString(object value, Type valueType)
			: base(value, valueType)
		{
		}

		public override bool SupportsType(Type type)
		{
			return (object)type == typeof(string);
		}

		public override void RefreshUIForValue()
		{
			if (!hiddenObj.gameObject.activeSelf)
			{
				hiddenObj.gameObject.SetActive(true);
			}
			if (!string.IsNullOrEmpty((string)Value))
			{
				string text = (string)Value;
				if (text.Length > 15000)
				{
					text = text.Substring(0, 15000);
				}
				valueInput.Text = text;
				placeholderText.text = text;
			}
			else
			{
				string text2 = ((Value == null) ? "null" : "empty");
				valueInput.Text = "";
				placeholderText.text = text2;
			}
		}

		internal void SetValueFromInput()
		{
			Value = valueInput.Text;
			Owner.SetValueFromIValue();
		}

		public override void ConstructUI(GameObject parent)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			base.ConstructUI(parent);
			hiddenObj = ((Component)UIFactory.CreateLabel(mainContent, "HiddenLabel", "", (TextAnchor)3, default(Color), true, 14)).gameObject;
			hiddenObj.SetActive(false);
			Text hiddenText = hiddenObj.GetComponent<Text>();
			((Graphic)hiddenText).color = Color.clear;
			hiddenText.fontSize = 14;
			((Graphic)hiddenText).raycastTarget = false;
			hiddenText.supportRichText = false;
			ContentSizeFitter val2 = hiddenObj.AddComponent<ContentSizeFitter>();
			val2.verticalFit = (FitMode)2;
			GameObject obj = hiddenObj;
			int? num = 25;
			int? num2 = 500;
			UIFactory.SetLayoutElement(obj, (int?)250, num, (int?)9000, num2, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(hiddenObj, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			valueInput = UIFactory.CreateInputField(hiddenObj, "StringInputField", "...");
			UIFactory.SetLayoutElement(((Component)valueInput.Component).gameObject, (int?)120, (int?)25, (int?)5000, (int?)5000, (int?)null, (int?)null, (bool?)null);
			valueInput.Component.lineType = (LineType)2;
			placeholderText = ((Component)valueInput.Component.placeholder).GetComponent<Text>();
			placeholderText.supportRichText = false;
			valueInput.Component.textComponent.supportRichText = false;
			valueInput.OnValueChanged += delegate(string val)
			{
				hiddenText.text = val ?? "";
				LayoutRebuilder.ForceRebuildLayoutImmediate(Owner.ContentRect);
				SetValueFromInput();
			};
			RefreshUIForValue();
		}
	}
	public class InteractiveTomlObject : InteractiveValue
	{
		internal InputFieldRef valueInput;

		internal GameObject hiddenObj;

		internal Text placeholderText;

		public InteractiveTomlObject(object value, Type valueType)
			: base(value, valueType)
		{
		}

		public override bool SupportsType(Type type)
		{
			return true;
		}

		public override void OnValueUpdated()
		{
			base.OnValueUpdated();
			try
			{
				valueInput.Text = TomlTypeConverter.ConvertToString(Value, FallbackType);
				placeholderText.text = valueInput.Text;
			}
			catch
			{
				ConfigManager.LogSource.LogWarning((object)("Unable to edit entry '" + Owner.RefConfig.Definition.Key + "' due to an error with the Toml converter!"));
			}
		}

		internal void SetValueFromInput()
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Value = TomlTypeConverter.ConvertToValue(valueInput.Text, FallbackType);
				Owner.SetValueFromIValue();
				((Graphic)valueInput.Component.textComponent).color = Color.white;
			}
			catch
			{
				((Graphic)valueInput.Component.textComponent).color = Color.red;
			}
		}

		public override void RefreshUIForValue()
		{
			if (!hiddenObj.gameObject.activeSelf)
			{
				hiddenObj.gameObject.SetActive(true);
			}
		}

		public override void ConstructUI(GameObject parent)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			base.ConstructUI(parent);
			hiddenObj = ((Component)UIFactory.CreateLabel(mainContent, "HiddenLabel", "", (TextAnchor)3, default(Color), true, 14)).gameObject;
			hiddenObj.SetActive(false);
			Text hiddenText = hiddenObj.GetComponent<Text>();
			((Graphic)hiddenText).color = Color.clear;
			hiddenText.fontSize = 14;
			((Graphic)hiddenText).raycastTarget = false;
			hiddenText.supportRichText = false;
			ContentSizeFitter val2 = hiddenObj.AddComponent<ContentSizeFitter>();
			val2.verticalFit = (FitMode)2;
			GameObject obj = hiddenObj;
			int? num = 25;
			int? num2 = 500;
			UIFactory.SetLayoutElement(obj, (int?)250, num, (int?)9000, num2, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(hiddenObj, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			valueInput = UIFactory.CreateInputField(hiddenObj, "StringInputField", "...");
			UIFactory.SetLayoutElement(((Component)valueInput.Component).gameObject, (int?)120, (int?)25, (int?)5000, (int?)5000, (int?)null, (int?)null, (bool?)null);
			valueInput.Component.lineType = (LineType)2;
			placeholderText = ((Component)valueInput.Component.placeholder).GetComponent<Text>();
			placeholderText.supportRichText = false;
			valueInput.Component.textComponent.supportRichText = false;
			OnValueUpdated();
			valueInput.OnValueChanged += delegate(string val)
			{
				hiddenText.text = val ?? "";
				LayoutRebuilder.ForceRebuildLayoutImmediate(Owner.ContentRect);
				SetValueFromInput();
			};
		}
	}
	public abstract class InteractiveValue
	{
		private static readonly HashSet<Type> customIValueTypes = new HashSet<Type>();

		private static readonly List<InteractiveValue> customIValueInstances = new List<InteractiveValue>();

		public CachedConfigEntry Owner;

		public object Value;

		public readonly Type FallbackType;

		public bool UIConstructed;

		protected internal GameObject mainContentParent;

		protected internal GameObject subContentParent;

		protected internal GameObject mainContent;

		protected internal ButtonRef subExpandBtn;

		protected internal bool subContentConstructed;

		public virtual bool HasSubContent => false;

		public virtual bool SubContentWanted => false;

		public static void RegisterIValueType<T>() where T : InteractiveValue
		{
			if (!customIValueTypes.Contains(typeof(T)))
			{
				customIValueInstances.Add((T)Activator.CreateInstance(typeof(T), null, typeof(object)));
				customIValueTypes.Add(typeof(T));
			}
		}

		public static Type GetIValueForType(Type type)
		{
			if ((object)type == typeof(bool))
			{
				return typeof(InteractiveBool);
			}
			if (type.IsPrimitive || typeof(decimal).IsAssignableFrom(type))
			{
				return typeof(InteractiveNumber);
			}
			if ((object)type == typeof(string))
			{
				return typeof(InteractiveString);
			}
			if ((object)type == typeof(KeyCode) || type.FullName == "UnityEngine.InputSystem.Key")
			{
				return typeof(InteractiveKeycode);
			}
			if (typeof(Enum).IsAssignableFrom(type))
			{
				object[] customAttributes = type.GetCustomAttributes(typeof(FlagsAttribute), inherit: true);
				if (customAttributes != null && customAttributes.Any())
				{
					return typeof(InteractiveFlags);
				}
				return typeof(InteractiveEnum);
			}
			if ((object)type == typeof(Color) || (object)type == typeof(Color32))
			{
				return typeof(InteractiveColor);
			}
			if (InteractiveFloatStruct.IsTypeSupported(type))
			{
				return typeof(InteractiveFloatStruct);
			}
			InteractiveValue interactiveValue = customIValueInstances.FirstOrDefault((InteractiveValue it) => it.SupportsType(type));
			if (interactiveValue != null)
			{
				return interactiveValue.GetType();
			}
			return typeof(InteractiveTomlObject);
		}

		public static InteractiveValue Create(object value, Type fallbackType)
		{
			Type type = ReflectionExtensions.GetActualType(value) ?? fallbackType;
			Type iValueForType = GetIValueForType(type);
			return (InteractiveValue)Activator.CreateInstance(iValueForType, value, type);
		}

		public InteractiveValue(object value, Type valueType)
		{
			Value = value;
			FallbackType = valueType;
		}

		public virtual bool SupportsType(Type type)
		{
			return true;
		}

		public virtual void OnValueUpdated()
		{
			if (!UIConstructed)
			{
				ConstructUI(mainContentParent);
			}
			RefreshUIForValue();
		}

		public virtual void RefreshUIForValue()
		{
		}

		public void RefreshSubContentState()
		{
			if (HasSubContent)
			{
				if (((Component)subExpandBtn.Component).gameObject.activeSelf != SubContentWanted)
				{
					((Component)subExpandBtn.Component).gameObject.SetActive(SubContentWanted);
				}
				if (!SubContentWanted && subContentParent.activeSelf)
				{
					ToggleSubcontent();
				}
			}
		}

		public virtual void ConstructSubcontent()
		{
			subContentConstructed = true;
		}

		public virtual void DestroySubContent()
		{
			if (Object.op_Implicit((Object)(object)subContentParent) && HasSubContent)
			{
				for (int i = 0; i < subContentParent.transform.childCount; i++)
				{
					Transform child = subContentParent.transform.GetChild(i);
					if (Object.op_Implicit((Object)(object)child))
					{
						Object.Destroy((Object)(object)((Component)child).gameObject);
					}
				}
			}
			subContentConstructed = false;
		}

		public void ToggleSubcontent()
		{
			if (!subContentParent.activeSelf)
			{
				subContentParent.SetActive(true);
				subContentParent.transform.SetAsLastSibling();
				subExpandBtn.ButtonText.text = "▼ Click to hide";
			}
			else
			{
				subContentParent.SetActive(false);
				subExpandBtn.ButtonText.text = "▲ Expand to edit";
			}
			OnToggleSubcontent(subContentParent.activeSelf);
			RefreshSubContentState();
		}

		protected internal virtual void OnToggleSubcontent(bool toggle)
		{
			if (!subContentConstructed)
			{
				ConstructSubcontent();
			}
		}

		public virtual void ConstructUI(GameObject parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			UIConstructed = true;
			mainContent = UIFactory.CreateHorizontalGroup(parent, "InteractiveValue_" + GetType().Name, false, false, true, true, 4, default(Vector4), new Color(1f, 1f, 1f, 0f), (TextAnchor?)(TextAnchor)0);
			RectTransform component = mainContent.GetComponent<RectTransform>();
			component.SetSizeWithCurrentAnchors((Axis)1, 25f);
			GameObject obj = mainContent;
			int? num = 9000;
			UIFactory.SetLayoutElement(obj, (int?)175, (int?)25, num, (int?)0, (int?)null, (int?)null, (bool?)null);
			if (HasSubContent)
			{
				subExpandBtn = UIFactory.CreateButton(mainContent, "ExpandSubcontentButton", "▲ Expand to edit", (Color?)new Color(0.3f, 0.3f, 0.3f));
				ButtonRef obj2 = subExpandBtn;
				obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, new Action(ToggleSubcontent));
				GameObject gameObject = ((Component)subExpandBtn.Component).gameObject;
				num = 25;
				UIFactory.SetLayoutElement(gameObject, (int?)120, num, (int?)0, (int?)0, (int?)null, (int?)null, (bool?)null);
			}
		}
	}
	public class InteractiveValueList : InteractiveValue
	{
		internal IEnumerable<object> acceptableValues;

		internal Dropdown dropdown;

		internal Dictionary<object, OptionData> dropdownOptions = new Dictionary<object, OptionData>();

		public InteractiveValueList(object value, Type valueType)
			: base(value, valueType)
		{
		}

		public override bool SupportsType(Type type)
		{
			return type.IsEnum;
		}

		internal void GetAcceptableValues()
		{
			if (acceptableValues == null)
			{
				AcceptableValueBase val = Owner.RefConfig.Description.AcceptableValues;
				PropertyInfo property = ((object)val).GetType().GetProperty("AcceptableValues");
				acceptableValues = (property.GetValue(val, null) as IList).Cast<object>();
			}
		}

		public override void OnValueUpdated()
		{
			GetAcceptableValues();
			base.OnValueUpdated();
		}

		public override void RefreshUIForValue()
		{
			base.RefreshUIForValue();
			if (dropdownOptions.ContainsKey(Value))
			{
				dropdown.value = dropdown.options.IndexOf(dropdownOptions[Value]);
			}
		}

		private void SetValueFromDropdown()
		{
			object obj = acceptableValues.ElementAt(dropdown.value);
			if (obj != null)
			{
				Value = obj;
				Owner.SetValueFromIValue();
				RefreshUIForValue();
			}
		}

		public override void ConstructUI(GameObject parent)
		{
			//IL_00a3: 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_00b8: Expected O, but got Unknown
			base.ConstructUI(parent);
			GameObject val2 = UIFactory.CreateDropdown(mainContent, "InteractiveValueList", ref dropdown, "", 14, (Action<int>)null, (string[])null);
			UIFactory.SetLayoutElement(val2, (int?)400, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			((UnityEvent<int>)(object)dropdown.onValueChanged).AddListener((UnityAction<int>)delegate
			{
				SetValueFromDropdown();
			});
			foreach (object acceptableValue in acceptableValues)
			{
				OptionData val3 = new OptionData
				{
					text = acceptableValue.ToString()
				};
				dropdown.options.Add(val3);
				dropdownOptions.Add(acceptableValue, val3);
			}
		}
	}
}
namespace ConfigManager.Utility
{
	internal sealed class ConfigurationManagerAttributes
	{
		public bool? ShowRangeAsPercent;

		public Action<ConfigEntryBase> CustomDrawer;

		public bool? Browsable;

		public string Category;

		public object DefaultValue;

		public bool? HideDefaultButton;

		public bool? HideSettingName;

		public string Description;

		public string DispName;

		public int? Order;

		public bool? ReadOnly;

		public bool? IsAdvanced;

		public Func<object, string> ObjToStr;

		public Func<string, object> StrToObj;
	}
}

BepInEx/plugins/Obeliskial Essentials.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Paradox;
using Photon.Pun;
using Photon.Realtime;
using Steamworks;
using Steamworks.Data;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UniverseLib;
using UniverseLib.Config;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("com.stiffmeds.obeliskialessentials")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Essential reference classes and methods for Across the Obelisk modding.")]
[assembly: AssemblyFileVersion("1.3.0.0")]
[assembly: AssemblyInformationalVersion("1.3.0")]
[assembly: AssemblyProduct("Obeliskial Essentials")]
[assembly: AssemblyTitle("com.stiffmeds.obeliskialessentials")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.3.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
public class SnapshotCamera : MonoBehaviour
{
	private struct GameObjectStateSnapshot
	{
		private GameObject gameObject;

		private Vector3 position;

		private Quaternion rotation;

		private Vector3 scale;

		private Dictionary<GameObject, int> layers;

		public GameObjectStateSnapshot(GameObject gameObject)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			this.gameObject = gameObject;
			position = gameObject.transform.position;
			rotation = gameObject.transform.rotation;
			scale = gameObject.transform.localScale;
			layers = new Dictionary<GameObject, int>();
			Transform[] componentsInChildren = gameObject.GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				layers.Add(((Component)val).gameObject, ((Component)val).gameObject.layer);
			}
		}

		public void Restore()
		{
			//IL_000d: 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_003b: Unknown result type (might be due to invalid IL or missing references)
			gameObject.transform.position = position;
			gameObject.transform.rotation = rotation;
			gameObject.transform.localScale = scale;
			foreach (KeyValuePair<GameObject, int> layer in layers)
			{
				layer.Key.layer = layer.Value;
			}
		}
	}

	private Camera cam;

	private int layer;

	public Vector3 defaultPositionOffset = new Vector3(0f, 0f, 1f);

	public Vector3 defaultRotation = new Vector3(0f, 0f, 0f);

	public Vector3 defaultScale = new Vector3(1f, 1f, 1f);

	private SnapshotCamera()
	{
	}//IL_0010: 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_002a: Unknown result type (might be due to invalid IL or missing references)
	//IL_002f: Unknown result type (might be due to invalid IL or missing references)
	//IL_0044: Unknown result type (might be due to invalid IL or missing references)
	//IL_0049: Unknown result type (might be due to invalid IL or missing references)


	public static SnapshotCamera MakeSnapshotCamera(string layer, string name = "Snapshot Camera")
	{
		return MakeSnapshotCamera(LayerMask.NameToLayer(layer), name);
	}

	public static SnapshotCamera MakeSnapshotCamera(int layer = 5, string name = "Snapshot Camera")
	{
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Expected O, but got Unknown
		//IL_0059: Unknown result type (might be due to invalid IL or missing references)
		if (layer < 0 || layer > 31)
		{
			throw new ArgumentOutOfRangeException("layer", "layer argument must specify a valid layer between 0 and 31");
		}
		GameObject val = new GameObject(name);
		Camera val2 = val.AddComponent<Camera>();
		val2.cullingMask = 1 << layer;
		val2.orthographic = true;
		val2.orthographicSize = 1f;
		val2.clearFlags = (CameraClearFlags)2;
		val2.backgroundColor = Color.clear;
		val2.nearClipPlane = 0.1f;
		((Behaviour)val2).enabled = false;
		SnapshotCamera snapshotCamera = val.AddComponent<SnapshotCamera>();
		snapshotCamera.cam = val2;
		snapshotCamera.layer = layer;
		return snapshotCamera;
	}

	private static string SanitizeFilename(string dirty)
	{
		string arg = Regex.Escape(new string(Path.GetInvalidFileNameChars()));
		string pattern = string.Format("([{0}]*\\.+$)|([{0}]+)", arg);
		return Regex.Replace(dirty, pattern, "_");
	}

	public static FileInfo SavePNG(byte[] bytes, string filename = "", string directory = "")
	{
		directory = ((directory != "") ? Directory.CreateDirectory(directory).FullName : Directory.CreateDirectory(Path.Combine(Application.dataPath, "../Snapshots")).FullName);
		filename = ((filename != "") ? (SanitizeFilename(filename) + ".png") : (DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff") + ".png"));
		string text = Path.Combine(directory, filename);
		File.WriteAllBytes(text, bytes);
		return new FileInfo(text);
	}

	public static FileInfo SavePNG(Texture2D tex, string filename = "", string directory = "")
	{
		return SavePNG(ImageConversion.EncodeToPNG(tex), filename, directory);
	}

	private void SetLayersRecursively(GameObject gameObject)
	{
		Transform[] componentsInChildren = gameObject.GetComponentsInChildren<Transform>(true);
		foreach (Transform val in componentsInChildren)
		{
			((Component)val).gameObject.layer = layer;
		}
	}

	private GameObjectStateSnapshot PrepareObject(GameObject gameObject, Vector3 positionOffset, Quaternion rotation, Vector3 scale)
	{
		//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_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		GameObjectStateSnapshot result = new GameObjectStateSnapshot(gameObject);
		gameObject.transform.position = ((Component)this).transform.position + positionOffset;
		gameObject.transform.rotation = rotation;
		gameObject.transform.localScale = scale;
		SetLayersRecursively(gameObject);
		return result;
	}

	private GameObject PreparePrefab(GameObject prefab, Vector3 positionOffset, Quaternion rotation, Vector3 scale)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_0020: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = Object.Instantiate<GameObject>(prefab, ((Component)this).transform.position + positionOffset, rotation);
		val.transform.localScale = scale;
		SetLayersRecursively(val);
		return val;
	}

	public Texture2D TakeObjectSnapshot(GameObject gameObject, int width = 128, int height = 128)
	{
		//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_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		return TakeObjectSnapshot(gameObject, Color.clear, defaultPositionOffset, Quaternion.Euler(defaultRotation), defaultScale, width, height);
	}

	public Texture2D TakeObjectSnapshot(GameObject gameObject, Color backgroundColor, int width = 128, int height = 128)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: 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)
		return TakeObjectSnapshot(gameObject, backgroundColor, defaultPositionOffset, Quaternion.Euler(defaultRotation), defaultScale, width, height);
	}

	public Texture2D TakeObjectSnapshot(GameObject gameObject, Vector3 positionOffset, Quaternion rotation, Vector3 scale, int width = 128, int height = 128)
	{
		//IL_0003: 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_000a: Unknown result type (might be due to invalid IL or missing references)
		return TakeObjectSnapshot(gameObject, Color.clear, positionOffset, rotation, scale, width, height);
	}

	public Texture2D TakeObjectSnapshot(GameObject gameObject, Color backgroundColor, Vector3 positionOffset, Quaternion rotation, Vector3 scale, int width = 128, int height = 128)
	{
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)gameObject == (Object)null)
		{
			throw new ArgumentNullException("gameObject");
		}
		Scene scene = gameObject.scene;
		if (((Scene)(ref scene)).name == null)
		{
			throw new ArgumentException("gameObject parameter must be an instantiated GameObject! If you want to use a prefab directly, use TakePrefabSnapshot instead.", "gameObject");
		}
		GameObjectStateSnapshot gameObjectStateSnapshot = PrepareObject(gameObject, positionOffset, rotation, scale);
		Texture2D result = TakeSnapshot(backgroundColor, width, height);
		gameObjectStateSnapshot.Restore();
		return result;
	}

	public Texture2D TakePrefabSnapshot(GameObject prefab, int width = 128, int height = 128)
	{
		//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_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		return TakePrefabSnapshot(prefab, Color.clear, defaultPositionOffset, Quaternion.Euler(defaultRotation), defaultScale, width, height);
	}

	public Texture2D TakePrefabSnapshot(GameObject prefab, Color backgroundColor, int width = 128, int height = 128)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: 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)
		return TakePrefabSnapshot(prefab, backgroundColor, defaultPositionOffset, Quaternion.Euler(defaultRotation), defaultScale, width, height);
	}

	public Texture2D TakePrefabSnapshot(GameObject prefab, Vector3 positionOffset, Quaternion rotation, Vector3 scale, int width = 128, int height = 128)
	{
		//IL_0003: 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_000a: Unknown result type (might be due to invalid IL or missing references)
		return TakePrefabSnapshot(prefab, Color.clear, positionOffset, rotation, scale, width, height);
	}

	public Texture2D TakePrefabSnapshot(GameObject prefab, Color backgroundColor, Vector3 positionOffset, Quaternion rotation, Vector3 scale, int width = 128, int height = 128)
	{
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)prefab == (Object)null)
		{
			throw new ArgumentNullException("prefab");
		}
		Scene scene = prefab.scene;
		if (((Scene)(ref scene)).name != null)
		{
			throw new ArgumentException("prefab parameter must be a prefab! If you want to use an instance, use TakeObjectSnapshot instead.", "prefab");
		}
		GameObject val = PreparePrefab(prefab, positionOffset, rotation, scale);
		Texture2D result = TakeSnapshot(backgroundColor, width, height);
		Object.DestroyImmediate((Object)(object)val);
		return result;
	}

	private Texture2D TakeSnapshot(Color backgroundColor, int width, int height)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_006e: Expected O, but got Unknown
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		cam.backgroundColor = backgroundColor;
		cam.targetTexture = RenderTexture.GetTemporary(width, height, 24);
		cam.Render();
		RenderTexture active = RenderTexture.active;
		RenderTexture.active = cam.targetTexture;
		Texture2D val = new Texture2D(((Texture)cam.targetTexture).width, ((Texture)cam.targetTexture).height, (TextureFormat)5, false);
		val.ReadPixels(new Rect(0f, 0f, (float)((Texture)cam.targetTexture).width, (float)((Texture)cam.targetTexture).height), 0, 0);
		val.Apply(false);
		RenderTexture.active = active;
		cam.targetTexture = null;
		RenderTexture.ReleaseTemporary(cam.targetTexture);
		return val;
	}
}
namespace Obeliskial_Essentials
{
	[HarmonyPatch]
	internal class CardDescription
	{
		private static string medsColorUpgradePlain = "5E3016";

		private static string medsColorUpgradeGold = "875700";

		private static string medsColorUpgradeBlue = "215382";

		private static string medsColorUpgradeRare = "7F15A6";

		[HarmonyPrefix]
		[HarmonyPatch(typeof(CardData), "SetDescriptionNew")]
		public static bool SetDescriptionNewPrefix(ref CardData __instance, bool forceDescription = false, Character character = null, bool includeInSearch = true)
		{
			//IL_53b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_53ba: Invalid comparison between Unknown and I4
			//IL_5420: Unknown result type (might be due to invalid IL or missing references)
			//IL_542d: Unknown result type (might be due to invalid IL or missing references)
			//IL_5434: Invalid comparison between Unknown and I4
			//IL_0228: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Invalid comparison between Unknown and I4
			//IL_54a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_545d: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0243: Invalid comparison between Unknown and I4
			//IL_54ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_54b5: Invalid comparison between Unknown and I4
			//IL_5539: Unknown result type (might be due to invalid IL or missing references)
			//IL_54de: Unknown result type (might be due to invalid IL or missing references)
			//IL_0abe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ac4: Invalid comparison between Unknown and I4
			//IL_5546: Unknown result type (might be due to invalid IL or missing references)
			//IL_554d: Invalid comparison between Unknown and I4
			//IL_0b1c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b22: Invalid comparison between Unknown and I4
			//IL_0aed: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c14: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c1a: Invalid comparison between Unknown and I4
			//IL_048f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0495: Invalid comparison between Unknown and I4
			//IL_5576: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c91: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c97: Invalid comparison between Unknown and I4
			//IL_04be: Unknown result type (might be due to invalid IL or missing references)
			//IL_5658: Unknown result type (might be due to invalid IL or missing references)
			//IL_565e: Invalid comparison between Unknown and I4
			//IL_56b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_56bc: Invalid comparison between Unknown and I4
			//IL_076a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0770: Invalid comparison between Unknown and I4
			//IL_06a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_06af: Invalid comparison between Unknown and I4
			//IL_571e: Unknown result type (might be due to invalid IL or missing references)
			//IL_5724: Invalid comparison between Unknown and I4
			//IL_1020: Unknown result type (might be due to invalid IL or missing references)
			//IL_089b: Unknown result type (might be due to invalid IL or missing references)
			//IL_08a1: Invalid comparison between Unknown and I4
			//IL_077e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0784: Invalid comparison between Unknown and I4
			//IL_06e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ec: Invalid comparison between Unknown and I4
			//IL_06b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_06bf: Invalid comparison between Unknown and I4
			//IL_577c: Unknown result type (might be due to invalid IL or missing references)
			//IL_5782: Invalid comparison between Unknown and I4
			//IL_1029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0926: Unknown result type (might be due to invalid IL or missing references)
			//IL_092c: Invalid comparison between Unknown and I4
			//IL_08ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_08b2: Invalid comparison between Unknown and I4
			//IL_07aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_07b0: Invalid comparison between Unknown and I4
			//IL_06ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0705: Invalid comparison between Unknown and I4
			//IL_06c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_57e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_57eb: Invalid comparison between Unknown and I4
			//IL_1032: Unknown result type (might be due to invalid IL or missing references)
			//IL_1038: Invalid comparison between Unknown and I4
			//IL_096d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0973: Invalid comparison between Unknown and I4
			//IL_0937: Unknown result type (might be due to invalid IL or missing references)
			//IL_093d: Invalid comparison between Unknown and I4
			//IL_08e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_08ed: Invalid comparison between Unknown and I4
			//IL_07d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_07dc: Invalid comparison between Unknown and I4
			//IL_0729: Unknown result type (might be due to invalid IL or missing references)
			//IL_072f: Invalid comparison between Unknown and I4
			//IL_070f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0715: Invalid comparison between Unknown and I4
			//IL_06cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_06d2: Invalid comparison between Unknown and I4
			//IL_5851: Unknown result type (might be due to invalid IL or missing references)
			//IL_09dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_09e2: Invalid comparison between Unknown and I4
			//IL_097e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0984: Invalid comparison between Unknown and I4
			//IL_0950: Unknown result type (might be due to invalid IL or missing references)
			//IL_0956: Invalid comparison between Unknown and I4
			//IL_0739: Unknown result type (might be due to invalid IL or missing references)
			//IL_073f: Invalid comparison between Unknown and I4
			//IL_585e: Unknown result type (might be due to invalid IL or missing references)
			//IL_5865: Invalid comparison between Unknown and I4
			//IL_13a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_13aa: Invalid comparison between Unknown and I4
			//IL_09ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_09f3: Invalid comparison between Unknown and I4
			//IL_09c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_09c8: Invalid comparison between Unknown and I4
			//IL_098f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0995: Invalid comparison between Unknown and I4
			//IL_0743: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a06: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a0c: Invalid comparison between Unknown and I4
			//IL_09a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_09ae: Invalid comparison between Unknown and I4
			//IL_07ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0805: Invalid comparison between Unknown and I4
			//IL_074c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0752: Invalid comparison between Unknown and I4
			//IL_58d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_588e: Unknown result type (might be due to invalid IL or missing references)
			//IL_58df: Unknown result type (might be due to invalid IL or missing references)
			//IL_58e6: Invalid comparison between Unknown and I4
			//IL_5942: Unknown result type (might be due to invalid IL or missing references)
			//IL_590f: Unknown result type (might be due to invalid IL or missing references)
			//IL_594f: Unknown result type (might be due to invalid IL or missing references)
			//IL_5956: Invalid comparison between Unknown and I4
			//IL_59b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_59b9: Invalid comparison between Unknown and I4
			//IL_597f: Unknown result type (might be due to invalid IL or missing references)
			//IL_1773: Unknown result type (might be due to invalid IL or missing references)
			//IL_5b70: Unknown result type (might be due to invalid IL or missing references)
			//IL_179f: Unknown result type (might be due to invalid IL or missing references)
			//IL_17a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_1896: Unknown result type (might be due to invalid IL or missing references)
			//IL_1810: Unknown result type (might be due to invalid IL or missing references)
			//IL_1b08: Unknown result type (might be due to invalid IL or missing references)
			//IL_1b0e: Invalid comparison between Unknown and I4
			//IL_19e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_1994: Unknown result type (might be due to invalid IL or missing references)
			//IL_1ab0: Unknown result type (might be due to invalid IL or missing references)
			//IL_1a64: Unknown result type (might be due to invalid IL or missing references)
			//IL_1cd1: Unknown result type (might be due to invalid IL or missing references)
			//IL_1cd7: Invalid comparison between Unknown and I4
			//IL_1ce5: Unknown result type (might be due to invalid IL or missing references)
			//IL_1ceb: Invalid comparison between Unknown and I4
			//IL_1cdb: Unknown result type (might be due to invalid IL or missing references)
			//IL_1ce1: Invalid comparison between Unknown and I4
			//IL_638c: Unknown result type (might be due to invalid IL or missing references)
			//IL_6392: Invalid comparison between Unknown and I4
			//IL_63d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_1d6b: Unknown result type (might be due to invalid IL or missing references)
			//IL_6423: Unknown result type (might be due to invalid IL or missing references)
			//IL_1d74: Unknown result type (might be due to invalid IL or missing references)
			//IL_6430: Unknown result type (might be due to invalid IL or missing references)
			//IL_6437: Invalid comparison between Unknown and I4
			//IL_1d7d: Unknown result type (might be due to invalid IL or missing references)
			//IL_1d83: Invalid comparison between Unknown and I4
			//IL_6676: Unknown result type (might be due to invalid IL or missing references)
			//IL_6486: Unknown result type (might be due to invalid IL or missing references)
			//IL_648c: Invalid comparison between Unknown and I4
			//IL_643f: Unknown result type (might be due to invalid IL or missing references)
			//IL_6446: Invalid comparison between Unknown and I4
			//IL_6683: Unknown result type (might be due to invalid IL or missing references)
			//IL_668a: Invalid comparison between Unknown and I4
			//IL_64c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_644e: Unknown result type (might be due to invalid IL or missing references)
			//IL_6455: Invalid comparison between Unknown and I4
			//IL_1dc0: Unknown result type (might be due to invalid IL or missing references)
			//IL_1dc6: Invalid comparison between Unknown and I4
			//IL_266c: Unknown result type (might be due to invalid IL or missing references)
			//IL_1dca: Unknown result type (might be due to invalid IL or missing references)
			//IL_1dd0: Invalid comparison between Unknown and I4
			//IL_1dd4: Unknown result type (might be due to invalid IL or missing references)
			//IL_1dda: Invalid comparison between Unknown and I4
			//IL_1eea: Unknown result type (might be due to invalid IL or missing references)
			//IL_1ef0: Invalid comparison between Unknown and I4
			//IL_26e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_6947: Unknown result type (might be due to invalid IL or missing references)
			//IL_694d: Invalid comparison between Unknown and I4
			//IL_2723: Unknown result type (might be due to invalid IL or missing references)
			//IL_272a: Unknown result type (might be due to invalid IL or missing references)
			//IL_6988: Unknown result type (might be due to invalid IL or missing references)
			//IL_698f: Invalid comparison between Unknown and I4
			//IL_2761: Unknown result type (might be due to invalid IL or missing references)
			//IL_69ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_69d1: Invalid comparison between Unknown and I4
			//IL_27e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_2032: Unknown result type (might be due to invalid IL or missing references)
			//IL_2038: Invalid comparison between Unknown and I4
			//IL_69d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_69e0: Invalid comparison between Unknown and I4
			//IL_214c: Unknown result type (might be due to invalid IL or missing references)
			//IL_2152: Invalid comparison between Unknown and I4
			//IL_2266: Unknown result type (might be due to invalid IL or missing references)
			//IL_226c: Invalid comparison between Unknown and I4
			//IL_6ab8: Unknown result type (might be due to invalid IL or missing references)
			//IL_6abf: Invalid comparison between Unknown and I4
			//IL_2395: Unknown result type (might be due to invalid IL or missing references)
			//IL_239b: Invalid comparison between Unknown and I4
			//IL_6afa: Unknown result type (might be due to invalid IL or missing references)
			//IL_6b01: Invalid comparison between Unknown and I4
			//IL_6bab: Unknown result type (might be due to invalid IL or missing references)
			//IL_6bb2: Invalid comparison between Unknown and I4
			//IL_6bed: Unknown result type (might be due to invalid IL or missing references)
			//IL_6bf4: Invalid comparison between Unknown and I4
			//IL_6c2f: Unknown result type (might be due to invalid IL or missing references)
			//IL_6c36: Invalid comparison between Unknown and I4
			//IL_7154: Unknown result type (might be due to invalid IL or missing references)
			//IL_715a: Invalid comparison between Unknown and I4
			//IL_6c71: Unknown result type (might be due to invalid IL or missing references)
			//IL_6c78: Invalid comparison between Unknown and I4
			//IL_6cb3: Unknown result type (might be due to invalid IL or missing references)
			//IL_6cba: Invalid comparison between Unknown and I4
			//IL_7195: Unknown result type (might be due to invalid IL or missing references)
			//IL_6cf5: Unknown result type (might be due to invalid IL or missing references)
			//IL_6cfc: Invalid comparison between Unknown and I4
			//IL_7217: Unknown result type (might be due to invalid IL or missing references)
			//IL_6d37: Unknown result type (might be due to invalid IL or missing references)
			//IL_6d3d: Invalid comparison between Unknown and I4
			//IL_7224: Unknown result type (might be due to invalid IL or missing references)
			//IL_722b: Invalid comparison between Unknown and I4
			//IL_6dd1: Unknown result type (might be due to invalid IL or missing references)
			//IL_6dd7: Invalid comparison between Unknown and I4
			//IL_7233: Unknown result type (might be due to invalid IL or missing references)
			//IL_723a: Invalid comparison between Unknown and I4
			//IL_6e6b: Unknown result type (might be due to invalid IL or missing references)
			//IL_6e72: Invalid comparison between Unknown and I4
			//IL_7242: Unknown result type (might be due to invalid IL or missing references)
			//IL_7249: Invalid comparison between Unknown and I4
			//IL_2990: Unknown result type (might be due to invalid IL or missing references)
			//IL_2bc0: Unknown result type (might be due to invalid IL or missing references)
			//IL_2bc6: Invalid comparison between Unknown and I4
			//IL_2a95: Unknown result type (might be due to invalid IL or missing references)
			//IL_2d9f: Unknown result type (might be due to invalid IL or missing references)
			//IL_2da5: Invalid comparison between Unknown and I4
			//IL_74e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_74eb: Invalid comparison between Unknown and I4
			//IL_7625: Unknown result type (might be due to invalid IL or missing references)
			//IL_762b: Invalid comparison between Unknown and I4
			//IL_752e: Unknown result type (might be due to invalid IL or missing references)
			//IL_7534: Invalid comparison between Unknown and I4
			//IL_2b23: Unknown result type (might be due to invalid IL or missing references)
			//IL_75bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_75c3: Invalid comparison between Unknown and I4
			//IL_754b: Unknown result type (might be due to invalid IL or missing references)
			//IL_7552: Invalid comparison between Unknown and I4
			//IL_76e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_76ef: Invalid comparison between Unknown and I4
			//IL_7732: Unknown result type (might be due to invalid IL or missing references)
			//IL_7738: Invalid comparison between Unknown and I4
			//IL_797d: Unknown result type (might be due to invalid IL or missing references)
			//IL_77c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_77cb: Invalid comparison between Unknown and I4
			//IL_774f: Unknown result type (might be due to invalid IL or missing references)
			//IL_7756: Invalid comparison between Unknown and I4
			//IL_3ba2: Unknown result type (might be due to invalid IL or missing references)
			//IL_32ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_32d0: Invalid comparison between Unknown and I4
			//IL_780e: Unknown result type (might be due to invalid IL or missing references)
			//IL_7814: Invalid comparison between Unknown and I4
			//IL_3313: Unknown result type (might be due to invalid IL or missing references)
			//IL_3319: Invalid comparison between Unknown and I4
			//IL_7854: Unknown result type (might be due to invalid IL or missing references)
			//IL_785a: Invalid comparison between Unknown and I4
			//IL_335c: Unknown result type (might be due to invalid IL or missing references)
			//IL_3362: Invalid comparison between Unknown and I4
			//IL_33e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_33ec: Invalid comparison between Unknown and I4
			//IL_3c2c: Unknown result type (might be due to invalid IL or missing references)
			//IL_33a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_33a8: Invalid comparison between Unknown and I4
			//IL_341b: Unknown result type (might be due to invalid IL or missing references)
			//IL_3421: Invalid comparison between Unknown and I4
			//IL_2f6a: Unknown result type (might be due to invalid IL or missing references)
			//IL_2f70: Invalid comparison between Unknown and I4
			//IL_7a75: Unknown result type (might be due to invalid IL or missing references)
			//IL_3450: Unknown result type (might be due to invalid IL or missing references)
			//IL_3456: Invalid comparison between Unknown and I4
			//IL_3483: Unknown result type (might be due to invalid IL or missing references)
			//IL_348a: Invalid comparison between Unknown and I4
			//IL_34bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_34c3: Invalid comparison between Unknown and I4
			//IL_3cb6: Unknown result type (might be due to invalid IL or missing references)
			//IL_34f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_34fc: Invalid comparison between Unknown and I4
			//IL_35dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_35e3: Invalid comparison between Unknown and I4
			//IL_2fac: Unknown result type (might be due to invalid IL or missing references)
			//IL_2fb2: Invalid comparison between Unknown and I4
			//IL_7ba4: Unknown result type (might be due to invalid IL or missing references)
			//IL_3500: Unknown result type (might be due to invalid IL or missing references)
			//IL_3507: Invalid comparison between Unknown and I4
			//IL_35e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_35ed: Invalid comparison between Unknown and I4
			//IL_3d41: Unknown result type (might be due to invalid IL or missing references)
			//IL_3d47: Invalid comparison between Unknown and I4
			//IL_35f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_35f7: Invalid comparison between Unknown and I4
			//IL_353c: Unknown result type (might be due to invalid IL or missing references)
			//IL_3543: Invalid comparison between Unknown and I4
			//IL_3636: Unknown result type (might be due to invalid IL or missing references)
			//IL_363c: Invalid comparison between Unknown and I4
			//IL_7d1c: Unknown result type (might be due to invalid IL or missing references)
			//IL_7d22: Invalid comparison between Unknown and I4
			//IL_7cab: Unknown result type (might be due to invalid IL or missing references)
			//IL_35a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_35b0: Invalid comparison between Unknown and I4
			//IL_354e: Unknown result type (might be due to invalid IL or missing references)
			//IL_3554: Invalid comparison between Unknown and I4
			//IL_3640: Unknown result type (might be due to invalid IL or missing references)
			//IL_3646: Invalid comparison between Unknown and I4
			//IL_7fb3: Unknown result type (might be due to invalid IL or missing references)
			//IL_7fb9: Invalid comparison between Unknown and I4
			//IL_364a: Unknown result type (might be due to invalid IL or missing references)
			//IL_3650: Invalid comparison between Unknown and I4
			//IL_7ffc: Unknown result type (might be due to invalid IL or missing references)
			//IL_8002: Invalid comparison between Unknown and I4
			//IL_3f07: Unknown result type (might be due to invalid IL or missing references)
			//IL_368f: Unknown result type (might be due to invalid IL or missing references)
			//IL_3695: Invalid comparison between Unknown and I4
			//IL_3939: Unknown result type (might be due to invalid IL or missing references)
			//IL_393f: Invalid comparison between Unknown and I4
			//IL_89a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_8089: Unknown result type (might be due to invalid IL or missing references)
			//IL_808f: Invalid comparison between Unknown and I4
			//IL_8015: Unknown result type (might be due to invalid IL or missing references)
			//IL_801b: Invalid comparison between Unknown and I4
			//IL_3699: Unknown result type (might be due to invalid IL or missing references)
			//IL_369f: Invalid comparison between Unknown and I4
			//IL_8152: Unknown result type (might be due to invalid IL or missing references)
			//IL_8158: Invalid comparison between Unknown and I4
			//IL_36a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_36a9: Invalid comparison between Unknown and I4
			//IL_821b: Unknown result type (might be due to invalid IL or missing references)
			//IL_8222: Invalid comparison between Unknown and I4
			//IL_3f9f: Unknown result type (might be due to invalid IL or missing references)
			//IL_36e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_36ee: Invalid comparison between Unknown and I4
			//IL_8a74: Unknown result type (might be due to invalid IL or missing references)
			//IL_82e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_82ec: Invalid comparison between Unknown and I4
			//IL_36f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_36f8: Invalid comparison between Unknown and I4
			//IL_8455: Unknown result type (might be due to invalid IL or missing references)
			//IL_845b: Invalid comparison between Unknown and I4
			//IL_36fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_3702: Invalid comparison between Unknown and I4
			//IL_85c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_85ca: Invalid comparison between Unknown and I4
			//IL_4037: Unknown result type (might be due to invalid IL or missing references)
			//IL_3741: Unknown result type (might be due to invalid IL or missing references)
			//IL_3748: Invalid comparison between Unknown and I4
			//IL_95ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_95fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_9603: Invalid comparison between Unknown and I4
			//IL_872f: Unknown result type (might be due to invalid IL or missing references)
			//IL_374c: Unknown result type (might be due to invalid IL or missing references)
			//IL_3753: Invalid comparison between Unknown and I4
			//IL_873c: Unknown result type (might be due to invalid IL or missing references)
			//IL_8742: Invalid comparison between Unknown and I4
			//IL_40c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_40c8: Invalid comparison between Unknown and I4
			//IL_3757: Unknown result type (might be due to invalid IL or missing references)
			//IL_375e: Invalid comparison between Unknown and I4
			//IL_8ee5: Unknown result type (might be due to invalid IL or missing references)
			//IL_8eeb: Invalid comparison between Unknown and I4
			//IL_379d: Unknown result type (might be due to invalid IL or missing references)
			//IL_37a4: Invalid comparison between Unknown and I4
			//IL_8f20: Unknown result type (might be due to invalid IL or missing references)
			//IL_4189: Unknown result type (might be due to invalid IL or missing references)
			//IL_37a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_37af: Invalid comparison between Unknown and I4
			//IL_37b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_37ba: Invalid comparison between Unknown and I4
			//IL_37f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_3800: Invalid comparison between Unknown and I4
			//IL_8895: Unknown result type (might be due to invalid IL or missing references)
			//IL_889c: Invalid comparison between Unknown and I4
			//IL_4213: Unknown result type (might be due to invalid IL or missing references)
			//IL_3804: Unknown result type (might be due to invalid IL or missing references)
			//IL_380b: Invalid comparison between Unknown and I4
			//IL_380f: Unknown result type (might be due to invalid IL or missing references)
			//IL_3816: Invalid comparison between Unknown and I4
			//IL_3855: Unknown result type (might be due to invalid IL or missing references)
			//IL_385c: Invalid comparison between Unknown and I4
			//IL_9269: Unknown result type (might be due to invalid IL or missing references)
			//IL_926f: Invalid comparison between Unknown and I4
			//IL_922b: Unknown result type (might be due to invalid IL or missing references)
			//IL_9231: Invalid comparison between Unknown and I4
			//IL_429d: Unknown result type (might be due to invalid IL or missing references)
			//IL_3860: Unknown result type (might be due to invalid IL or missing references)
			//IL_3867: Invalid comparison between Unknown and I4
			//IL_92b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_92b7: Invalid comparison between Unknown and I4
			//IL_9398: Unknown result type (might be due to invalid IL or missing references)
			//IL_939e: Invalid comparison between Unknown and I4
			//IL_3899: Unknown result type (might be due to invalid IL or missing references)
			//IL_38a0: Invalid comparison between Unknown and I4
			//IL_4499: Unknown result type (might be due to invalid IL or missing references)
			//IL_449f: Invalid comparison between Unknown and I4
			//IL_38a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_38ab: Invalid comparison between Unknown and I4
			//IL_456f: Unknown result type (might be due to invalid IL or missing references)
			//IL_45f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_467f: Unknown result type (might be due to invalid IL or missing references)
			//IL_470a: Unknown result type (might be due to invalid IL or missing references)
			//IL_4710: Invalid comparison between Unknown and I4
			//IL_4900: Unknown result type (might be due to invalid IL or missing references)
			//IL_4962: Unknown result type (might be due to invalid IL or missing references)
			//IL_4b81: Unknown result type (might be due to invalid IL or missing references)
			//IL_4f5e: Unknown result type (might be due to invalid IL or missing references)
			//IL_4f64: Invalid comparison between Unknown and I4
			//IL_4c97: Unknown result type (might be due to invalid IL or missing references)
			//IL_4c9d: Invalid comparison between Unknown and I4
			//IL_4fa7: Unknown result type (might be due to invalid IL or missing references)
			//IL_4fad: Invalid comparison between Unknown and I4
			//IL_4d62: Unknown result type (might be due to invalid IL or missing references)
			//IL_4d68: Invalid comparison between Unknown and I4
			//IL_5028: Unknown result type (might be due to invalid IL or missing references)
			//IL_502e: Invalid comparison between Unknown and I4
			string value = Traverse.Create((object)__instance).Field("descriptionId").GetValue<string>();
			int value2 = Traverse.Create((object)__instance).Field("healPreCalculated").GetValue<int>();
			int value3 = Traverse.Create((object)__instance).Field("healSelfPreCalculated").GetValue<int>();
			int value4 = Traverse.Create((object)__instance).Field("enchantDamagePreCalculated").GetValue<int>();
			if (Essentials.medsCustomCardDescriptions.ContainsKey(__instance.Id))
			{
				__instance.DescriptionNormalized = Essentials.medsCustomCardDescriptions[__instance.Id];
			}
			else if (forceDescription || !Globals.Instance.CardsDescriptionNormalized.ContainsKey(__instance.Id))
			{
				StringBuilder stringBuilder = new StringBuilder();
				StringBuilder stringBuilder2 = new StringBuilder();
				string value5 = "<line-height=15%><br></line-height>";
				string value6 = "<color=#444><size=-.15>";
				string value7 = "</size></color>";
				string value8 = "<color=#5E3016><size=-.15>";
				int num = 0;
				if (value != "")
				{
					stringBuilder.Append(Functions.FormatStringCard(Texts.Instance.GetText(value, "")));
				}
				else if ((Object)(object)__instance.Item == (Object)null && (Object)(object)__instance.ItemEnchantment == (Object)null)
				{
					string text = "";
					string text2 = "";
					string text3 = "";
					float num2 = 0f;
					string text4 = "";
					bool flag = false;
					bool flag2 = false;
					bool flag3 = true;
					bool flag4 = false;
					StringBuilder stringBuilder3 = new StringBuilder();
					if (__instance.Damage > 0 || __instance.Damage2 > 0 || __instance.DamageSelf > 0 || __instance.DamageSelf2 > 0)
					{
						flag3 = false;
					}
					if (__instance.DrawCard != 0 && !__instance.DrawCardSpecialValueGlobal)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDraw", ""), medsColorTextArray("", medsNumFormat(__instance.DrawCard), medsSpriteText("card"))));
						stringBuilder.Append("<br>");
					}
					if ((int)__instance.SpecialValueGlobal == 17)
					{
						if ((int)__instance.DiscardCardPlace == 4)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsVanish", ""), medsColorTextArray("", "X", medsSpriteText("card"))));
						}
						else
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDiscard", ""), medsColorTextArray("", "X", medsSpriteText("card"))));
						}
						stringBuilder.Append("\n");
					}
					if (__instance.DrawCardSpecialValueGlobal)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDraw", ""), medsColorTextArray("aura", "X", medsSpriteText("card"))));
						stringBuilder.Append("<br>");
					}
					if (__instance.AddCard != 0)
					{
						string arg;
						if (__instance.AddCardId != "")
						{
							stringBuilder2.Append(medsColorTextArray("", medsNumFormat(__instance.AddCard), medsSpriteText("card")));
							CardData cardData = Globals.Instance.GetCardData(__instance.AddCardId, false);
							if ((Object)(object)cardData != (Object)null)
							{
								stringBuilder2.Append(medsColorFromCardDataRarity(cardData));
								stringBuilder2.Append(cardData.CardName);
								stringBuilder2.Append("</color>");
							}
							arg = stringBuilder2.ToString();
							stringBuilder2.Clear();
						}
						else
						{
							if (__instance.AddCardChoose > 0)
							{
								stringBuilder2.Append(medsColorTextArray("", medsNumFormat(__instance.AddCardChoose), medsSpriteText("card")));
							}
							else
							{
								stringBuilder2.Append(medsColorTextArray("", medsNumFormat(__instance.AddCard), medsSpriteText("card")));
							}
							if ((int)__instance.AddCardType > 0)
							{
								stringBuilder2.Append("<color=#5E3016>");
								stringBuilder2.Append(Texts.Instance.GetText(Enum.GetName(typeof(CardType), __instance.AddCardType), ""));
								stringBuilder2.Append("</color>");
							}
							arg = stringBuilder2.ToString();
							stringBuilder2.Clear();
						}
						string text5 = "";
						if (__instance.AddCardReducedCost == -1)
						{
							text5 = (__instance.AddCardVanish ? ((!__instance.AddCardCostTurn) ? string.Format(Texts.Instance.GetText("cardsAddCostVanish", ""), 0) : string.Format(Texts.Instance.GetText("cardsAddCostVanish", ""), 0)) : ((!__instance.AddCardCostTurn) ? string.Format(Texts.Instance.GetText("cardsAddCost", ""), 0) : string.Format(Texts.Instance.GetText("cardsAddCostTurn", ""), 0)));
						}
						else if (__instance.AddCardReducedCost > 0)
						{
							text5 = (__instance.AddCardVanish ? ((!__instance.AddCardCostTurn) ? string.Format(Texts.Instance.GetText("cardsAddCostReducedVanish", ""), __instance.AddCardReducedCost) : string.Format(Texts.Instance.GetText("cardsAddCostReducedVanishTurn", ""), __instance.AddCardReducedCost)) : ((!__instance.AddCardCostTurn) ? string.Format(Texts.Instance.GetText("cardsAddCostReduced", ""), __instance.AddCardReducedCost) : string.Format(Texts.Instance.GetText("cardsAddCostReducedTurn", ""), __instance.AddCardReducedCost)));
						}
						string text6 = "";
						if (__instance.AddCardId != "")
						{
							if ((int)__instance.AddCardPlace == 3)
							{
								text6 = (((int)__instance.TargetSide == 3 || ((int)__instance.TargetSide == 0 && (int)__instance.CardClass != 5)) ? "cardsIDShuffleDeck" : "cardsIDShuffleTargetDeck");
							}
							else if ((int)__instance.AddCardPlace == 5)
							{
								text6 = "cardsIDPlaceHand";
							}
							else if ((int)__instance.AddCardPlace == 1)
							{
								text6 = (((int)__instance.TargetSide != 3) ? "cardsIDPlaceTargetTopDeck" : "cardsIDPlaceTopDeck");
							}
							else if ((int)__instance.AddCardPlace == 0)
							{
								text6 = (((int)__instance.TargetSide == 3 || ((int)__instance.TargetSide == 0 && (int)__instance.CardClass != 5)) ? "cardsIDPlaceDiscard" : "cardsIDPlaceTargetDiscard");
							}
						}
						else if ((int)__instance.AddCardFrom == 2)
						{
							if ((int)__instance.AddCardPlace == 3)
							{
								text6 = ((__instance.AddCardChoose != 0) ? "cardsDiscoverNumberToDeck" : "cardsDiscoverToDeck");
							}
							else if ((int)__instance.AddCardPlace == 5)
							{
								text6 = ((__instance.AddCardChoose != 0) ? "cardsDiscoverNumberToHand" : "cardsDiscoverToHand");
							}
							else if ((int)__instance.AddCardPlace == 1 && __instance.AddCardChoose != 0)
							{
								text6 = "cardsDiscoverNumberToTopDeck";
							}
							else if ((int)__instance.AddCardPlace == 6)
							{
								CardData cardData2 = Globals.Instance.GetCardData(__instance.AddCardId, false);
								if ((Object)(object)cardData2 != (Object)null)
								{
									stringBuilder2.Clear();
									stringBuilder2.Append(medsColorFromCardDataRarity(cardData2));
									stringBuilder2.Append(cardData2.CardName);
									stringBuilder2.Append("</color>");
									text6 = string.Format(Texts.Instance.GetText("cardsCast", ""), stringBuilder2.ToString());
									stringBuilder2.Clear();
								}
							}
						}
						else if ((int)__instance.AddCardFrom == 0)
						{
							if ((int)__instance.AddCardPlace == 5)
							{
								text6 = ((__instance.AddCardChoose > 0) ? "cardsRevealNumberToHand" : ((__instance.AddCard <= 1) ? "cardsRevealItToHand" : "cardsRevealThemToHand"));
							}
							else if ((int)__instance.AddCardPlace == 1)
							{
								text6 = ((__instance.AddCardChoose > 0) ? "cardsRevealNumberToTopDeck" : ((__instance.AddCard <= 1) ? "cardsRevealItToTopDeck" : "cardsRevealThemToTopDeck"));
							}
						}
						else if ((int)__instance.AddCardFrom == 1)
						{
							if ((int)__instance.AddCardPlace == 1)
							{
								text6 = "cardsPickToTop";
							}
							else if ((int)__instance.AddCardPlace == 5)
							{
								text6 = "cardsPickToHand";
							}
						}
						else if ((int)__instance.AddCardFrom == 3)
						{
							if ((int)__instance.TargetSide == 1)
							{
								if ((int)__instance.AddCardPlace == 1)
								{
									text6 = "cardsDuplicateToTargetTopDeck";
								}
								else if ((int)__instance.AddCardPlace == 3)
								{
									text6 = "cardsDuplicateToTargetRandomDeck";
								}
							}
							else if ((int)__instance.AddCardPlace == 5)
							{
								text6 = "cardsDuplicateToHand";
							}
						}
						else if ((int)__instance.AddCardFrom == 4)
						{
							if ((int)__instance.AddCardPlace == 1)
							{
								text6 = "cardsFromVanishToTop";
							}
							else if ((int)__instance.AddCardPlace == 5)
							{
								text6 = "cardsFromVanishToHand";
							}
						}
						stringBuilder.Append(string.Format(Texts.Instance.GetText(text6, ""), arg, medsColorTextArray("", medsNumFormat(__instance.AddCard))));
						if (text5 != "")
						{
							stringBuilder.Append(" ");
							stringBuilder.Append(value6);
							stringBuilder.Append(text5);
							stringBuilder.Append(value7);
						}
						stringBuilder.Append("\n");
					}
					if (__instance.DiscardCard != 0)
					{
						if ((int)__instance.DiscardCardType > 0)
						{
							stringBuilder2.Append("<color=#5E3016>");
							stringBuilder2.Append(Texts.Instance.GetText(Enum.GetName(typeof(CardType), __instance.DiscardCardType), ""));
							stringBuilder2.Append("</color>");
						}
						if ((int)__instance.DiscardCardPlace == 0)
						{
							if (!__instance.DiscardCardAutomatic)
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDiscard", ""), medsColorTextArray("", medsNumFormat(__instance.DiscardCard), medsSpriteText("card"))));
								stringBuilder.Append(stringBuilder2);
								stringBuilder.Append("\n");
							}
							else
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDiscard", ""), medsColorTextArray("", medsNumFormat(__instance.DiscardCard), medsSpriteText("cardrandom"))));
								stringBuilder.Append(stringBuilder2);
								stringBuilder.Append("\n");
							}
						}
						else if ((int)__instance.DiscardCardPlace == 1)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsPlaceToTop", ""), medsColorTextArray("", medsNumFormat(__instance.DiscardCard), medsSpriteText("card"), stringBuilder2.ToString().Trim())));
							stringBuilder.Append("\n");
						}
						else if ((int)__instance.DiscardCardPlace == 4)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsVanish", ""), medsColorTextArray("", medsNumFormat(__instance.DiscardCard), medsSpriteText("card"), stringBuilder2.ToString().Trim())));
							stringBuilder.Append("\n");
						}
						stringBuilder2.Clear();
					}
					if (__instance.LookCards != 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsLook", ""), medsColorTextArray("", medsNumFormat(__instance.LookCards), medsSpriteText("card"))));
						stringBuilder.Append("\n");
						if (__instance.LookCardsDiscardUpTo == -1)
						{
							stringBuilder.Append(Texts.Instance.GetText("cardsDiscardAny", ""));
							stringBuilder.Append("\n");
						}
						else if (__instance.LookCardsDiscardUpTo > 0)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDiscardUpTo", ""), medsColorTextArray("", medsNumFormat(__instance.LookCardsDiscardUpTo))));
							stringBuilder.Append("\n");
						}
						else if (__instance.LookCardsVanishUpTo > 0)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsVanishUpTo", ""), medsColorTextArray("", medsNumFormat(__instance.LookCardsVanishUpTo))));
							stringBuilder.Append("\n");
						}
					}
					num = 0;
					if ((Object)(object)__instance.SummonUnit != (Object)null && __instance.SummonUnitNum > 0)
					{
						stringBuilder2.Append("\n<color=#5E3016>");
						if (__instance.SummonUnitNum > 1)
						{
							stringBuilder2.Append(__instance.SummonUnitNum);
							stringBuilder2.Append(" ");
						}
						if ((Object)(object)__instance.SummonUnit != (Object)null && (Object)(object)Globals.Instance.GetNPC(__instance.SummonUnit.Id) != (Object)null)
						{
							stringBuilder2.Append(Globals.Instance.GetNPC(__instance.SummonUnit.Id).NPCName);
						}
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsSummon", ""), stringBuilder2.ToString()));
						stringBuilder.Append("</color>\n");
						stringBuilder2.Clear();
					}
					if (__instance.DispelAuras > 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsPurge", ""), medsColorTextArray("aura", __instance.DispelAuras.ToString())));
						stringBuilder.Append("\n");
					}
					else if (__instance.DispelAuras == -1)
					{
						stringBuilder.Append(Texts.Instance.GetText("cardsPurgeAll", ""));
						stringBuilder.Append("\n");
					}
					num = 0;
					if ((int)__instance.SpecialValueGlobal == 0 && (int)__instance.SpecialValue1 == 0 && (int)__instance.SpecialValue2 == 0)
					{
						StringBuilder stringBuilder4 = new StringBuilder();
						StringBuilder stringBuilder5 = new StringBuilder();
						if ((Object)(object)__instance.HealAuraCurseName != (Object)null)
						{
							if (__instance.HealAuraCurseName.IsAura)
							{
								stringBuilder4.Append(medsSpriteText(__instance.HealAuraCurseName.ACName));
							}
							else
							{
								stringBuilder5.Append(medsSpriteText(__instance.HealAuraCurseName.ACName));
							}
						}
						if ((Object)(object)__instance.HealAuraCurseName2 != (Object)null)
						{
							if (__instance.HealAuraCurseName2.IsAura)
							{
								stringBuilder4.Append(medsSpriteText(__instance.HealAuraCurseName2.ACName));
							}
							else
							{
								stringBuilder5.Append(medsSpriteText(__instance.HealAuraCurseName2.ACName));
							}
						}
						if ((Object)(object)__instance.HealAuraCurseName3 != (Object)null)
						{
							if (__instance.HealAuraCurseName3.IsAura)
							{
								stringBuilder4.Append(medsSpriteText(__instance.HealAuraCurseName3.ACName));
							}
							else
							{
								stringBuilder5.Append(medsSpriteText(__instance.HealAuraCurseName3.ACName));
							}
						}
						if ((Object)(object)__instance.HealAuraCurseName4 != (Object)null)
						{
							if (__instance.HealAuraCurseName4.IsAura)
							{
								stringBuilder4.Append(medsSpriteText(__instance.HealAuraCurseName4.ACName));
							}
							else
							{
								stringBuilder5.Append(medsSpriteText(__instance.HealAuraCurseName4.ACName));
							}
						}
						if (stringBuilder4.Length > 0)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsPurge", ""), stringBuilder4.ToString()));
							stringBuilder.Append("\n");
						}
						if (stringBuilder5.Length > 0)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDispel", ""), stringBuilder5.ToString()));
							stringBuilder.Append("\n");
						}
						if (__instance.HealCurses > 0)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDispel", ""), medsColorTextArray("curse", __instance.HealCurses.ToString())));
							stringBuilder.Append("\n");
						}
						if (__instance.HealCurses == -1)
						{
							stringBuilder.Append(Texts.Instance.GetText("cardsDispelAll", ""));
							stringBuilder.Append("\n");
						}
						if ((Object)(object)__instance.HealAuraCurseSelf != (Object)null)
						{
							if (__instance.HealAuraCurseSelf.IsAura)
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsPurgeYour", ""), medsSpriteText(__instance.HealAuraCurseSelf.ACName)));
							}
							else
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDispelYour", ""), medsSpriteText(__instance.HealAuraCurseSelf.ACName)));
							}
							stringBuilder.Append("\n");
						}
					}
					else
					{
						if (__instance.HealCurses > 0)
						{
							if ((int)__instance.TargetSide == 0)
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsPurge", ""), __instance.HealCurses));
							}
							else
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDispel", ""), __instance.HealCurses));
							}
							stringBuilder.Append("\n");
						}
						if ((Object)(object)__instance.HealAuraCurseName4 != (Object)null && (Object)(object)__instance.HealAuraCurseName3 == (Object)null)
						{
							StringBuilder stringBuilder6 = new StringBuilder();
							StringBuilder stringBuilder7 = new StringBuilder();
							if (__instance.HealAuraCurseName4.IsAura)
							{
								stringBuilder6.Append(medsSpriteText(__instance.HealAuraCurseName4.ACName));
							}
							else
							{
								stringBuilder7.Append(medsSpriteText(__instance.HealAuraCurseName4.ACName));
							}
							if (stringBuilder6.Length > 0)
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsPurge", ""), stringBuilder6.ToString()));
								stringBuilder.Append("\n");
							}
							if (stringBuilder7.Length > 0)
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDispel", ""), stringBuilder7.ToString()));
								stringBuilder.Append("\n");
							}
						}
					}
					if (__instance.TransferCurses > 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsTransferCurse", ""), __instance.TransferCurses.ToString()));
						stringBuilder.Append("\n");
					}
					if (__instance.StealAuras > 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsStealAuras", ""), __instance.StealAuras.ToString()));
						stringBuilder.Append("\n");
					}
					if (__instance.IncreaseAuras > 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsIncreaseAura", ""), __instance.IncreaseAuras.ToString()));
						stringBuilder.Append("\n");
					}
					if (__instance.IncreaseCurses > 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsIncreaseCurse", ""), __instance.IncreaseCurses.ToString()));
						stringBuilder.Append("\n");
					}
					if (__instance.ReduceAuras > 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsReduceAura", ""), __instance.ReduceAuras.ToString()));
						stringBuilder.Append("\n");
					}
					if (__instance.ReduceCurses > 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsReduceCurse", ""), __instance.ReduceCurses.ToString()));
						stringBuilder.Append("\n");
					}
					int num3 = 0;
					if (__instance.Damage > 0 && !__instance.DamageSpecialValue1 && !__instance.DamageSpecialValue2 && !__instance.DamageSpecialValueGlobal)
					{
						int num4 = num3 + 1;
						num3 = num4;
						stringBuilder2.Append(medsColorTextArray("damage", medsNumFormat(__instance.DamagePreCalculated), medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType))));
						if (__instance.Damage2 > 0 && __instance.DamageType == __instance.DamageType2 && (__instance.Damage2SpecialValue1 || __instance.Damage2SpecialValue2 || __instance.Damage2SpecialValueGlobal))
						{
							stringBuilder2.Append("<space=-.3>");
							stringBuilder2.Append("+");
							stringBuilder2.Append(medsColorTextArray("damage", "X", medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType))));
						}
					}
					if (__instance.Damage2 > 0 && !__instance.Damage2SpecialValue1 && !__instance.Damage2SpecialValue2 && !__instance.Damage2SpecialValueGlobal)
					{
						int num4 = num3 + 1;
						num3 = num4;
						stringBuilder2.Append(medsColorTextArray("damage", medsNumFormat(__instance.DamagePreCalculated2), medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType2))));
					}
					if (num3 > 0)
					{
						if (flag4 && num3 > 1)
						{
							stringBuilder2.Insert(0, value5);
							stringBuilder2.Insert(0, "\n");
						}
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDealDamage", ""), stringBuilder2.ToString()));
						stringBuilder.Append("\n");
						stringBuilder2.Clear();
					}
					int num5 = 0;
					if (__instance.DamageSelf > 0)
					{
						int num4 = num5 + 1;
						num5 = num4;
						if (__instance.DamageSpecialValueGlobal || __instance.DamageSpecialValue1 || __instance.DamageSpecialValue2)
						{
							stringBuilder2.Append(medsColorTextArray("damage", "X", medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType))));
						}
						else
						{
							stringBuilder2.Append(medsColorTextArray("damage", medsNumFormat(__instance.DamageSelfPreCalculated), medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType))));
						}
					}
					if (__instance.DamageSelf2 > 0)
					{
						int num4 = num5 + 1;
						num5 = num4;
						if (__instance.Damage2SpecialValueGlobal || __instance.Damage2SpecialValue1 || __instance.Damage2SpecialValue2)
						{
							stringBuilder2.Append(medsColorTextArray("damage", "X", medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType2))));
						}
						else
						{
							stringBuilder2.Append(medsColorTextArray("damage", medsNumFormat(__instance.DamageSelfPreCalculated2), medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType2))));
						}
					}
					if (num5 > 0)
					{
						if (num5 > 2)
						{
							stringBuilder2.Insert(0, value5);
							stringBuilder2.Insert(0, "\n");
						}
						if ((int)__instance.TargetSide == 3)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsSuffer", ""), stringBuilder2.ToString()));
							stringBuilder.Append("\n");
						}
						else
						{
							stringBuilder3.Append(string.Format(Texts.Instance.GetText("cardsYouSuffer", ""), stringBuilder2.ToString()));
							stringBuilder3.Append("\n");
						}
						stringBuilder2.Clear();
					}
					if (stringBuilder3.Length > 0)
					{
						stringBuilder.Append(stringBuilder3.ToString());
						stringBuilder3.Clear();
					}
					if ((double)__instance.HealSelfPerDamageDonePercent > 0.0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsHealSelfPerDamage", ""), __instance.HealSelfPerDamageDonePercent.ToString()));
						stringBuilder.Append("\n");
					}
					if (__instance.SelfHealthLoss != 0 && !__instance.SelfHealthLossSpecialGlobal)
					{
						if (__instance.SelfHealthLossSpecialValue1)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsLoseHp", ""), medsColorTextArray("damage", "X HP")));
						}
						else
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsLoseHp", ""), medsColorTextArray("damage", medsNumFormat(__instance.SelfHealthLoss), "HP")));
						}
						stringBuilder.Append("\n");
					}
					if (((int)__instance.TargetSide == 1 || (int)__instance.TargetSide == 4) && (int)__instance.SpecialValueGlobal == 1 && (Object)(object)__instance.SpecialAuraCurseNameGlobal != (Object)null && (double)__instance.SpecialValueModifierGlobal > 0.0)
					{
						flag = true;
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsShareYour", ""), medsSpriteText(__instance.SpecialAuraCurseNameGlobal.ACName)));
						stringBuilder.Append("\n");
					}
					if (!__instance.Damage2SpecialValue1 && !flag && ((int)__instance.SpecialValueGlobal != 0 || (int)__instance.SpecialValue1 != 0 || (int)__instance.SpecialValue2 > 0) && !__instance.DamageSpecialValueGlobal && !__instance.DamageSpecialValue1 && !__instance.DamageSpecialValue2)
					{
						if ((int)__instance.TargetSide == 3 && ((int)__instance.SpecialValueGlobal == 2 || (int)__instance.SpecialValueGlobal == 1))
						{
							if ((Object)(object)__instance.SpecialAuraCurseNameGlobal != (Object)null)
							{
								text = medsSpriteText(__instance.SpecialAuraCurseNameGlobal.ACName);
							}
							if (__instance.AuraChargesSpecialValueGlobal)
							{
								if ((Object)(object)__instance.Aura != (Object)null)
								{
									text2 = medsSpriteText(__instance.Aura.ACName);
								}
								if ((Object)(object)__instance.Aura2 != (Object)null && __instance.AuraCharges2SpecialValueGlobal)
								{
									text3 = medsSpriteText(__instance.Aura2.ACName);
								}
							}
							else if (__instance.CurseChargesSpecialValueGlobal)
							{
								if ((Object)(object)__instance.Curse != (Object)null)
								{
									text2 = medsSpriteText(__instance.Curse.ACName);
								}
								if ((Object)(object)__instance.Curse2 != (Object)null && __instance.CurseCharges2SpecialValueGlobal)
								{
									text3 = medsSpriteText(__instance.Curse2.ACName);
								}
							}
						}
						else if ((int)__instance.SpecialValue1 == 2)
						{
							if ((Object)(object)__instance.SpecialAuraCurseName1 != (Object)null)
							{
								text = medsSpriteText(__instance.SpecialAuraCurseName1.ACName);
							}
							if (__instance.AuraChargesSpecialValue1)
							{
								if ((Object)(object)__instance.Aura != (Object)null)
								{
									text2 = medsSpriteText(__instance.Aura.ACName);
								}
								if ((Object)(object)__instance.Aura2 != (Object)null && __instance.AuraCharges2SpecialValue1)
								{
									text3 = medsSpriteText(__instance.Aura2.ACName);
								}
							}
							else if (__instance.CurseChargesSpecialValue1)
							{
								if ((Object)(object)__instance.Curse != (Object)null)
								{
									text2 = medsSpriteText(__instance.Curse.ACName);
								}
								if ((Object)(object)__instance.Curse2 != (Object)null && __instance.CurseCharges2SpecialValue1)
								{
									text3 = medsSpriteText(__instance.Curse2.ACName);
								}
							}
						}
						if (text != "" && text2 != "")
						{
							flag2 = true;
							if (text == text2)
							{
								if ((int)__instance.SpecialValueGlobal == 2)
								{
									if ((double)__instance.SpecialValueModifierGlobal == 100.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDoubleTarget", ""), text));
										stringBuilder.Append("\n");
									}
									else if ((double)__instance.SpecialValueModifierGlobal == 200.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsTripleTarget", ""), text));
										stringBuilder.Append("\n");
									}
									else if ((double)__instance.SpecialValueModifierGlobal < 100.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsLosePercentTarget", ""), (float)(100.0 - (double)__instance.SpecialValueModifierGlobal), text));
										stringBuilder.Append("\n");
									}
								}
								else if ((int)__instance.SpecialValueGlobal == 1)
								{
									if ((double)__instance.SpecialValueModifierGlobal == 100.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDoubleYour", ""), text));
										stringBuilder.Append("\n");
									}
									else if ((double)__instance.SpecialValueModifierGlobal == 200.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsTripleYour", ""), text));
										stringBuilder.Append("\n");
									}
									else if ((double)__instance.SpecialValueModifierGlobal < 100.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsLosePercentYour", ""), (float)(100.0 - (double)__instance.SpecialValueModifierGlobal), text));
										stringBuilder.Append("\n");
									}
								}
								else if ((int)__instance.SpecialValue1 == 2)
								{
									if ((double)__instance.SpecialValueModifier1 == 100.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDoubleTarget", ""), text));
										stringBuilder.Append("\n");
									}
									else if ((double)__instance.SpecialValueModifier1 == 200.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsTripleTarget", ""), text));
										stringBuilder.Append("\n");
									}
									else if ((double)__instance.SpecialValueModifier1 < 100.0 && (Object)(object)__instance.HealAuraCurseName != (Object)null)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsLosePercentTarget", ""), (float)(100.0 - (double)__instance.SpecialValueModifier1), text));
										stringBuilder.Append("\n");
									}
									else
									{
										flag2 = false;
									}
								}
								else if ((int)__instance.SpecialValue1 == 1)
								{
									if ((double)__instance.SpecialValueModifier1 == 100.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDoubleYour", ""), text));
										stringBuilder.Append("\n");
									}
									else if ((double)__instance.SpecialValueModifier1 == 200.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsTripleYour", ""), text));
										stringBuilder.Append("\n");
									}
									else if ((double)__instance.SpecialValueModifier1 < 100.0)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsLosePercentYour", ""), (float)(100.0 - (double)__instance.SpecialValueModifier1), text));
										stringBuilder.Append("\n");
									}
								}
							}
							else
							{
								stringBuilder2.Append(text2);
								if ((double)__instance.SpecialValueModifier1 > 0.0)
								{
									num2 = __instance.SpecialValueModifier1 / 100f;
								}
								if ((double)num2 > 0.0 && (double)num2 != 1.0)
								{
									text4 = "x " + num2;
								}
								if (text4 != "")
								{
									stringBuilder2.Append(" <c>");
									stringBuilder2.Append(text4);
									stringBuilder2.Append("</c>");
								}
								if (text3 != "")
								{
									stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsTransformIntoAnd", ""), text, stringBuilder2.ToString(), text3));
								}
								else
								{
									stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsTransformInto", ""), text, stringBuilder2.ToString()));
								}
								stringBuilder.Append("\n");
								stringBuilder2.Clear();
								num2 = 0f;
								text4 = "";
							}
						}
					}
					if (__instance.EnergyRechargeSpecialValueGlobal)
					{
						stringBuilder2.Append(medsColorTextArray("aura", "X", medsSpriteText("energy")));
					}
					int num6 = 0;
					if (__instance.Damage > 0 && (__instance.DamageSpecialValue1 || __instance.DamageSpecialValueGlobal))
					{
						stringBuilder2.Append(medsColorTextArray("damage", "X", medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType))));
						int num4 = num6 + 1;
						num6 = num4;
					}
					if (__instance.Damage2 > 0 && (__instance.DamageSpecialValue2 || __instance.DamageSpecialValueGlobal))
					{
						stringBuilder2.Append(medsColorTextArray("damage", "X", medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType2))));
						int num4 = num6 + 1;
						num6 = num4;
					}
					else if (__instance.Damage2 > 0 && __instance.Damage2SpecialValueGlobal && __instance.DamageType != __instance.DamageType2)
					{
						stringBuilder2.Append(medsColorTextArray("damage", "X", medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType2))));
						int num4 = num6 + 1;
						num6 = num4;
					}
					if (__instance.Damage2 > 0 && __instance.Damage2SpecialValue1 && (__instance.DamageSpecialValue1 || __instance.DamageSpecialValue2 || __instance.DamageSpecialValueGlobal))
					{
						stringBuilder2.Append(medsColorTextArray("damage", "X", medsSpriteText(Enum.GetName(typeof(DamageType), __instance.DamageType2))));
						int num4 = num6 + 1;
						num6 = num4;
					}
					if (num6 > 0)
					{
						if (flag4 && num6 > 1)
						{
							stringBuilder2.Insert(0, value5);
							stringBuilder2.Insert(0, "\n");
						}
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDealDamage", ""), stringBuilder2.ToString()));
						stringBuilder.Append("\n");
						stringBuilder2.Clear();
					}
					AuraCurseData val = null;
					if (!flag && !flag2)
					{
						int num7 = 0;
						if ((Object)(object)__instance.Aura != (Object)null && (__instance.AuraChargesSpecialValue1 || __instance.AuraChargesSpecialValueGlobal))
						{
							int num4 = num7 + 1;
							num7 = num4;
							stringBuilder2.Append(medsColorTextArray("aura", "X", medsSpriteText(__instance.Aura.ACName)));
							val = __instance.Aura;
						}
						if ((Object)(object)__instance.Aura2 != (Object)null && (__instance.AuraCharges2SpecialValue1 || __instance.AuraCharges2SpecialValueGlobal))
						{
							int num4 = num7 + 1;
							num7 = num4;
							if ((Object)(object)__instance.Aura != (Object)null && (Object)(object)__instance.Aura == (Object)(object)__instance.Aura2)
							{
								stringBuilder2.Append(medsColorTextArray("aura", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.Aura.Id, __instance.AuraCharges, character)), medsSpriteText(__instance.Aura.ACName)));
								stringBuilder2.Append("+");
							}
							stringBuilder2.Append(medsColorTextArray("aura", "X", medsSpriteText(__instance.Aura2.ACName)));
							val = __instance.Aura2;
						}
						if ((Object)(object)__instance.Aura3 != (Object)null && (__instance.AuraCharges3SpecialValue1 || __instance.AuraCharges3SpecialValueGlobal))
						{
							int num4 = num7 + 1;
							num7 = num4;
							if ((Object)(object)__instance.Aura != (Object)null && (Object)(object)__instance.Aura == (Object)(object)__instance.Aura3)
							{
								stringBuilder2.Append(medsColorTextArray("aura", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.Aura.Id, __instance.AuraCharges, character)), medsSpriteText(__instance.Aura.ACName)));
								stringBuilder2.Append("+");
							}
							if ((Object)(object)__instance.Aura2 != (Object)null && (Object)(object)__instance.Aura == (Object)(object)__instance.Aura3)
							{
								stringBuilder2.Append(medsColorTextArray("aura", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.Aura2.Id, __instance.AuraCharges2, character)), medsSpriteText(__instance.Aura3.ACName)));
								stringBuilder2.Append("+");
							}
							stringBuilder2.Append(medsColorTextArray("aura", "X", medsSpriteText(__instance.Aura3.ACName)));
							val = __instance.Aura3;
						}
						if (num7 > 0)
						{
							if ((int)__instance.TargetSide == 3)
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsGain", ""), stringBuilder2.ToString()));
							}
							else
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsGrant", ""), stringBuilder2.ToString()));
							}
							stringBuilder.Append("\n");
							stringBuilder2.Clear();
						}
					}
					if (!flag && !flag2)
					{
						int num8 = 0;
						if ((Object)(object)__instance.Curse != (Object)null && (__instance.CurseChargesSpecialValue1 || __instance.CurseChargesSpecialValueGlobal))
						{
							int num4 = num8 + 1;
							num8 = num4;
							stringBuilder2.Append(medsColorTextArray("curse", "X", medsSpriteText(__instance.Curse.ACName)));
						}
						if ((Object)(object)__instance.Curse2 != (Object)null && (__instance.CurseCharges2SpecialValue1 || __instance.CurseCharges2SpecialValueGlobal))
						{
							int num4 = num8 + 1;
							num8 = num4;
							stringBuilder2.Append(medsColorTextArray("curse", "X", medsSpriteText(__instance.Curse2.ACName)));
						}
						if ((Object)(object)__instance.Curse3 != (Object)null && (__instance.CurseCharges3SpecialValue1 || __instance.CurseCharges3SpecialValueGlobal))
						{
							int num4 = num8 + 1;
							num8 = num4;
							stringBuilder2.Append(medsColorTextArray("curse", "X", medsSpriteText(__instance.Curse3.ACName)));
						}
						if (num8 > 0)
						{
							if ((int)__instance.TargetSide == 3)
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsSuffer", ""), stringBuilder2.ToString()));
							}
							else
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsApply", ""), stringBuilder2.ToString()));
							}
							stringBuilder.Append("\n");
							stringBuilder2.Clear();
						}
						int num9 = 0;
						if ((Object)(object)__instance.CurseSelf != (Object)null && (__instance.CurseChargesSpecialValue1 || __instance.CurseChargesSpecialValueGlobal))
						{
							int num4 = num9 + 1;
							num9 = num4;
							stringBuilder2.Append(medsColorTextArray("curse", "X", medsSpriteText(__instance.CurseSelf.ACName)));
						}
						if ((Object)(object)__instance.CurseSelf2 != (Object)null && (__instance.CurseCharges2SpecialValue1 || __instance.CurseCharges2SpecialValueGlobal))
						{
							int num4 = num9 + 1;
							num9 = num4;
							stringBuilder2.Append(medsColorTextArray("curse", "X", medsSpriteText(__instance.CurseSelf2.ACName)));
						}
						if ((Object)(object)__instance.CurseSelf3 != (Object)null && (__instance.CurseCharges3SpecialValue1 || __instance.CurseCharges3SpecialValueGlobal))
						{
							int num4 = num9 + 1;
							num9 = num4;
							stringBuilder2.Append(medsColorTextArray("curse", "X", medsSpriteText(__instance.CurseSelf3.ACName)));
						}
						if (num9 > 0)
						{
							if ((int)__instance.TargetSide == 3 || (Object)(object)__instance.CurseSelf != (Object)null || (Object)(object)__instance.CurseSelf2 != (Object)null || (Object)(object)__instance.CurseSelf3 != (Object)null)
							{
								if ((int)__instance.TargetSide == 3)
								{
									stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsSuffer", ""), stringBuilder2.ToString()));
									stringBuilder.Append("\n");
								}
								else if (!flag3)
								{
									stringBuilder3.Append(string.Format(Texts.Instance.GetText("cardsYouSuffer", ""), stringBuilder2.ToString()));
									stringBuilder3.Append("\n");
								}
								else
								{
									stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsYouSuffer", ""), stringBuilder2.ToString()));
									stringBuilder.Append("\n");
								}
							}
							else
							{
								stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsApply", ""), stringBuilder2.ToString()));
								stringBuilder.Append("\n");
							}
							stringBuilder2.Clear();
						}
					}
					int num10 = 0;
					if (__instance.Heal > 0 && (__instance.HealSpecialValue1 || __instance.HealSpecialValueGlobal))
					{
						stringBuilder2.Append(medsColorTextArray("heal", "X", medsSpriteText("heal")));
						num = num10 + 1;
					}
					if (stringBuilder2.Length > 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsHeal", ""), stringBuilder2.ToString()));
						stringBuilder.Append("\n");
						stringBuilder2.Clear();
					}
					int num11 = 0;
					if (__instance.HealSelf > 0 && (__instance.HealSelfSpecialValue1 || __instance.HealSelfSpecialValueGlobal))
					{
						stringBuilder2.Append(medsColorTextArray("heal", "X", medsSpriteText("heal")));
						num = num11 + 1;
					}
					if (stringBuilder2.Length > 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsHealSelf", ""), stringBuilder2.ToString()));
						stringBuilder.Append("\n");
						stringBuilder2.Clear();
					}
					if (!flag && !flag2)
					{
						if ((double)__instance.SpecialValueModifierGlobal > 0.0)
						{
							num2 = __instance.SpecialValueModifierGlobal / 100f;
						}
						else if ((double)__instance.SpecialValueModifier1 > 0.0)
						{
							num2 = __instance.SpecialValueModifier1 / 100f;
						}
						if ((double)num2 > 0.0 && (double)num2 != 1.0)
						{
							text4 = "x" + num2;
						}
						if (text4 == "")
						{
							text4 = "<space=-.1>";
						}
						if ((int)__instance.SpecialValue1 == 1)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYour", ""), medsSpriteText(__instance.SpecialAuraCurseName1.ACName), text4));
						}
						else if ((int)__instance.SpecialValue1 == 2)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsTarget", ""), medsSpriteText(__instance.SpecialAuraCurseName1.ACName), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 1)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYour", ""), medsSpriteText(__instance.SpecialAuraCurseNameGlobal.ACName), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 2)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsTarget", ""), medsSpriteText(__instance.SpecialAuraCurseNameGlobal.ACName), text4));
						}
						if ((int)__instance.SpecialValueGlobal == 6)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourHp", ""), text4));
						}
						else if ((int)__instance.SpecialValue1 == 6)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourHp", ""), text4));
						}
						else if ((int)__instance.SpecialValue1 == 7)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsTargetHp", ""), text4));
						}
						if ((int)__instance.SpecialValueGlobal == 12)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourSpeed", ""), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 13)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsTargetSpeed", ""), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 14 || (int)__instance.SpecialValue1 == 14)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsDifferenceSpeed", ""), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 17)
						{
							if ((int)__instance.DiscardCardPlace == 4)
							{
								stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourVanishedCards", ""), text4));
							}
							else
							{
								stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourDiscardedCards", ""), text4));
							}
						}
						else if ((int)__instance.SpecialValueGlobal == 18)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourVanishedCards", ""), text4));
						}
						if ((int)__instance.SpecialValueGlobal == 3 || (int)__instance.SpecialValue1 == 3 || (int)__instance.SpecialValue2 == 3)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourHand", ""), medsSpriteText("card"), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 4 || (int)__instance.SpecialValue1 == 4 || (int)__instance.SpecialValue2 == 4)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourDeck", ""), medsSpriteText("card"), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 5 || (int)__instance.SpecialValue1 == 5 || (int)__instance.SpecialValue2 == 5)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourDiscard", ""), medsSpriteText("card"), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 8 || (int)__instance.SpecialValue1 == 8 || (int)__instance.SpecialValue2 == 8)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourVanish", ""), medsSpriteText("card"), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 9 || (int)__instance.SpecialValue1 == 9 || (int)__instance.SpecialValue2 == 9)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsTargetDeck", ""), medsSpriteText("card"), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 10 || (int)__instance.SpecialValue1 == 10 || (int)__instance.SpecialValue2 == 10)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsTargetDiscard", ""), medsSpriteText("card"), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 11 || (int)__instance.SpecialValue1 == 11 || (int)__instance.SpecialValue2 == 11)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsTargetVanish", ""), medsSpriteText("card"), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 15 || (int)__instance.SpecialValue1 == 15)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsYourMissingHealth", ""), text4));
						}
						else if ((int)__instance.SpecialValueGlobal == 16 || (int)__instance.SpecialValue1 == 16)
						{
							stringBuilder2.Append(string.Format(Texts.Instance.GetText("cardsXEqualsTargetMissingHealth", ""), text4));
						}
						if (stringBuilder2.Length > 0)
						{
							stringBuilder.Append(value8);
							stringBuilder.Append(stringBuilder2);
							stringBuilder.Append(value7);
							stringBuilder.Append("\n");
							stringBuilder2.Clear();
							if ((Object)(object)__instance.HealAuraCurseName != (Object)null)
							{
								if ((int)__instance.TargetSide == 3)
								{
									if (__instance.HealAuraCurseName.IsAura)
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsPurgeYour", ""), medsSpriteText(__instance.HealAuraCurseName.ACName)));
									}
									else
									{
										stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDispelYour", ""), medsSpriteText(__instance.HealAuraCurseName.ACName)));
									}
								}
								else if (__instance.HealAuraCurseName.IsAura)
								{
									stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsPurge", ""), medsSpriteText(__instance.HealAuraCurseName.ACName)));
								}
								else
								{
									stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDispel", ""), medsSpriteText(__instance.HealAuraCurseName.ACName)));
								}
								stringBuilder.Append("\n");
							}
							if ((Object)(object)__instance.HealAuraCurseSelf != (Object)null)
							{
								if (__instance.HealAuraCurseSelf.IsAura)
								{
									stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsPurgeYour", ""), medsSpriteText(__instance.HealAuraCurseSelf.ACName)));
								}
								else
								{
									stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsDispelYour", ""), medsSpriteText(__instance.HealAuraCurseSelf.ACName)));
								}
								stringBuilder.Append("\n");
							}
						}
						num2 = 0f;
					}
					if (__instance.SelfHealthLoss > 0 && __instance.SelfHealthLossSpecialGlobal)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsYouLose", ""), medsColorTextArray("damage", "X", "HP")));
						stringBuilder.Append("\n");
						stringBuilder2.Clear();
					}
					int num12 = 0;
					if ((Object)(object)__instance.CurseSelf != (Object)null && __instance.CurseCharges > 0)
					{
						int num4 = num12 + 1;
						num12 = num4;
						stringBuilder2.Append(medsColorTextArray("curse", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.CurseSelf.Id, __instance.CurseCharges, character)), medsSpriteText(__instance.CurseSelf.ACName)));
					}
					if ((Object)(object)__instance.CurseSelf2 != (Object)null && __instance.CurseCharges2 > 0)
					{
						int num4 = num12 + 1;
						num12 = num4;
						stringBuilder2.Append(medsColorTextArray("curse", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.CurseSelf2.Id, __instance.CurseCharges2, character)), medsSpriteText(__instance.CurseSelf2.ACName)));
					}
					if ((Object)(object)__instance.CurseSelf3 != (Object)null && __instance.CurseCharges3 > 0)
					{
						int num4 = num12 + 1;
						num12 = num4;
						stringBuilder2.Append(medsColorTextArray("curse", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.CurseSelf3.Id, __instance.CurseCharges3, character)), medsSpriteText(__instance.CurseSelf3.ACName)));
					}
					if (num12 > 0)
					{
						if (num12 > 2)
						{
							stringBuilder2.Insert(0, value5);
							stringBuilder2.Insert(0, "\n");
						}
						if ((int)__instance.TargetSide == 3)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsSuffer", ""), stringBuilder2.ToString()));
							stringBuilder.Append("\n");
						}
						else
						{
							stringBuilder3.Append(string.Format(Texts.Instance.GetText("cardsYouSuffer", ""), stringBuilder2.ToString()));
							stringBuilder3.Append("\n");
						}
						stringBuilder2.Clear();
					}
					int num13 = 0;
					if (__instance.EnergyRecharge < 0)
					{
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsLoseHp", ""), stringBuilder2.Append(medsColorTextArray("system", medsNumFormat(Mathf.Abs(__instance.EnergyRecharge)), medsSpriteText("energy")))));
						stringBuilder.Append("\n");
						stringBuilder2.Clear();
					}
					if (__instance.EnergyRecharge > 0)
					{
						int num4 = num13 + 1;
						num13 = num4;
						stringBuilder2.Append(medsColorTextArray("system", medsNumFormat(__instance.EnergyRecharge), medsSpriteText("energy")));
					}
					if ((Object)(object)__instance.Aura != (Object)null && __instance.AuraCharges > 0 && (Object)(object)__instance.Aura != (Object)(object)val)
					{
						int num4 = num13 + 1;
						num13 = num4;
						stringBuilder2.Append(medsColorTextArray("aura", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.Aura.Id, __instance.AuraCharges, character)), medsSpriteText(__instance.Aura.ACName)));
					}
					if ((Object)(object)__instance.Aura2 != (Object)null && __instance.AuraCharges2 > 0 && (Object)(object)__instance.Aura2 != (Object)(object)val)
					{
						int num4 = num13 + 1;
						num13 = num4;
						stringBuilder2.Append(medsColorTextArray("aura", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.Aura2.Id, __instance.AuraCharges2, character)), medsSpriteText(__instance.Aura2.ACName)));
					}
					if ((Object)(object)__instance.Aura3 != (Object)null && __instance.AuraCharges3 > 0 && (Object)(object)__instance.Aura3 != (Object)(object)val)
					{
						int num4 = num13 + 1;
						num13 = num4;
						stringBuilder2.Append(medsColorTextArray("aura", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.Aura3.Id, __instance.AuraCharges3, character)), medsSpriteText(__instance.Aura3.ACName)));
					}
					if (num13 > 0)
					{
						if (num13 > 2)
						{
							stringBuilder2.Insert(0, value5);
							stringBuilder2.Insert(0, "\n");
						}
						if ((int)__instance.TargetSide == 3)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsGain", ""), stringBuilder2.ToString()));
						}
						else
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsGrant", ""), stringBuilder2.ToString()));
						}
						stringBuilder.Append("\n");
						stringBuilder2.Clear();
					}
					int num14 = 0;
					if ((Object)(object)__instance.AuraSelf != (Object)null && __instance.AuraCharges > 0)
					{
						int num4 = num14 + 1;
						num14 = num4;
						stringBuilder2.Append(medsColorTextArray("aura", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.AuraSelf.Id, __instance.AuraCharges, character)), medsSpriteText(__instance.AuraSelf.ACName)));
					}
					if ((Object)(object)__instance.AuraSelf2 != (Object)null && __instance.AuraCharges2 > 0)
					{
						int num4 = num14 + 1;
						num14 = num4;
						stringBuilder2.Append(medsColorTextArray("aura", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.AuraSelf2.Id, __instance.AuraCharges2, character)), medsSpriteText(__instance.AuraSelf2.ACName)));
					}
					if ((Object)(object)__instance.AuraSelf3 != (Object)null && __instance.AuraCharges3 > 0)
					{
						int num4 = num14 + 1;
						num14 = num4;
						stringBuilder2.Append(medsColorTextArray("aura", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.AuraSelf3.Id, __instance.AuraCharges3, character)), medsSpriteText(__instance.AuraSelf3.ACName)));
					}
					if (!flag)
					{
						if ((Object)(object)__instance.AuraSelf != (Object)null && (__instance.AuraChargesSpecialValue1 || __instance.AuraChargesSpecialValueGlobal))
						{
							int num4 = num14 + 1;
							num14 = num4;
							stringBuilder2.Append(medsColorTextArray("aura", "X", medsSpriteText(__instance.AuraSelf.ACName)));
						}
						if ((Object)(object)__instance.AuraSelf2 != (Object)null && (__instance.AuraCharges2SpecialValue1 || __instance.AuraCharges2SpecialValueGlobal))
						{
							int num4 = num14 + 1;
							num14 = num4;
							stringBuilder2.Append(medsColorTextArray("aura", "X", medsSpriteText(__instance.AuraSelf2.ACName)));
						}
						if ((Object)(object)__instance.AuraSelf3 != (Object)null && (__instance.AuraCharges3SpecialValue1 || __instance.AuraCharges3SpecialValueGlobal))
						{
							int num4 = num14 + 1;
							num14 = num4;
							stringBuilder2.Append(medsColorTextArray("aura", "X", medsSpriteText(__instance.AuraSelf3.ACName)));
						}
					}
					if (num14 > 0)
					{
						if (num14 > 2)
						{
							stringBuilder2.Insert(0, value5);
							stringBuilder2.Insert(0, "\n");
						}
						if ((int)__instance.TargetSide == 3)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsGain", ""), stringBuilder2.ToString()));
							stringBuilder.Append("\n");
						}
						else
						{
							stringBuilder3.Append(string.Format(Texts.Instance.GetText("cardsYouGain", ""), stringBuilder2.ToString()));
							stringBuilder3.Append("\n");
						}
						stringBuilder2.Clear();
					}
					int num15 = 0;
					if (__instance.CurseCharges > 0 && (Object)(object)__instance.Curse != (Object)null)
					{
						int num4 = num15 + 1;
						num15 = num4;
						stringBuilder2.Append(medsColorTextArray("curse", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.Curse.Id, __instance.CurseCharges, character)), medsSpriteText(__instance.Curse.ACName)));
					}
					if (__instance.CurseCharges2 > 0 && (Object)(object)__instance.Curse2 != (Object)null)
					{
						int num4 = num15 + 1;
						num15 = num4;
						stringBuilder2.Append(medsColorTextArray("curse", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.Curse2.Id, __instance.CurseCharges2, character)), medsSpriteText(__instance.Curse2.ACName)));
					}
					if (__instance.CurseCharges3 > 0 && (Object)(object)__instance.Curse3 != (Object)null)
					{
						int num4 = num15 + 1;
						num15 = num4;
						stringBuilder2.Append(medsColorTextArray("curse", medsNumFormat(medsGetFinalAuraCharges(__instance.CardClass, __instance.Curse3.Id, __instance.CurseCharges3, character)), medsSpriteText(__instance.Curse3.ACName)));
					}
					if (num15 > 0)
					{
						if (num15 > 2)
						{
							stringBuilder2.Insert(0, value5);
							stringBuilder2.Insert(0, "\n");
						}
						if ((int)__instance.TargetSide == 3)
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsSuffer", ""), stringBuilder2.ToString()));
						}
						else
						{
							stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsApply", ""), stringBuilder2.ToString()));
						}
						stringBuilder.Append("\n");
						stringBuilder2.Clear();
					}
					if (__instance.Heal > 0 && !__instance.HealSpecialValue1 && !__instance.HealSpecialValueGlobal)
					{
						stringBuilder2.Append(medsColorTextArray("heal", medsNumFormat(value2), medsSpriteText("heal")));
						stringBuilder.Append(string.Format(Texts.Instance.GetText("cardsHeal", ""), stringBuilder2.ToString()));
						stringBuilder.Append("\n");
						stringBuilder2.Clear();
					}
					if (__instance.HealSelf > 0 && !__instance.HealSelfSpecialValue1 && !__instance.HealSelfSpecialValueGlobal)
					{
						stringBuilder2.Append(medsColorTextArray("heal", medsNumFormat(value

BepInEx/plugins/UniverseLib.Mono.dll

Decompiled 2 weeks 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.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using HarmonyLib;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UniverseLib.Config;
using UniverseLib.Input;
using UniverseLib.Runtime;
using UniverseLib.Runtime.Mono;
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.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("UniverseLib")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Sinai")]
[assembly: AssemblyProduct("UniverseLib")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")]
[assembly: AssemblyFileVersion("1.5.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.5.1.0")]
[module: UnverifiableCode]
public static class MonoExtensions
{
	private static PropertyInfo p_childControlHeight = AccessTools.Property(typeof(HorizontalOrVerticalLayoutGroup), "childControlHeight");

	private static PropertyInfo p_childControlWidth = AccessTools.Property(typeof(HorizontalOrVerticalLayoutGroup), "childControlWidth");

	public static void AddListener(this UnityEvent _event, Action listener)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		_event.AddListener(new UnityAction(listener.Invoke));
	}

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

	public static void RemoveListener(this UnityEvent _event, Action listener)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		_event.RemoveListener(new UnityAction(listener.Invoke));
	}

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

	public static void Clear(this StringBuilder sb)
	{
		sb.Remove(0, sb.Length);
	}

	public static void SetChildControlHeight(this HorizontalOrVerticalLayoutGroup group, bool value)
	{
		p_childControlHeight?.SetValue(group, value, null);
	}

	public static void SetChildControlWidth(this HorizontalOrVerticalLayoutGroup group, bool value)
	{
		p_childControlWidth?.SetValue(group, value, null);
	}
}
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);
			}
		}

		[Obsolete("This method is no longer necessary, just use Assembly.GetTypes().", false)]
		public static IEnumerable<Type> TryGetTypes(this Assembly asm)
		{
			return asm.GetTypes();
		}

		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;
				}
			}
			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 = e.InnerException;
			}
			return e;
		}
	}
	internal static class ReflectionPatches
	{
		internal static void Init()
		{
			Universe.Patch(typeof(Assembly), "GetTypes", (MethodType)0, new Type[0], null, null, AccessTools.Method(typeof(ReflectionPatches), "Finalizer_Assembly_GetTypes", (Type[])null, (Type[])null));
		}

		public static Exception Finalizer_Assembly_GetTypes(Assembly __instance, Exception __exception, ref Type[] __result)
		{
			if (__exception != null)
			{
				if (__exception is ReflectionTypeLoadException e)
				{
					__result = ReflectionUtility.TryExtractTypesFromException(e);
				}
				else
				{
					try
					{
						__result = __instance.GetExportedTypes();
					}
					catch (ReflectionTypeLoadException e2)
					{
						__result = ReflectionUtility.TryExtractTypesFromException(e2);
					}
					catch
					{
						__result = ArgumentUtility.EmptyTypes;
					}
				}
			}
			return null;
		}
	}
	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 Dictionary<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()
		{
			ReflectionPatches.Init();
			Instance = new ReflectionUtility();
			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 (Universe.Context == RuntimeContext.Mono)
			{
				ForceLoadManagedAssemblies();
			}
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly asm in assemblies)
			{
				CacheTypes(asm);
			}
			AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoaded;
		}

		private static void AssemblyLoaded(object sender, AssemblyLoadEventArgs args)
		{
			if ((object)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 path2 in files)
			{
				try
				{
					Assembly assembly = Assembly.LoadFile(path2);
					assembly.GetTypes();
				}
				catch
				{
				}
			}
		}

		internal static void CacheTypes(Assembly asm)
		{
			Type[] types = asm.GetTypes();
			foreach (Type type in types)
			{
				if (!string.IsNullOrEmpty(type.Namespace) && !uniqueNamespaces.Contains(type.Namespace))
				{
					uniqueNamespaces.Add(type.Namespace);
					int j;
					for (j = 0; j < AllNamespaces.Count && type.Namespace.CompareTo(AllNamespaces[j]) >= 0; j++)
					{
					}
					AllNamespaces.Insert(j, type.Namespace);
				}
				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 ((object)value2 == null)
			{
				value2 = 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 ((object)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) => (object)it != null).ToArray();
			}
			catch
			{
				return ArgumentUtility.EmptyTypes;
			}
		}

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

		public static Type[] GetAllBaseTypes(Type type)
		{
			if ((object)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 ((object)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 coro2 = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, DefaultTypesEnumerator());
			while (coro2.MoveNext())
			{
				yield return null;
			}
			OnTypeLoaded -= ourListener;
			if (resolvedTypes.Count > 0)
			{
				coro2 = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, resolvedTypes.GetEnumerator());
				while (coro2.MoveNext())
				{
					yield return null;
				}
			}
			onResultsFetched(set);
			void ourListener(Type t)
			{
				resolvedTypes.Add(t);
			}
		}

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

		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?.IsGenericParameter ?? false;
			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") || Enumerable.Contains(type.FullName, '<'))
					{
						continue;
					}
					if (!isGenericParam)
					{
						if ((object)baseType == null || baseType.IsAssignableFrom(type))
						{
							goto IL_0269;
						}
					}
					else if ((!type.IsClass || !MiscUtility.HasFlag(baseType.GenericParameterAttributes, GenericParameterAttributes.NotNullableValueTypeConstraint)) && (!type.IsValueType || !MiscUtility.HasFlag(baseType.GenericParameterAttributes, GenericParameterAttributes.ReferenceTypeConstraint)) && !baseType.GetGenericParameterConstraints().Any((Type it) => !it.IsAssignableFrom(type)))
					{
						goto IL_0269;
					}
					goto end_IL_009f;
					IL_0269:
					set.Add(type);
					end_IL_009f:;
				}
				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 ((object)genericTypeDefinition == typeof(IEnumerable<>) || (object)genericTypeDefinition == typeof(IList<>) || (object)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 && (object)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 MonoProvider();
			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);
	}
	internal class UniversalBehaviour : MonoBehaviour
	{
		internal static UniversalBehaviour Instance { get; private set; }

		internal static void Setup()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0015: 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)
			GameObject val = new GameObject("UniverseLibBehaviour");
			Object.DontDestroyOnLoad((Object)(object)val);
			((Object)val).hideFlags = (HideFlags)(((Object)val).hideFlags | 0x3D);
			Instance = val.AddComponent<UniversalBehaviour>();
		}

		internal void Update()
		{
			Universe.Update();
		}
	}
	public class Universe
	{
		public enum GlobalState
		{
			WaitingToSetup,
			SettingUp,
			SetupCompleted
		}

		public const string NAME = "UniverseLib";

		public const string VERSION = "1.5.1";

		public const string AUTHOR = "Sinai";

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

		private static float startupDelay;

		private static Action<string, LogType> logHandler;

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


		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.1 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.1 initialized.");
			CurrentGlobalState = GlobalState.SetupCompleted;
			InvokeOnInitialized(Universe.OnInitialized);
		}

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

		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_0025: Unknown result type (might be due to invalid IL or missing references)
			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_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Invalid comparison between Unknown and I4
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Invalid comparison between Unknown and I4
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Expected O, but got Unknown
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Expected O, but got Unknown
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: 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 ((object)methodInfo == null)
				{
					return false;
				}
				PatchProcessor val = Harmony.CreateProcessor((MethodBase)methodInfo);
				if ((object)prefix != null)
				{
					val.AddPrefix(new HarmonyMethod(prefix));
				}
				if ((object)postfix != null)
				{
					val.AddPostfix(new HarmonyMethod(postfix));
				}
				if ((object)finalizer != null)
				{
					val.AddFinalizer(new HarmonyMethod(finalizer));
				}
				val.Patch();
				return true;
			}
			catch (Exception arg)
			{
				LogWarning($"\t Exception patching {type.FullName}.{methodName}: {arg}");
				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_000f: 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_001e: 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_000f: 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)
		{
			return !string.IsNullOrEmpty(type?.FullName) && (type.IsPrimitive || type.IsEnum || nonPrimitiveTypes.Contains(type) || customTypes.ContainsKey(type.FullName));
		}

		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;
			}
			else
			{
				obj = default(T);
			}
			return result;
		}

		public static bool TryParse(string input, Type type, out object obj, out Exception parseException)
		{
			obj = null;
			parseException = null;
			if ((object)type == null)
			{
				return false;
			}
			if ((object)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 ((object)type == null || obj == null)
			{
				return null;
			}
			if ((object)type == typeof(string))
			{
				return obj as string;
			}
			if (type.IsEnum)
			{
				return Enum.IsDefined(type, obj) ? Enum.GetName(type, obj) : obj.ToString();
			}
			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 arg)
			{
				Universe.LogWarning($"Exception formatting object for input: {arg}");
				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_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			Vector2 val = default(Vector2);
			string[] array = input.Split(new char[1] { ' ' });
			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_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_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector2 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y);
		}

		internal static object TryParseVector3(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			string[] array = input.Split(new char[1] { ' ' });
			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_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_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector3 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y, val.z);
		}

		internal static object TryParseVector4(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			Vector4 val = default(Vector4);
			string[] array = input.Split(new char[1] { ' ' });
			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_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_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector4 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y, val.z, val.w);
		}

		internal static object TryParseQuaternion(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: 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_0092: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			string[] array = input.Split(new char[1] { ' ' });
			if (array.Length == 4)
			{
				Quaternion val2 = default(Quaternion);
				val2.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
				val2.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
				val2.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
				val2.w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
				return val2;
			}
			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_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_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_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Quaternion val) || 1 == 0)
			{
				return null;
			}
			Vector3 eulerAngles = ((Quaternion)(ref val)).eulerAngles;
			return FormatDecimalSequence(eulerAngles.x, eulerAngles.y, eulerAngles.z);
		}

		internal static object TryParseRect(string input)
		{
			//IL_0003: 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)
			Rect val = default(Rect);
			string[] array = input.Split(new char[1] { ' ' });
			((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_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)
			if (!(obj is Rect val) || 1 == 0)
			{
				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_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			Color val = default(Color);
			string[] array = input.Split(new char[1] { ' ' });
			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_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_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Color val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.r, val.g, val.b, val.a);
		}

		internal static object TryParseColor32(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			Color32 val = default(Color32);
			string[] array = input.Split(new char[1] { ' ' });
			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_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_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Color32 val) || 1 == 0)
			{
				return null;
			}
			return $"{val.r} {val.g} {val.b} {val.a}";
		}

		internal static object TryParseLayerMask(string input)
		{
			//IL_0007: 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_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)
			if (!(obj is LayerMask val) || 1 == 0)
			{
				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 ((object)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 ((object)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 ((object)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.Append("<color=" + GetClassColor(type) + ">").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 text = ((!method.IsStatic) ? "#ff8000" : "#b55b02");
			stringBuilder.Append("<color=" + text + ">" + method.Name + "</color>");
			if (method.IsGenericMethod)
			{
				stringBuilder.Append("<");
				Type[] genericArguments = method.GetGenericArguments();
				for (int i = 0; i < genericArguments.Length; i++)
				{
					Type type = genericArguments[i];
					if (type.IsGenericParameter)
					{
						stringBuilder.Append("<color=#92c470>" + genericArguments[i].Name + "</color>");
					}
					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 text2 = stringBuilder.ToString();
			highlightedMethods.Add(key, text2);
			return text2;
		}

		[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() && (object)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();
			}
			return ReflectionUtility.ProcessTypeInString(actualType, 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_0001: 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_003d: Unknown result type (might be due to invalid IL or missing references)
			byte b = (byte)Mathf.Clamp(Mathf.RoundToInt(color.r * 255f), 0, 255);
			byte b2 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.g * 255f), 0, 255);
			byte b3 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.b * 255f), 0, 255);
			return $"{b:X2}{b2:X2}{b3:X2}";
		}

		public static Color ToColor(this string _string)
		{
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: 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);
			Color result = default(Color);
			result.r = (float)((decimal)b / 255m);
			result.g = (float)((decimal)b2 / 255m);
			result.b = (float)((decimal)b3 / 255m);
			result.a = 1f;
			return result;
		}

		public static UnityEvent<string> GetOnEndEdit(this InputField _this)
		{
			if ((object)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
			{
				return Object.op_Implicit((Object)(object)RootObject) && RootObject.activeSelf;
			}
			set
			{
				UniversalUI.SetUIActive(ID, value);
			}
		}

		public UIBase(string id, Action updateMethod)
		{
			//IL_0063: 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_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: 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 val = RootObject.AddComponent<CanvasScaler>();
			val.referenceResolution = new Vector2(1920f, 1080f);
			val.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 arg)
			{
				Universe.LogWarning($"Exception invoking update method for {ID}: {arg}");
			}
		}
	}
	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_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_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			//IL_003e: 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);
			}
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = sizeDelta;
			return val;
		}

		internal static void SetDefaultTextValues(Text text)
		{
			//IL_0002: 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_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_0012: 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_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			Navigation navigation = selectable.navigation;
			((Navigation)(ref 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_0143: 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_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: 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_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			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);
			RectTransform component = val.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.anchoredPosition = Vector2.zero;
			component.sizeDelta = Vector2.zero;
			((Graphic)val.AddComponent<Image>()).color = Color.black;
			val.AddComponent<RectMask2D>();
			contentHolder = CreateUIObject("Content", val);
			Image val2 = contentHolder.AddComponent<Image>();
			val2.type = (Type)3;
			((Graphic)val2).color = (Color)((!bgColor.HasValue) ? new Color(0.07f, 0.07f, 0.07f) : bgColor.Value);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(contentHolder, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)3, (int?)3, (int?)3, (int?)3, (int?)3, (TextAnchor?)null);
			return val;
		}

		public static GameObject CreateVerticalGroup(GameObject parent, string name, bool forceWidth, bool forceHeight, bool childControlWidth, bool childControlHeight, int spacing = 0, Vector4 padding = default(Vector4), Color bgColor = default(Color), TextAnchor? childAlignment = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: 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_004e: 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_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: 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_009d: 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)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)forceWidth, (bool?)forceHeight, (bool?)childControlWidth, (bool?)childControlHeight, (int?)spacing, (int?)(int)padding.x, (int?)(int)padding.y, (int?)(int)padding.z, (int?)(int)padding.w, childAlignment);
			Image val2 = val.AddComponent<Image>();
			((Graphic)val2).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static GameObject CreateHorizontalGroup(GameObject parent, string name, bool forceExpandWidth, bool forceExpandHeight, bool childControlWidth, bool childControlHeight, int spacing = 0, Vector4 padding = default(Vector4), Color bgColor = default(Color), TextAnchor? childAlignment = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: 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_004e: 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_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: 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_009d: 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)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)forceExpandWidth, (bool?)forceExpandHeight, (bool?)childControlWidth, (bool?)childControlHeight, (int?)spacing, (int?)(int)padding.x, (int?)(int)padding.y, (int?)(int)padding.z, (int?)(int)padding.w, childAlignment);
			Image val2 = val.AddComponent<Image>();
			((Graphic)val2).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static GameObject CreateGridGroup(GameObject parent, string name, Vector2 cellSize, Vector2 spacing, Color bgColor = default(Color))
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: 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)
			GameObject val = CreateUIObject(name, parent);
			GridLayoutGroup val2 = val.AddComponent<GridLayoutGroup>();
			((LayoutGroup)val2).childAlignment = (TextAnchor)0;
			val2.cellSize = cellSize;
			val2.spacing = spacing;
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static Text CreateLabel(GameObject parent, string name, string defaultText, TextAnchor alignment = 3, Color color = default(Color), bool supportRichText = true, int fontSize = 14)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: 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_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: 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)
			GameObject val = CreateUIObject(name, parent);
			Text val2 = val.AddComponent<Text>();
			SetDefaultTextValues(val2);
			val2.text = defaultText;
			((Graphic)val2).color = ((color == default(Color)) ? defaultTextColor : color);
			val2.supportRichText = supportRichText;
			val2.alignment = alignment;
			val2.fontSize = fontSize;
			return val2;
		}

		public static ButtonRef CreateButton(GameObject parent, string name, string text, Color? normalColor = null)
		{
			//IL_0003: 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_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: 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)
			Color valueOrDefault = normalColor.GetValueOrDefault();
			if (!normalColor.HasValue)
			{
				((Color)(ref valueOrDefault))..ctor(0.25f, 0.25f, 0.25f);
				normalColor = valueOrDefault;
			}
			ButtonRef buttonRef = CreateButton(parent, name, text, default(ColorBlock));
			RuntimeHelper instance = RuntimeHelper.Instance;
			Button component = buttonRef.Component;
			Color? normal = normalColor;
			Color? val = normalColor;
			float num = 1.2f;
			Color? highlighted = (val.HasValue ? new Color?(val.GetValueOrDefault() * num) : null);
			val = normalColor;
			num = 0.7f;
			instance.Internal_SetColorBlock((Selectable)(object)component, normal, highlighted, val.HasValue ? new Color?(val.GetValueOrDefault() * num) : null);
			return buttonRef;
		}

		public static ButtonRef CreateButton(GameObject parent, string name, string text, ColorBlock colors)
		{
			//IL_0003: 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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Text", val);
			Image val3 = val.AddComponent<Image>();
			val3.type = (Type)1;
			((Graphic)val3).color = new Color(1f, 1f, 1f, 1f);
			Button val4 = val.AddComponent<Button>();
			SetDefaultSelectableValues((Selectable)(object)val4);
			((ColorBlock)(ref colors)).colorMultiplier = 1f;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)val4, colors);
			Text val5 = val2.AddComponent<Text>();
			val5.text = text;
			SetDefaultTextValues(val5);
			val5.alignment = (TextAnchor)4;
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.sizeDelta = Vector2.zero;
			SetButtonDeselectListener(val4);
			return new ButtonRef(val4);
		}

		internal static void SetButtonDeselectListener(Button button)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			((UnityEvent)button.onClick).AddListener((UnityAction)delegate
			{
				((Selectable)button).OnDeselect((BaseEventData)null);
			});
		}

		public static GameObject CreateSlider(GameObject parent, string name, out Slider slider)
		{
			//IL_0003: 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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: 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)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: 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_0129: 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_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Background", val);
			GameObject val3 = CreateUIObject("Fill Area", val);
			GameObject val4 = CreateUIObject("Fill", val3);
			GameObject val5 = CreateUIObject("Handle Slide Area", val);
			GameObject val6 = CreateUIObject("Handle", val5);
			Image val7 = val2.AddComponent<Image>();
			val7.type = (Type)1;
			((Graphic)val7).color = new Color(0.15f, 0.15f, 0.15f, 1f);
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0.25f);
			component.anchorMax = new Vector2(1f, 0.75f);
			component.sizeDelta = new Vector2(0f, 0f);
			RectTransform component2 = val3.GetComponent<RectTransform>();
			component2.anchorMin = new Vector2(0f, 0.25f);
			component2.anchorMax = new Vector2(1f, 0.75f);
			component2.anchoredPosition = new Vector2(-5f, 0f);
			component2.sizeDelta = new Vector2(-20f, 0f);
			Image val8 = val4.AddComponent<Image>();
			val8.type = (Type)1;
			((Graphic)val8).color = new Color(0.3f, 0.3f, 0.3f, 1f);
			val4.GetComponent<RectTransform>().sizeDelta = new Vector2(10f, 0f);
			RectTransform component3 = val5.GetComponent<RectTransform>();
			component3.sizeDelta = new Vector2(-20f, 0f);
			component3.anchorMin = new Vector2(0f, 0f);
			component3.anchorMax = new Vector2(1f, 1f);
			Image val9 = val6.AddComponent<Image>();
			((Graphic)val9).color = new Color(0.5f, 0.5f, 0.5f, 1f);
			val6.GetComponent<RectTransform>().sizeDelta = new Vector2(20f, 0f);
			slider = val.AddComponent<Slider>();
			slider.fillRect = val4.GetComponent<RectTransform>();
			slider.handleRect = val6.GetComponent<RectTransform>();
			((Selectable)slider).targetGraphic = (Graphic)(object)val9;
			slider.direction = (Direction)0;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)slider, (Color?)new Color(0.4f, 0.4f, 0.4f), (Color?)new Color(0.55f, 0.55f, 0.55f), (Color?)new Color(0.3f, 0.3f, 0.3f), (Color?)null);
			return val;
		}

		public static GameObject CreateScrollbar(GameObject parent, string name, out Scrollbar scrollbar)
		{
			//IL_0003: 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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Sliding Area", val);
			GameObject val3 = CreateUIObject("Handle", val2);
			Image val4 = val.AddComponent<Image>();
			val4.type = (Type)1;
			((Graphic)val4).color = new Color(0.1f, 0.1f, 0.1f);
			Image val5 = val3.AddComponent<Image>();
			val5.type = (Type)1;
			((Graphic)val5).color = new Color(0.4f, 0.4f, 0.4f);
			RectTransform component = val2.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(-20f, -20f);
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			RectTransform component2 = val3.GetComponent<RectTransform>();
			component2.sizeDelta = new Vector2(20f, 20f);
			scrollbar = val.AddComponent<Scrollbar>();
			scrollbar.handleRect = component2;
			((Selectable)scrollbar).targetGraphic = (Graphic)(object)val5;
			SetDefaultSelectableValues((Selectable)(object)scrollbar);
			return val;
		}

		public static GameObject CreateToggle(GameObject parent, string name, out Toggle toggle, out Text text, Color bgColor = default(Color), int checkWidth = 20, int checkHeight = 20)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: 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_01b8: 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)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)(TextAnchor)3);
			toggle = val.AddComponent<Toggle>();
			toggle.isOn = true;
			SetDefaultSelectableValues((Selectable)(object)toggle);
			Toggle t2 = toggle;
			((UnityEvent<bool>)(object)toggle.onValueChanged).AddListener((UnityAction<bool>)delegate
			{
				((Selectable)t2).OnDeselect((BaseEventData)null);
			});
			GameObject val2 = CreateUIObject("Background", val);
			Image val3 = val2.AddComponent<Image>();
			((Graphic)val3).color = (Color)((bgColor == default(Color)) ? new Color(0.04f, 0.04f, 0.04f, 0.75f) : bgColor);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val2, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)2, (int?)2, (int?)2, (int?)2, (TextAnchor?)null);
			SetLayoutElement(val2, checkWidth, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0);
			GameObject val4 = CreateUIObject("Checkmark", val2);
			Image val5 = val4.AddComponent<Image>();
			((Graphic)val5).color = new Color(0.8f, 1f, 0.8f, 0.3f);
			GameObject val6 = CreateUIObject("Label", val);
			text = val6.AddComponent<Text>();
			text.text = "";
			text.alignment = (TextAnchor)3;
			SetDefaultTextValues(text);
			SetLayoutElement(val6, 0, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0);
			toggle.graphic = (Graphic)(object)val5;
			((Selectable)toggle).targetGraphic = (Graphic)(object)val3;
			return val;
		}

		public static InputFieldRef CreateInputField(GameObject parent, string name, string placeHolderText)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: 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_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0135: 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_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_0296: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			Image val2 = val.AddComponent<Image>();
			val2.type = (Type)1;
			((Graphic)val2).color = new Color(0f, 0f, 0f, 0.5f);
			InputField val3 = val.AddComponent<InputField>();
			Navigation navigation = ((Selectable)val3).navigation;
			((Navigation)(ref navigation)).mode = (Mode)0;
			((Selectable)val3).navigation = navigation;
			val3.lineType = (LineType)0;
			((Selectable)val3).interactable = true;
			((Selectable)val3).transition = (Transition)1;
			((Selectable)val3).targetGraphic = (Graphic)(object)val2;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)val3, (Color?)new Color(1f, 1f, 1f, 1f), (Color?)new Color(0.95f, 0.95f, 0.95f, 1f), (Color?)new Color(0.78f, 0.78f, 0.78f, 1f), (Color?)null);
			GameObject val4 = CreateUIObject("TextArea", val);
			val4.AddComponent<RectMask2D>();
			RectTransform component = val4.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.offsetMin = Vector2.zero;
			component.offsetMax = Vector2.zero;
			GameObject val5 = CreateUIObject("Placeholder", val4);
			Text val6 = val5.AddComponent<Text>();
			SetDefaultTextValues(val6);
			val6.text = placeHolderText ?? "...";
			((Graphic)val6).color = new Color(0.5f, 0.5f, 0.5f, 1f);
			val6.horizontalOverflow = (HorizontalWrapMode)0;
			val6.alignment = (TextAnchor)3;
			val6.fontSize = 14;
			RectTransform component2 = val5.GetComponent<RectTransform>();
			component2.anchorMin = Vector2.zero;
			component2.anchorMax = Vector2.one;
			component2.offsetMin = Vector2.zero;
			component2.offsetMax = Vector2.zero;
			val3.placeholder = (Graphic)(object)val6;
			GameObject val7 = CreateUIObject("Text", val4);
			Text val8 = val7.AddComponent<Text>();
			SetDefaultTextValues(val8);
			val8.text = "";
			((Graphic)val8).color = new Color(1f, 1f, 1f, 1f);
			val8.horizontalOverflow = (HorizontalWrapMode)0;
			val8.alignment = (TextAnchor)3;
			val8.fontSize = 14;
			RectTransform component3 = val7.GetComponent<RectTransform>();
			component3.anchorMin = Vector2.zero;
			component3.anchorMax = Vector2.one;
			component3.offsetMin = Vector2.zero;
			component3.offsetMax = Vector2.zero;
			val3.textComponent = val8;
			val3.characterLimit = 16000;
			return new InputFieldRef(val3);
		}

		public static GameObject CreateDropdown(GameObject parent, string name, out Dropdown dropdown, string defaultItemText, int itemFontSize, Action<int> onValueChanged, string[] defaultOptions = null)
		{
			//IL_0009: 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)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: 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_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: 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_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing