Decompiled source of UIEnhancements v0.0.5

UIEnhancements.dll

Decompiled 4 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using DysonSphereProgram.Modding.UIEnhancements.UI.Builder;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("UIEnhancements")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+cfeda1093856cf9746ab70a9da992993de06e4f1")]
[assembly: AssemblyProduct("UIEnhancements")]
[assembly: AssemblyTitle("UIEnhancements")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	public record IsExternalInit;
}
namespace DysonSphereProgram.Modding.UIEnhancements
{
	public class EditableStationStorageMax : EnhancementBase
	{
		public static List<Text> patchedTexts = new List<Text>();

		public static List<InputField> patchedInputFields = new List<InputField>();

		public static ConfigEntry<int> sliderStep;

		public static ConfigEntry<int> sliderStepPercent;

		protected override string Name => "Editable Station Storage Max";

		[HarmonyPostfix]
		[HarmonyPatch(typeof(UIStationWindow), "_OnCreate")]
		public static void PatchStationWindow(ref UIStationWindow __instance)
		{
			for (int i = 0; i < __instance.storageUIs.Length; i++)
			{
				ref UIStationStorage reference = ref __instance.storageUIs[i];
				InputField item = PatchMaxValue(ref reference);
				patchedTexts.Add(reference.maxValueText);
				patchedInputFields.Add(item);
			}
		}

		private static InputField PatchMaxValue(ref UIStationStorage __instance)
		{
			UIStationStorage component = __instance;
			int result;
			DelegateDataBindSource<int, string> binding = new DelegateDataBindSource<int, string>(delegate
			{
				if (!Object.op_Implicit((Object)(object)component))
				{
					return 0;
				}
				if (component.station == null)
				{
					return 0;
				}
				return (component.index < component.station.storage.Length) ? component.station.storage[component.index].max : 0;
			}, delegate(int newMax)
			{
				if (Object.op_Implicit((Object)(object)component) && component.station != null && component.index < component.station.storage.Length && newMax >= 0)
				{
					component.station.storage[component.index].max = newMax;
				}
			}, DataBindTransform.From((int x) => x.ToString(), (string x) => (!int.TryParse(x, out result)) ? (-1) : result));
			TextBoxToInputField.CreateInputFieldFromText(__instance.maxValueText, out var inputFieldContext, delegate(InputFieldContext context)
			{
				context.WithAnchor(Anchor.StretchRight).OfSize(50, -6).Bind(binding);
			});
			((Component)__instance.maxValueText).gameObject.SetActive(false);
			return inputFieldContext.inputField;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(UIStationStorage), "RefreshValues")]
		public static void PatchStationStorageRefreshValues(ref UIStationStorage __instance)
		{
			if (__instance.station != null && __instance.index < __instance.station.storage.Length)
			{
				ItemProto val = ((ProtoSet<ItemProto>)(object)LDB.items).Select((int)__instance.stationWindow.factory.entityPool[__instance.station.entityId].protoId);
				__instance.maxSlider.maxValue = val.prefabDesc.stationMaxItemCount + __instance.GetAdditionStorage();
				__instance.maxSlider.value = __instance.station.storage[__instance.index].max;
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(UIStationStorage), "OnMaxSliderValueChange")]
		public static void InterceptSliderValueChange(ref UIStationStorage __instance, ref float val)
		{
			if (__instance.station != null && __instance.index < __instance.station.storage.Length && (int)val != __instance.station.storage[__instance.index].max && (int)val != (int)__instance.maxSlider.maxValue)
			{
				int num = sliderStep.Value;
				if (sliderStepPercent.Value != 0)
				{
					num = (int)__instance.maxSlider.maxValue * sliderStepPercent.Value / 100;
				}
				val -= (int)val % num;
			}
		}

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(UIStationStorage), "RefreshValues")]
		public static IEnumerable<CodeInstruction> PatchRefreshValues(IEnumerable<CodeInstruction> code, ILGenerator generator)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Expected O, but got Unknown
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Expected O, but got Unknown
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Expected O, but got Unknown
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(code, generator);
			val.SearchForward((Func<CodeInstruction, bool>)((CodeInstruction ci) => CodeInstructionExtensions.Calls(ci, AccessTools.PropertySetter(typeof(Slider), "value"))));
			int pos = val.Pos;
			val.MatchBack(false, (CodeMatch[])(object)new CodeMatch[2]
			{
				new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction ci) => CodeInstructionExtensions.IsLdarg(ci, (int?)0)), (string)null),
				new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction ci) => CodeInstructionExtensions.LoadsField(ci, AccessTools.Field(typeof(UIStationStorage), "maxSlider"), false)), (string)null)
			});
			int pos2 = val.Pos;
			val.RemoveInstructionsInRange(pos2, pos);
			val.Start();
			val.SearchForward((Func<CodeInstruction, bool>)((CodeInstruction ci) => CodeInstructionExtensions.Calls(ci, AccessTools.PropertySetter(typeof(Slider), "maxValue"))));
			int pos3 = val.Pos;
			val.MatchBack(false, (CodeMatch[])(object)new CodeMatch[2]
			{
				new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction ci) => CodeInstructionExtensions.IsLdarg(ci, (int?)0)), (string)null),
				new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction ci) => CodeInstructionExtensions.LoadsField(ci, AccessTools.Field(typeof(UIStationStorage), "maxSlider"), false)), (string)null)
			});
			int pos4 = val.Pos;
			val.RemoveInstructionsInRange(pos4, pos3);
			return val.InstructionEnumeration();
		}

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(UIStationStorage), "OnMaxSliderValueChange")]
		public static IEnumerable<CodeInstruction> PatchMaxSliderValueChange(IEnumerable<CodeInstruction> code, ILGenerator generator)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(code, generator);
			val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[2]
			{
				new CodeMatch((OpCode?)OpCodes.Ldc_R4, (object)100f, (string)null),
				new CodeMatch((OpCode?)OpCodes.Mul, (object)null, (string)null)
			});
			if (val.IsValid)
			{
				val.SetOperandAndAdvance((object)1f);
			}
			return val.InstructionEnumeration();
		}

		public static void ApplyPatch(Harmony harmony)
		{
			harmony.PatchAll(typeof(EditableStationStorageMax));
			if (Object.op_Implicit((Object)(object)UIRoot.instance) && Object.op_Implicit((Object)(object)UIRoot.instance.uiGame) && ((ManualBehaviour)UIRoot.instance.uiGame).created)
			{
				UIStationWindow __instance = UIRoot.instance.uiGame.stationWindow;
				PatchStationWindow(ref __instance);
			}
		}

		private static void RemovePatch()
		{
			foreach (Text patchedText in patchedTexts)
			{
				((Component)patchedText).gameObject.SetActive(true);
			}
			foreach (InputField patchedInputField in patchedInputFields)
			{
				Object.Destroy((Object)(object)((Component)patchedInputField).gameObject);
			}
			patchedTexts.Clear();
			patchedInputFields.Clear();
		}

		protected override void UseConfig(ConfigFile configFile)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			sliderStep = configFile.Bind<int>(base.ConfigSection, "Slider Step", 100, (ConfigDescription)null);
			sliderStepPercent = configFile.Bind<int>(base.ConfigSection, "Slider Step %", 0, new ConfigDescription("If this is non-zero, the slider step will be a percentage of the maximum", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
		}

		protected override void Patch(Harmony _harmony)
		{
			ApplyPatch(_harmony);
		}

		protected override void Unpatch()
		{
			RemovePatch();
		}

		protected override void CreateUI()
		{
		}

		protected override void DestroyUI()
		{
		}
	}
	public abstract class EnhancementBase
	{
		public const string enhancementEnableDisableSection = "# Enable / Disable Enhancements";

		public ConfigEntry<bool> IsEnabled;

		protected abstract string Name { get; }

		protected string ConfigSection => "## " + Name;

		protected abstract void UseConfig(ConfigFile configFile);

		protected abstract void Patch(Harmony _harmony);

		protected abstract void Unpatch();

		protected abstract void CreateUI();

		protected abstract void DestroyUI();

		public void LifecycleUseConfig(ConfigFile configFile)
		{
			IsEnabled = configFile.Bind<bool>("# Enable / Disable Enhancements", Name, false, (ConfigDescription)null);
			UseConfig(configFile);
		}

		public void LifecyclePatch(Harmony _harmony)
		{
			if (!IsEnabled.Value)
			{
				return;
			}
			try
			{
				Patch(_harmony);
			}
			catch (Exception ex)
			{
				Plugin.Log.LogError((object)ex);
			}
		}

		public void LifecycleUnpatch()
		{
			if (!IsEnabled.Value)
			{
				return;
			}
			try
			{
				Unpatch();
			}
			catch (Exception ex)
			{
				Plugin.Log.LogError((object)ex);
			}
		}

		public void LifecycleCreateUI()
		{
			if (!IsEnabled.Value)
			{
				return;
			}
			try
			{
				CreateUI();
			}
			catch (Exception ex)
			{
				Plugin.Log.LogError((object)ex);
			}
		}

		public void LifecycleDestroyUI()
		{
			if (!IsEnabled.Value)
			{
				return;
			}
			try
			{
				DestroyUI();
			}
			catch (Exception ex)
			{
				Plugin.Log.LogError((object)ex);
			}
		}
	}
	public class HideGameTimeDisplay : EnhancementBase
	{
		private static GameObject gameTimeDisplay;

		protected override string Name => "Hide Game Time Display";

		protected override void UseConfig(ConfigFile configFile)
		{
		}

		protected override void Patch(Harmony _harmony)
		{
		}

		protected override void Unpatch()
		{
		}

		protected override void CreateUI()
		{
			gameTimeDisplay = ((Component)((Component)UIRoot.instance).GetComponentInChildren<UIFpsStat>(true).timeTextComp).gameObject;
			gameTimeDisplay.SetActive(false);
		}

		protected override void DestroyUI()
		{
			if (Object.op_Implicit((Object)(object)gameTimeDisplay))
			{
				gameTimeDisplay.SetActive(true);
			}
		}
	}
	public class HideRealTimeDisplay : EnhancementBase
	{
		private static GameObject realTimeDisplay;

		protected override string Name => "Hide Real Time Display";

		protected override void UseConfig(ConfigFile configFile)
		{
		}

		protected override void Patch(Harmony _harmony)
		{
		}

		protected override void Unpatch()
		{
		}

		protected override void CreateUI()
		{
			realTimeDisplay = ((Component)((Component)UIRoot.instance).GetComponentInChildren<UIFpsStat>(true).realTimeTextComp).gameObject;
			realTimeDisplay.SetActive(false);
		}

		protected override void DestroyUI()
		{
			if (Object.op_Implicit((Object)(object)realTimeDisplay))
			{
				realTimeDisplay.SetActive(true);
			}
		}
	}
	public class PartialOffscreenWindows : EnhancementBase
	{
		public static ConfigEntry<int> thresholdWidth;

		public static ConfigEntry<int> thresholdHeight;

		private static Vector2 thresholdVector => new Vector2((float)thresholdWidth.Value, (float)thresholdHeight.Value);

		protected override string Name => "Partial Off-screen Windows";

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(UIWindowDrag), "Update")]
		private static IEnumerable<CodeInstruction> PatchUpdate(IEnumerable<CodeInstruction> code, ILGenerator generator)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Expected O, but got Unknown
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Expected O, but got Unknown
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(code, generator);
			TranspilerHelpers.LocalHelper? minLocal = null;
			TranspilerHelpers.LocalHelper? maxLocal = null;
			val.MatchForward(true, (CodeMatch[])(object)new CodeMatch[2]
			{
				new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction ci) => CodeInstructionExtensions.Calls(ci, AccessTools.Method(typeof(UIRoot), "WorldToScreenPoint", (Type[])null, (Type[])null))), (string)null),
				new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction ci) => ci.StoresLocal(out minLocal)), (string)null)
			});
			if (val.IsInvalid)
			{
				Plugin.Log.LogDebug((object)"Invalid on the first stloc");
			}
			Plugin.Log.LogDebug((object)val.Opcode);
			Plugin.Log.LogDebug((object)val.Pos);
			val.MatchForward(true, (CodeMatch[])(object)new CodeMatch[2]
			{
				new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction ci) => CodeInstructionExtensions.Calls(ci, AccessTools.Method(typeof(UIRoot), "WorldToScreenPoint", (Type[])null, (Type[])null))), (string)null),
				new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction ci) => ci.StoresLocal(out maxLocal)), (string)null)
			});
			if (val.IsInvalid)
			{
				Plugin.Log.LogDebug((object)"Invalid on the second stloc");
			}
			Plugin.Log.LogDebug((object)val.Opcode);
			Plugin.Log.LogDebug((object)val.Pos);
			val.Advance(1);
			Plugin.Log.LogDebug((object)minLocal);
			Plugin.Log.LogDebug((object)maxLocal);
			val.Insert((CodeInstruction[])(object)new CodeInstruction[3]
			{
				minLocal?.Ldloca(),
				maxLocal?.Ldloca(),
				CodeInstruction.Call(typeof(PartialOffscreenWindows), "AdjustWindowRectParams", (Type[])null, (Type[])null)
			});
			return val.InstructionEnumeration();
		}

		public static void AdjustWindowRectParams(ref Vector2 pos1, ref Vector2 pos2)
		{
			//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_001c: 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_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			if (pos1.x < pos2.x)
			{
				float x = pos2.x;
				pos2.x = pos1.x + thresholdVector.x;
				pos1.x = x - thresholdVector.x;
			}
			else
			{
				float x2 = pos1.x;
				pos1.x = pos2.x + thresholdVector.x;
				pos2.x = x2 - thresholdVector.x;
			}
			if (pos1.y > pos2.y)
			{
				float y = pos2.y;
				pos2.y = pos1.y - thresholdVector.y;
				pos1.y = y + thresholdVector.y;
			}
			else
			{
				float y2 = pos1.y;
				pos1.y = pos2.y - thresholdVector.y;
				pos2.y = y2 + thresholdVector.y;
			}
		}

		protected override void UseConfig(ConfigFile configFile)
		{
			thresholdWidth = configFile.Bind<int>(base.ConfigSection, "Threshold Width", 100, (ConfigDescription)null);
			thresholdHeight = configFile.Bind<int>(base.ConfigSection, "Threshold Height", 100, (ConfigDescription)null);
		}

		protected override void Patch(Harmony _harmony)
		{
			_harmony.PatchAll(typeof(PartialOffscreenWindows));
		}

		protected override void Unpatch()
		{
		}

		protected override void CreateUI()
		{
		}

		protected override void DestroyUI()
		{
		}
	}
	[BepInPlugin("dev.raptor.dsp.UIEnhancements", "UIEnhancements", "0.0.5")]
	public class Plugin : BaseUnityPlugin
	{
		public const string GUID = "dev.raptor.dsp.UIEnhancements";

		public const string NAME = "UIEnhancements";

		public const string VERSION = "0.0.5";

		private Harmony _harmony;

		internal static ManualLogSource Log;

		internal List<EnhancementBase> enhancements = new List<EnhancementBase>();

		private void Awake()
		{
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			enhancements.Add(new EditableStationStorageMax());
			enhancements.Add(new UnrestrictedUIScaler());
			enhancements.Add(new PartialOffscreenWindows());
			enhancements.Add(new HideRealTimeDisplay());
			enhancements.Add(new HideGameTimeDisplay());
			enhancements.Add(new SwapNewGameAndContinue());
			_harmony = new Harmony("dev.raptor.dsp.UIEnhancements");
			enhancements.ForEach(delegate(EnhancementBase x)
			{
				x.LifecycleUseConfig(((BaseUnityPlugin)this).Config);
			});
			enhancements.ForEach(delegate(EnhancementBase x)
			{
				x.LifecyclePatch(_harmony);
			});
			UIBuilderPlugin.Create("dev.raptor.dsp.UIEnhancements", OnCreateUI);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"UIEnhancements Awake() called");
		}

		private void OnCreateUI()
		{
			enhancements.ForEach(delegate(EnhancementBase x)
			{
				x.LifecycleCreateUI();
			});
		}

		private void OnDestroy()
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"UIEnhancements OnDestroy() called");
			enhancements.ForEach(delegate(EnhancementBase x)
			{
				x.LifecycleDestroyUI();
			});
			enhancements.ForEach(delegate(EnhancementBase x)
			{
				x.LifecycleUnpatch();
			});
			Harmony harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			UIBuilderPlugin.Destroy();
			Log = null;
		}
	}
	public class SwapNewGameAndContinue : EnhancementBase
	{
		private float newGameOrigPosY;

		private float continueGameOrigPosY;

		protected override string Name => "Swap New Game and Continue";

		protected override void UseConfig(ConfigFile configFile)
		{
		}

		protected override void Patch(Harmony _harmony)
		{
		}

		protected override void Unpatch()
		{
		}

		protected override void CreateUI()
		{
			UIMainMenu uiMainMenu = UIRoot.instance.uiMainMenu;
			newGameOrigPosY = uiMainMenu.newGameRtPosY;
			continueGameOrigPosY = uiMainMenu.continueRtPosY;
			uiMainMenu.newGameRtPosY = continueGameOrigPosY;
			uiMainMenu.continueRtPosY = newGameOrigPosY;
		}

		protected override void DestroyUI()
		{
			UIMainMenu uiMainMenu = UIRoot.instance.uiMainMenu;
			uiMainMenu.newGameRtPosY = newGameOrigPosY;
			uiMainMenu.continueRtPosY = continueGameOrigPosY;
		}
	}
	public static class TranspilerHelpers
	{
		public readonly record struct LocalHelper(int localIdx)
		{
			public CodeInstruction Ldloc()
			{
				//IL_0085: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: Expected O, but got Unknown
				//IL_002a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Expected O, but got Unknown
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Expected O, but got Unknown
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Expected O, but got Unknown
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Expected O, but got Unknown
				//IL_006d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0073: Expected O, but got Unknown
				int num = localIdx;
				if (num <= 127)
				{
					return (CodeInstruction)(num switch
					{
						0 => (object)new CodeInstruction(OpCodes.Ldloc_0, (object)null), 
						1 => (object)new CodeInstruction(OpCodes.Ldloc_1, (object)null), 
						2 => (object)new CodeInstruction(OpCodes.Ldloc_2, (object)null), 
						3 => (object)new CodeInstruction(OpCodes.Ldloc_3, (object)null), 
						_ => (object)new CodeInstruction(OpCodes.Ldloc_S, (object)(sbyte)localIdx), 
					});
				}
				return new CodeInstruction(OpCodes.Ldloc, (object)localIdx);
			}

			public CodeInstruction Ldloca()
			{
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_0039: Expected O, but got Unknown
				//IL_001b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0021: Expected O, but got Unknown
				if (localIdx <= 127)
				{
					return new CodeInstruction(OpCodes.Ldloca_S, (object)(sbyte)localIdx);
				}
				return new CodeInstruction(OpCodes.Ldloca, (object)localIdx);
			}

			public CodeInstruction Stloc()
			{
				//IL_0085: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: Expected O, but got Unknown
				//IL_002a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Expected O, but got Unknown
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Expected O, but got Unknown
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Expected O, but got Unknown
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Expected O, but got Unknown
				//IL_006d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0073: Expected O, but got Unknown
				int num = localIdx;
				if (num <= 127)
				{
					return (CodeInstruction)(num switch
					{
						0 => (object)new CodeInstruction(OpCodes.Stloc_0, (object)null), 
						1 => (object)new CodeInstruction(OpCodes.Stloc_1, (object)null), 
						2 => (object)new CodeInstruction(OpCodes.Stloc_2, (object)null), 
						3 => (object)new CodeInstruction(OpCodes.Stloc_3, (object)null), 
						_ => (object)new CodeInstruction(OpCodes.Stloc_S, (object)(sbyte)localIdx), 
					});
				}
				return new CodeInstruction(OpCodes.Stloc, (object)localIdx);
			}
		}

		private static int GetLocalIdxFromOperand(object operand)
		{
			if (operand is LocalBuilder localBuilder)
			{
				return localBuilder.LocalIndex;
			}
			try
			{
				return Convert.ToInt32(operand);
			}
			catch (Exception)
			{
				Plugin.Log.LogError((object)("Failed to convert operand to int: " + operand));
				Plugin.Log.LogDebug((object)("The type of local operand is " + operand.GetType()));
				throw;
			}
		}

		public static bool LoadsLocal(this CodeInstruction code, out LocalHelper? local)
		{
			local = null;
			if (!CodeInstructionExtensions.IsLdloc(code, (LocalBuilder)null))
			{
				return false;
			}
			if (code.opcode == OpCodes.Ldloc_0)
			{
				local = new LocalHelper(0);
			}
			else if (code.opcode == OpCodes.Ldloc_1)
			{
				local = new LocalHelper(1);
			}
			else if (code.opcode == OpCodes.Ldloc_2)
			{
				local = new LocalHelper(2);
			}
			else if (code.opcode == OpCodes.Ldloc_3)
			{
				local = new LocalHelper(3);
			}
			else if (code.opcode == OpCodes.Ldloc_S || code.opcode == OpCodes.Ldloca_S)
			{
				local = new LocalHelper(GetLocalIdxFromOperand(code.operand));
			}
			else if (code.opcode == OpCodes.Ldloc || code.opcode == OpCodes.Ldloca)
			{
				local = new LocalHelper(GetLocalIdxFromOperand(code.operand));
			}
			return true;
		}

		public static bool StoresLocal(this CodeInstruction code, out LocalHelper? local)
		{
			local = null;
			if (!CodeInstructionExtensions.IsStloc(code, (LocalBuilder)null))
			{
				return false;
			}
			if (code.opcode == OpCodes.Stloc_0)
			{
				local = new LocalHelper(0);
			}
			else if (code.opcode == OpCodes.Stloc_1)
			{
				local = new LocalHelper(1);
			}
			else if (code.opcode == OpCodes.Stloc_2)
			{
				local = new LocalHelper(2);
			}
			else if (code.opcode == OpCodes.Stloc_3)
			{
				local = new LocalHelper(3);
			}
			else if (code.opcode == OpCodes.Stloc_S)
			{
				local = new LocalHelper(GetLocalIdxFromOperand(code.operand));
			}
			else if (code.opcode == OpCodes.Stloc)
			{
				local = new LocalHelper(GetLocalIdxFromOperand(code.operand));
			}
			return true;
		}
	}
	public static class TextBoxToInputField
	{
		public static void CreateInputFieldFromText(Text text, Action<InputFieldContext> initializer = null)
		{
			CreateInputFieldFromText(text, out var _, initializer);
		}

		public static void CreateInputFieldFromText(Text text, out InputFieldContext inputFieldContext, Action<InputFieldContext> initializer = null)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: 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_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: 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_007b: 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)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: 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_014b: 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_0161: Unknown result type (might be due to invalid IL or missing references)
			Transform parent = ((Component)text).transform.parent;
			RectTransform component = ((Component)text).GetComponent<RectTransform>();
			ColorBlock defaultColorBlock = ColorBlock.defaultColorBlock;
			((ColorBlock)(ref defaultColorBlock)).normalColor = Color.clear;
			Color white = Color.white;
			((ColorBlock)(ref defaultColorBlock)).highlightedColor = ((Color)(ref white)).AlphaMultiplied(0.1f);
			((ColorBlock)(ref defaultColorBlock)).pressedColor = Color.clear;
			((ColorBlock)(ref defaultColorBlock)).disabledColor = Color.clear;
			ColorBlock value = defaultColorBlock;
			InputFieldContext context = UIBuilderDSL.Create.InputField("input-field").ChildOf(parent).WithPivot(component.pivot)
				.WithMinMaxAnchor(component.anchorMin, component.anchorMax)
				.At(component.anchoredPosition)
				.OfSize(component.sizeDelta)
				.WithVisuals<InputFieldContext, Image>((IProperties<Image>)new ImageProperties());
			ColorBlock? colors = value;
			inputFieldContext = context.WithTransition(null, colors);
			IGraphicContextExtensions.WithColor(IGraphicContextExtensions.WithMaterial(UIBuilderDSL.Select.Text(inputFieldContext.text), ((Graphic)text).material), ((Graphic)text).color).WithFont(text.font).WithFontSize(text.fontSize, text.resizeTextForBestFit ? new int?(text.resizeTextMinSize) : null, text.resizeTextForBestFit ? new int?(text.resizeTextMaxSize) : null)
				.WithAlignment(text.alignment)
				.WithOverflow(text.horizontalOverflow, text.verticalOverflow);
			initializer?.Invoke(inputFieldContext);
		}
	}
	public class UnrestrictedUIScaler : EnhancementBase
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static Func<Resolution, int> <>9__9_0;

			public static Func<Resolution, int> <>9__9_1;

			public static Func<Resolution, int> <>9__9_2;

			public static Func<Resolution, int> <>9__9_3;

			public static Func<int, float> <>9__9_4;

			public static Func<float, int> <>9__9_5;

			public static Action<Image> <>9__9_6;

			public static Func<int, string> <>9__9_7;

			public static Func<string, int> <>9__9_8;

			public static Action<CanvasScaler> <>9__9_12;

			public static Action<float> <>9__9_9;

			public static UnityAction <>9__9_10;

			public static UnityAction <>9__9_11;

			public static UnityAction <>9__9_13;

			internal int <CreateUI>b__9_0(Resolution x)
			{
				return ((Resolution)(ref x)).height;
			}

			internal int <CreateUI>b__9_1(Resolution x)
			{
				return ((Resolution)(ref x)).width;
			}

			internal int <CreateUI>b__9_2(Resolution x)
			{
				return ((Resolution)(ref x)).height;
			}

			internal int <CreateUI>b__9_3(Resolution x)
			{
				return ((Resolution)(ref x)).width;
			}

			internal float <CreateUI>b__9_4(int x)
			{
				return x;
			}

			internal int <CreateUI>b__9_5(float x)
			{
				return (int)x;
			}

			internal void <CreateUI>b__9_6(Image x)
			{
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				((Graphic)x).color = new Color(0.13f, 0.18f, 0.2f, 1f);
			}

			internal string <CreateUI>b__9_7(int x)
			{
				return x.ToString();
			}

			internal int <CreateUI>b__9_8(string x)
			{
				if (!int.TryParse(x, out var result))
				{
					return 900;
				}
				return result;
			}

			internal void <CreateUI>b__9_12(CanvasScaler scaler)
			{
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				int height = ((Resolution)(ref DSPGame.globalOption.resolution)).height;
				scaler.referenceResolution = new Vector2((float)height, (float)height);
			}

			internal void <CreateUI>b__9_9(float value)
			{
				UICanvasScalerHandler.uiLayoutHeight = (int)value;
			}

			internal void <CreateUI>b__9_10()
			{
				((Component)uiScaleSliderCanvas).gameObject.SetActive(false);
				restoreUiLayoutHeight = null;
			}

			internal void <CreateUI>b__9_11()
			{
				((Component)uiScaleSliderCanvas).gameObject.SetActive(false);
				if (restoreUiLayoutHeight.HasValue)
				{
					UICanvasScalerHandler.uiLayoutHeight = restoreUiLayoutHeight.Value;
					restoreUiLayoutHeight = null;
				}
			}

			internal void <CreateUI>b__9_13()
			{
				restoreUiLayoutHeight = UICanvasScalerHandler.uiLayoutHeight;
				uiScale.Value = restoreUiLayoutHeight.Value;
				((Component)uiScaleSliderCanvas).gameObject.SetActive(true);
			}
		}

		public static ConfigEntry<int> uiScale;

		public static Slider uiScaleSlider;

		public static Canvas uiScaleSliderCanvas;

		public static RectTransform vanillaUiSliderRectTransform;

		public static Button livePreviewButton;

		private static int? restoreUiLayoutHeight;

		protected override string Name => "Unrestricted UI Scaler";

		protected override void UseConfig(ConfigFile configFile)
		{
			uiScale = configFile.Bind<int>(base.ConfigSection, "UI Reference Height", 900, (ConfigDescription)null);
		}

		protected override void Patch(Harmony _harmony)
		{
			_harmony.PatchAll(typeof(UnrestrictedUIScaler));
		}

		protected override void Unpatch()
		{
		}

		protected override void CreateUI()
		{
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: 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_0183: 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_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_028f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0294: Unknown result type (might be due to invalid IL or missing references)
			//IL_029d: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0498: Unknown result type (might be due to invalid IL or missing references)
			//IL_049d: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a3: Expected O, but got Unknown
			//IL_0565: Unknown result type (might be due to invalid IL or missing references)
			//IL_05bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_051b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0520: Unknown result type (might be due to invalid IL or missing references)
			//IL_0526: Expected O, but got Unknown
			//IL_06a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_06b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_06be: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_06d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_06d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_06e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_061d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0622: Unknown result type (might be due to invalid IL or missing references)
			//IL_0628: Expected O, but got Unknown
			if ((Object)(object)uiScaleSlider != (Object)null)
			{
				return;
			}
			int num = Screen.resolutions.Min((Resolution x) => ((Resolution)(ref x)).height);
			int num2 = Mathf.Min(Screen.resolutions.Min((Resolution x) => ((Resolution)(ref x)).width), num);
			int num3 = Screen.resolutions.Max((Resolution x) => ((Resolution)(ref x)).height);
			int num4 = Mathf.Max(Screen.resolutions.Max((Resolution x) => ((Resolution)(ref x)).width), num3);
			ConfigEntryDataBindSource<int, float> configEntryDataBindSource = new ConfigEntryDataBindSource<int, float>(uiScale, DataBindTransform.From((int x) => x, (float x) => (int)x));
			Image component;
			UIElementContext parent = UIBuilderDSL.Create.UIElement("slider-handle-container").WithComponent<UIElementContext, Image>(out component, (Action<Image>)delegate(Image x)
			{
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				((Graphic)x).color = new Color(0.13f, 0.18f, 0.2f, 1f);
			});
			ColorBlock defaultColorBlock = ColorBlock.defaultColorBlock;
			((ColorBlock)(ref defaultColorBlock)).normalColor = Color.clear;
			Color white = Color.white;
			((ColorBlock)(ref defaultColorBlock)).highlightedColor = ((Color)(ref white)).AlphaMultiplied(0.1f);
			((ColorBlock)(ref defaultColorBlock)).pressedColor = Color.clear;
			((ColorBlock)(ref defaultColorBlock)).disabledColor = Color.clear;
			ColorBlock value2 = defaultColorBlock;
			InputFieldContext context = UIBuilderDSL.Create.InputField("slider-handle-input-field").ChildOf(parent).WithAnchor(Anchor.Center)
				.OfSize(40, 20)
				.WithVisuals<InputFieldContext, Image>((IProperties<Image>)new ImageProperties
				{
					color = Color.white
				});
			ColorBlock? colors = value2;
			int result;
			InputFieldContext parent2 = context.WithTransition(null, colors).Bind(configEntryDataBindSource.WithTransform((int x) => x.ToString(), (string x) => (!int.TryParse(x, out result)) ? 900 : result));
			UIElementContext context2 = UIBuilderDSL.Create.UIElement("bg").ChildOf((UIElementContext)parent2).WithAnchor(Anchor.Stretch)
				.OfSize(0, 0);
			IProperties<Image>[] array = new IProperties<Image>[1];
			ImageProperties obj = new ImageProperties
			{
				raycastTarget = false,
				sprite = UIBuilder.spriteBorder1,
				type = (Type)1
			};
			white = Color.white;
			obj.color = ((Color)(ref white)).AlphaMultiplied(0.6f);
			array[0] = obj;
			context2.WithComponent<UIElementContext, Image>(out Image _, array);
			SliderHandleConfiguration value3 = new SliderHandleConfiguration(80f, 0.6f, component);
			SliderConfiguration configuration = new SliderConfiguration(num2, num4, wholeNumbers: true, (Direction)0, null, null, 6f, value3);
			Canvas overlayCanvas = UIRoot.instance.overlayCanvas;
			Transform parent3 = ((Component)overlayCanvas).transform.parent;
			UIBuilderDSL.Create.UIElement("ui-scale-slider-canvas").ChildOf(parent3).WithComponent<UIElementContext, CanvasScaler>((Action<CanvasScaler>)delegate(CanvasScaler scaler)
			{
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				int height = ((Resolution)(ref DSPGame.globalOption.resolution)).height;
				scaler.referenceResolution = new Vector2((float)height, (float)height);
			})
				.WithComponent<UIElementContext, Canvas>(out uiScaleSliderCanvas)
				.WithComponent<UIElementContext, GraphicRaycaster>(out GraphicRaycaster _);
			((Component)uiScaleSliderCanvas).gameObject.SetActive(false);
			uiScaleSliderCanvas.planeDistance = overlayCanvas.planeDistance;
			uiScaleSliderCanvas.renderMode = (RenderMode)0;
			uiScaleSliderCanvas.worldCamera = overlayCanvas.worldCamera;
			SliderContext context3 = UIBuilderDSL.Create.Slider("ui-scale-slider", configuration).ChildOf(((Component)uiScaleSliderCanvas).transform).WithMinMaxAnchor(new Vector2(0.1f, 1f), new Vector2(0.9f, 1f))
				.OfSize(0, 30)
				.At(0, 0)
				.Bind(configEntryDataBindSource);
			colors = UIBuilder.buttonSelectableProperties.colors;
			SliderValueChangedHandler component4;
			SliderContext sliderContext = context3.WithTransition(null, colors).WithComponent<SliderContext, SliderValueChangedHandler>(out component4);
			component4.slider = sliderContext.slider;
			component4.Handler = delegate(float value)
			{
				UICanvasScalerHandler.uiLayoutHeight = (int)value;
			};
			UIElementContext parent4 = UIBuilderDSL.Create.UIElement("btn-container").ChildOf(parent).WithAnchor(Anchor.Bottom)
				.WithPivot(0.5f, 1f)
				.At(0, -20);
			object obj2 = <>c.<>9__9_10;
			if (obj2 == null)
			{
				UnityAction val = delegate
				{
					((Component)uiScaleSliderCanvas).gameObject.SetActive(false);
					restoreUiLayoutHeight = null;
				};
				<>c.<>9__9_10 = val;
				obj2 = (object)val;
			}
			UIBuilderDSL.Create.Button("apply-btn", "Apply", (UnityAction)obj2).ChildOf(parent4).WithAnchor(Anchor.Right)
				.At(-5, 0)
				.OfSize(60, 25)
				.WithVisuals<ButtonContext, Image>((IProperties<Image>)UIBuilder.buttonImgProperties)
				.WithTransition(UIBuilder.buttonSelectableProperties.transition);
			object obj3 = <>c.<>9__9_11;
			if (obj3 == null)
			{
				UnityAction val2 = delegate
				{
					((Component)uiScaleSliderCanvas).gameObject.SetActive(false);
					if (restoreUiLayoutHeight.HasValue)
					{
						UICanvasScalerHandler.uiLayoutHeight = restoreUiLayoutHeight.Value;
						restoreUiLayoutHeight = null;
					}
				};
				<>c.<>9__9_11 = val2;
				obj3 = (object)val2;
			}
			ButtonContext context4 = UIBuilderDSL.Create.Button("cancel-btn", "Cancel", (UnityAction)obj3).ChildOf(parent4).WithAnchor(Anchor.Left)
				.At(5, 0)
				.OfSize(60, 25)
				.WithVisuals<ButtonContext, Image>((IProperties<Image>)GraphicPropertiesBuilder.WithColor(UIBuilder.buttonImgProperties, new Color(1f, 0.3f, 0.37f, 0.8471f)));
			Transition? transition = UIBuilder.buttonSelectableProperties.transition;
			colors = null;
			context4.WithTransition(transition, colors);
			uiScaleSlider = sliderContext.slider;
			vanillaUiSliderRectTransform = ((Component)UIRoot.instance.optionWindow.uiLayoutHeightComp).GetComponent<RectTransform>();
			Color white2 = Color.white;
			Color val3 = default(Color);
			((Color)(ref val3))..ctor(0.4887f, 0.6525f, 0.7453f, 0.4886f);
			Color highlightedColor = default(Color);
			((Color)(ref highlightedColor))..ctor(0.4887f, 0.6525f, 0.7453f, 0.7255f);
			object obj4 = <>c.<>9__9_13;
			if (obj4 == null)
			{
				UnityAction val4 = delegate
				{
					restoreUiLayoutHeight = UICanvasScalerHandler.uiLayoutHeight;
					uiScale.Value = restoreUiLayoutHeight.Value;
					((Component)uiScaleSliderCanvas).gameObject.SetActive(true);
				};
				<>c.<>9__9_13 = val4;
				obj4 = (object)val4;
			}
			ButtonContext context5 = UIBuilderDSL.Create.Button("ui-scaler-activate-button", "Enable Live Preview", (UnityAction)obj4).ChildOf(((Transform)vanillaUiSliderRectTransform).parent).WithAnchor(Anchor.Left)
				.At(250, 0)
				.WithLayoutSize(120f, 30f)
				.WithContentSizeFitter((FitMode)2, (FitMode)2)
				.WithFontSize(14)
				.WithVisuals<ButtonContext, Image>((IProperties<Image>)new ImageProperties
				{
					color = white2
				});
			defaultColorBlock = ColorBlock.defaultColorBlock;
			((ColorBlock)(ref defaultColorBlock)).normalColor = val3;
			((ColorBlock)(ref defaultColorBlock)).pressedColor = val3;
			((ColorBlock)(ref defaultColorBlock)).disabledColor = val3;
			((ColorBlock)(ref defaultColorBlock)).highlightedColor = highlightedColor;
			colors = defaultColorBlock;
			ButtonContext buttonContext = context5.WithTransition(null, colors);
			buttonContext.text.resizeTextForBestFit = false;
			livePreviewButton = buttonContext.button;
			((Component)vanillaUiSliderRectTransform).gameObject.SetActive(false);
		}

		protected override void DestroyUI()
		{
			if ((Object)(object)uiScaleSlider != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)uiScaleSlider).gameObject);
				uiScaleSlider = null;
			}
			if ((Object)(object)uiScaleSliderCanvas != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)uiScaleSliderCanvas).gameObject);
				uiScaleSliderCanvas = null;
			}
			if ((Object)(object)vanillaUiSliderRectTransform != (Object)null)
			{
				((Component)vanillaUiSliderRectTransform).gameObject.SetActive(true);
				vanillaUiSliderRectTransform = null;
			}
			if ((Object)(object)livePreviewButton != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)livePreviewButton).gameObject);
				livePreviewButton = null;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(GameOption), "Apply")]
		public static void ApplyUIScaleAgain()
		{
			if (restoreUiLayoutHeight.HasValue)
			{
				UICanvasScalerHandler.uiLayoutHeight = restoreUiLayoutHeight.Value;
			}
			else
			{
				UICanvasScalerHandler.uiLayoutHeight = uiScale.Value;
			}
		}
	}
}
namespace DysonSphereProgram.Modding.UIEnhancements.UI.Builder
{
	public abstract class DataBindController<T> : MonoBehaviour
	{
		public IDataBindSource<T> Binding;

		protected bool ChangedFromUI;

		private void LateUpdate()
		{
			if (ChangedFromUI)
			{
				UIToBinding();
				ChangedFromUI = false;
			}
			else
			{
				BindingToUI();
			}
		}

		protected abstract void BindingToUI();

		protected abstract void UIToBinding();
	}
	public class DataBindSlider : DataBindController<float>
	{
		private Slider slider;

		private void Start()
		{
			slider = ((Component)this).GetComponent<Slider>();
			((UnityEvent<float>)(object)slider.onValueChanged).AddListener((UnityAction<float>)ValueChangedHandler);
		}

		private void ValueChangedHandler(float _)
		{
			ChangedFromUI = true;
		}

		protected override void BindingToUI()
		{
			slider.value = Binding.Value;
		}

		protected override void UIToBinding()
		{
			Binding.Value = slider.value;
		}
	}
	public class DataBindToggleBool : DataBindController<bool>
	{
		private Toggle toggle;

		private void Start()
		{
			toggle = ((Component)this).GetComponent<Toggle>();
			((UnityEvent<bool>)(object)toggle.onValueChanged).AddListener((UnityAction<bool>)ValueChangedHandler);
		}

		private void ValueChangedHandler(bool _)
		{
			ChangedFromUI = true;
		}

		protected override void BindingToUI()
		{
			toggle.isOn = Binding.Value;
		}

		protected override void UIToBinding()
		{
			Binding.Value = toggle.isOn;
		}
	}
	public class DataBindToggleEnum : DataBindController<Enum>
	{
		private Toggle toggle;

		public Enum linkedValue;

		private void Start()
		{
			toggle = ((Component)this).GetComponent<Toggle>();
			((UnityEvent<bool>)(object)toggle.onValueChanged).AddListener((UnityAction<bool>)ValueChangedHandler);
		}

		private void ValueChangedHandler(bool _)
		{
			ChangedFromUI = true;
		}

		protected override void BindingToUI()
		{
			toggle.isOn = Binding.Value.Equals(linkedValue);
		}

		protected override void UIToBinding()
		{
			if (toggle.isOn)
			{
				Binding.Value = linkedValue;
			}
		}
	}
	public class DataBindInputField : DataBindController<string>
	{
		private InputField inputField;

		private bool uiDirty;

		private void Start()
		{
			inputField = ((Component)this).GetComponent<InputField>();
			((UnityEvent<string>)(object)inputField.onValueChanged).AddListener((UnityAction<string>)ValueChangedHandler);
			((UnityEvent<string>)(object)inputField.onEndEdit).AddListener((UnityAction<string>)SubmitHandler);
		}

		private void ValueChangedHandler(string value)
		{
			if (value != Binding.Value)
			{
				uiDirty = true;
			}
		}

		private void SubmitHandler(string _)
		{
			ChangedFromUI = true;
		}

		protected override void BindingToUI()
		{
			if (!uiDirty)
			{
				inputField.text = Binding.Value;
			}
		}

		protected override void UIToBinding()
		{
			Binding.Value = inputField.text;
			uiDirty = false;
		}
	}
	public interface IOneWayDataBindSource
	{
		object Value { get; }
	}
	public interface IOneWayDataBindSource<out TVisual>
	{
		TVisual Value { get; }
	}
	public interface IDataBindSource<TVisual>
	{
		TVisual Value { get; set; }
	}
	public class DataBindTransform<TLogical, TVisual>
	{
		public readonly Func<TLogical, TVisual> LogicalToVisualTransform;

		public readonly Func<TVisual, TLogical> VisualToLogicalTransform;

		public DataBindTransform(Func<TLogical, TVisual> forward, Func<TVisual, TLogical> reverse)
		{
			LogicalToVisualTransform = forward;
			VisualToLogicalTransform = reverse;
		}
	}
	public static class DataBindTransform
	{
		public static DataBindTransform<TLogical, TVisual> From<TLogical, TVisual>(Func<TLogical, TVisual> forward, Func<TVisual, TLogical> reverse)
		{
			return new DataBindTransform<TLogical, TVisual>(forward, reverse);
		}

		public static DataBindTransform<T, T> Identity<T>()
		{
			return From((T x) => x, (T x) => x);
		}
	}
	public abstract class DataBindSourceBase<TLogical, TVisual> : IDataBindSource<TVisual>, IOneWayDataBindSource<TVisual>, IOneWayDataBindSource
	{
		protected readonly DataBindTransform<TLogical, TVisual> transform;

		object IOneWayDataBindSource.Value => Value;

		public virtual TVisual Value
		{
			get
			{
				return transform.LogicalToVisualTransform(Get());
			}
			set
			{
				Set(transform.VisualToLogicalTransform(value));
			}
		}

		protected DataBindSourceBase(DataBindTransform<TLogical, TVisual> transform)
		{
			this.transform = transform;
		}

		protected abstract TLogical Get();

		protected abstract void Set(TLogical value);

		public DataBindSourceBase<TLogical, UVisual> WithTransform<UVisual>(Func<TLogical, UVisual> forward, Func<UVisual, TLogical> reverse)
		{
			return WithTransform(DataBindTransform.From(forward, reverse));
		}

		public abstract DataBindSourceBase<TLogical, UVisual> WithTransform<UVisual>(DataBindTransform<TLogical, UVisual> newTransform);
	}
	public class ConfigEntryDataBindSource<TLogical, TVisual> : DataBindSourceBase<TLogical, TVisual>
	{
		private readonly ConfigEntry<TLogical> entry;

		public ConfigEntryDataBindSource(ConfigEntry<TLogical> entry, DataBindTransform<TLogical, TVisual> transform)
			: base(transform)
		{
			this.entry = entry;
		}

		protected override TLogical Get()
		{
			return entry.Value;
		}

		protected override void Set(TLogical value)
		{
			entry.Value = value;
		}

		public override DataBindSourceBase<TLogical, UVisual> WithTransform<UVisual>(DataBindTransform<TLogical, UVisual> newTransform)
		{
			return new ConfigEntryDataBindSource<TLogical, UVisual>(entry, newTransform);
		}
	}
	public class ConfigEntryDataBindSource<T> : ConfigEntryDataBindSource<T, T>
	{
		public static implicit operator ConfigEntryDataBindSource<T>(ConfigEntry<T> entry)
		{
			return new ConfigEntryDataBindSource<T>(entry);
		}

		public ConfigEntryDataBindSource(ConfigEntry<T> entry)
			: base(entry, DataBindTransform.Identity<T>())
		{
		}
	}
	public class MemberDataBindSource<U, TLogical, TVisual> : DataBindSourceBase<TLogical, TVisual>
	{
		private readonly U obj;

		private readonly Func<U, TLogical> getter;

		private readonly Action<U, TLogical> setter;

		public MemberDataBindSource(U obj, Func<U, TLogical> getter, Action<U, TLogical> setter, DataBindTransform<TLogical, TVisual> transform)
			: base(transform)
		{
			this.obj = obj;
			this.getter = getter;
			this.setter = setter;
		}

		protected override TLogical Get()
		{
			return getter(obj);
		}

		protected override void Set(TLogical value)
		{
			setter(obj, value);
		}

		public override DataBindSourceBase<TLogical, UVisual> WithTransform<UVisual>(DataBindTransform<TLogical, UVisual> newTransform)
		{
			return new MemberDataBindSource<U, TLogical, UVisual>(obj, getter, setter, newTransform);
		}
	}
	public class MemberDataBindSource<U, T> : MemberDataBindSource<U, T, T>
	{
		public MemberDataBindSource(U obj, Func<U, T> getter, Action<U, T> setter)
			: base(obj, getter, setter, DataBindTransform.Identity<T>())
		{
		}
	}
	public class DelegateDataBindSource<TLogical, TVisual> : DataBindSourceBase<TLogical, TVisual>
	{
		private readonly Func<TLogical> getter;

		private readonly Action<TLogical> setter;

		public DelegateDataBindSource(Func<TLogical> getter, Action<TLogical> setter, DataBindTransform<TLogical, TVisual> transform)
			: base(transform)
		{
			this.getter = getter;
			this.setter = setter;
		}

		protected override TLogical Get()
		{
			return getter();
		}

		protected override void Set(TLogical value)
		{
			setter(value);
		}

		public override DataBindSourceBase<TLogical, UVisual> WithTransform<UVisual>(DataBindTransform<TLogical, UVisual> newTransform)
		{
			return new DelegateDataBindSource<TLogical, UVisual>(getter, setter, newTransform);
		}
	}
	public class DelegateDataBindSource<T> : DelegateDataBindSource<T, T>
	{
		public DelegateDataBindSource(Func<T> getter, Action<T> setter)
			: base(getter, setter, DataBindTransform.Identity<T>())
		{
		}
	}
	public class UIModWindowBase : ManualBehaviour, IInitializeFromContext<UIBuilderDSL.FancyWindowContext>, IInitializeFromContext<UIBuilderDSL.PlainWindowContext>, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler
	{
		private bool toCaptureScroll;

		private bool focusPointEnter;

		public void InitializeFromContext(UIBuilderDSL.FancyWindowContext context)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Expected O, but got Unknown
			InitializeFromContext((UIBuilderDSL.WindowContext<UIBuilderDSL.FancyWindowContext>)context.WithCloseButton(new UnityAction(base._Close)));
		}

		public void InitializeFromContext(UIBuilderDSL.PlainWindowContext context)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Expected O, but got Unknown
			InitializeFromContext((UIBuilderDSL.WindowContext<UIBuilderDSL.PlainWindowContext>)context.WithCloseButton(new UnityAction(base._Close)));
		}

		private void InitializeFromContext<T>(UIBuilderDSL.WindowContext<T> context) where T : UIBuilderDSL.WindowContext<T>
		{
			toCaptureScroll = context.scrollCapture;
			((ManualBehaviour)this)._Create();
			((ManualBehaviour)this)._Init((object)null);
			((ManualBehaviour)this)._Open();
		}

		public override void _OnClose()
		{
			if (toCaptureScroll)
			{
				UIBuilder.inScrollView.Remove(this);
			}
			((ManualBehaviour)this)._OnClose();
		}

		public void OnPointerEnter(PointerEventData eventData)
		{
			if (toCaptureScroll)
			{
				UIBuilder.inScrollView.Add(this);
			}
		}

		public void OnPointerExit(PointerEventData eventData)
		{
			if (toCaptureScroll)
			{
				UIBuilder.inScrollView.Remove(this);
			}
		}

		private void OnApplicationFocus(bool focus)
		{
			if (!toCaptureScroll)
			{
				return;
			}
			if (!focus)
			{
				focusPointEnter = UIBuilder.inScrollView.Contains(this);
				UIBuilder.inScrollView.Remove(this);
			}
			if (focus)
			{
				if (focusPointEnter)
				{
					UIBuilder.inScrollView.Add(this);
				}
				else
				{
					UIBuilder.inScrollView.Remove(this);
				}
			}
		}
	}
	public class UIWindowResize : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler
	{
		public EventTrigger resizeTrigger;

		public RectTransform resizeTrans;

		public int resizeThreshold = 4;

		public Vector2 minSize;

		private bool mouseDown;

		private bool mouseOver;

		private Vector2 resizeMouseBegin;

		private Vector2 resizeSizeDeltaBegin;

		private Vector2 resizeSizeDeltaWanted;

		public bool pointerIn;

		public bool resizing { get; private set; }

		private void OnEnable()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Expected O, but got Unknown
			//IL_0008: 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_003b: Expected O, but got Unknown
			//IL_003d: 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)
			//IL_0070: Expected O, but got Unknown
			//IL_0072: 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_00a5: Expected O, but got Unknown
			//IL_00a7: 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)
			Entry val = new Entry();
			val.eventID = (EventTriggerType)2;
			((UnityEvent<BaseEventData>)(object)val.callback).AddListener((UnityAction<BaseEventData>)OnPointerDown);
			resizeTrigger.triggers.Add(val);
			Entry val2 = new Entry();
			val2.eventID = (EventTriggerType)3;
			((UnityEvent<BaseEventData>)(object)val2.callback).AddListener((UnityAction<BaseEventData>)OnPointerUp);
			resizeTrigger.triggers.Add(val2);
			Entry val3 = new Entry();
			val3.eventID = (EventTriggerType)0;
			((UnityEvent<BaseEventData>)(object)val3.callback).AddListener((UnityAction<BaseEventData>)OnPointerEnterResizeArea);
			resizeTrigger.triggers.Add(val3);
			Entry val4 = new Entry();
			val4.eventID = (EventTriggerType)1;
			((UnityEvent<BaseEventData>)(object)val4.callback).AddListener((UnityAction<BaseEventData>)OnPointerExitResizeArea);
			resizeTrigger.triggers.Add(val4);
			if ((Object)(object)resizeTrans == (Object)null)
			{
				ref RectTransform reference = ref resizeTrans;
				Transform transform = ((Component)this).transform;
				reference = (RectTransform)(object)((transform is RectTransform) ? transform : null);
			}
			VFAudio.Create("common-popup-3", (Transform)null, Vector3.zero, true, 2, -1, -1L);
		}

		private void OnDisable()
		{
			//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_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			resizeTrigger.triggers.Clear();
			mouseDown = false;
			resizeMouseBegin = Vector2.zero;
			resizeSizeDeltaBegin = Vector2.zero;
			if (resizing)
			{
				resizeTrans.sizeDelta = new Vector2(Mathf.Round(resizeSizeDeltaWanted.x), Mathf.Round(resizeSizeDeltaWanted.y));
			}
			pointerIn = false;
		}

		private void OnApplicationFocus(bool focus)
		{
			if (!focus)
			{
				pointerIn = false;
			}
		}

		private void OnPointerDown(BaseEventData eventData)
		{
			//IL_0007: 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_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			mouseDown = true;
			UIRoot.ScreenPointIntoRect(Input.mousePosition, resizeTrans, ref resizeMouseBegin);
			resizeSizeDeltaBegin = resizeTrans.sizeDelta;
			resizeSizeDeltaWanted = resizeTrans.sizeDelta;
			UICursor.SetCursor((ECursor)2);
		}

		private void OnPointerUp(BaseEventData eventData)
		{
			//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_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			mouseDown = false;
			resizeMouseBegin = Vector2.zero;
			resizeSizeDeltaBegin = Vector2.zero;
		}

		private void OnPointerEnterResizeArea(BaseEventData eventData)
		{
			mouseOver = true;
		}

		private void OnPointerExitResizeArea(BaseEventData eventData)
		{
			mouseOver = false;
		}

		private void BringToFront()
		{
			int childCount = ((Component)this).transform.parent.childCount;
			if (((Component)this).transform.GetSiblingIndex() < childCount - 1)
			{
				((Component)this).transform.SetAsLastSibling();
			}
		}

		private void Update()
		{
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: 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_00fc: 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_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: 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_007d: 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_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			if (mouseDown)
			{
				if (!Input.GetMouseButton(0) && !Input.GetMouseButton(1))
				{
					mouseDown = false;
				}
				Vector2 val = default(Vector2);
				UIRoot.ScreenPointIntoRect(Input.mousePosition, resizeTrans, ref val);
				Vector2 val2 = val - resizeMouseBegin;
				if (Mathf.Abs(val2.x) + Mathf.Abs(val2.y) > (float)resizeThreshold)
				{
					resizing = true;
					resizeSizeDeltaWanted = resizeSizeDeltaBegin + new Vector2(val2.x, 0f - val2.y);
					resizeTrans.sizeDelta = new Vector2(Mathf.Round(Mathf.Max(resizeSizeDeltaWanted.x, minSize.x)), Mathf.Round(Mathf.Max(resizeSizeDeltaWanted.y, minSize.y)));
				}
				UICursor.SetCursor((ECursor)2);
			}
			else
			{
				resizing = false;
				resizeMouseBegin = Vector2.zero;
				resizeSizeDeltaBegin = Vector2.zero;
				if (mouseOver)
				{
					UICursor.SetCursor((ECursor)3);
				}
			}
			if (pointerIn && (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)))
			{
				BringToFront();
			}
		}

		public void OnPointerEnter(PointerEventData eventData)
		{
			pointerIn = true;
		}

		public void OnPointerExit(PointerEventData eventData)
		{
			pointerIn = false;
		}
	}
	public abstract class ValueChangeHandler<T> : MonoBehaviour
	{
		public Action<T> Handler;

		protected T prevValue;

		protected abstract T CurrentValue { get; }

		private void OnEnable()
		{
			Handler?.Invoke(CurrentValue);
		}

		private void LateUpdate()
		{
			T currentValue;
			T val = (currentValue = CurrentValue);
			if (!val.Equals(prevValue))
			{
				Handler?.Invoke(currentValue);
				prevValue = currentValue;
			}
		}
	}
	public class DataBindValueChangeHandler : ValueChangeHandler<object>
	{
		public IOneWayDataBindSource Binding;

		protected override object CurrentValue => Binding.Value;
	}
	public abstract class DataBindValueChangeHandler<T> : ValueChangeHandler<T>
	{
		public IOneWayDataBindSource<T> Binding;

		protected override T CurrentValue => Binding.Value;
	}
	public class DataBindValueChangedHandlerBool : DataBindValueChangeHandler<bool>
	{
	}
	public class DataBindValueChangedHandlerInt : DataBindValueChangeHandler<int>
	{
	}
	public class DataBindValueChangedHandlerLong : DataBindValueChangeHandler<long>
	{
	}
	public class DataBindValueChangedHandlerFloat : DataBindValueChangeHandler<float>
	{
	}
	public class DataBindValueChangedHandlerDouble : DataBindValueChangeHandler<double>
	{
	}
	public class ToggleValueChangedHandler : ValueChangeHandler<bool>
	{
		public Toggle toggle;

		protected override bool CurrentValue => toggle.isOn;

		private void Start()
		{
			if (!Object.op_Implicit((Object)(object)toggle))
			{
				toggle = ((Component)this).GetComponent<Toggle>();
			}
		}
	}
	public class SliderValueChangedHandler : ValueChangeHandler<float>
	{
		public Slider slider;

		protected override float CurrentValue => slider.value;

		private void Start()
		{
			if (!Object.op_Implicit((Object)(object)slider))
			{
				slider = ((Component)this).GetComponent<Slider>();
			}
		}
	}
	public interface IProperties<T> where T : Component
	{
		void Apply(T component);
	}
	public abstract record GraphicProperties : IProperties<Graphic>
	{
		public Material material { get; init; }

		public Color color { get; init; } = Color.white;


		public bool raycastTarget { get; init; } = true;


		public void Apply(Graphic component)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)material != (Object)null)
			{
				component.material = material;
			}
			component.color = color;
			component.raycastTarget = raycastTarget;
		}

		[CompilerGenerated]
		protected virtual bool PrintMembers(StringBuilder builder)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			RuntimeHelpers.EnsureSufficientExecutionStack();
			builder.Append("material = ");
			builder.Append(material);
			builder.Append(", color = ");
			Color val = color;
			builder.Append(((object)(Color)(ref val)).ToString());
			builder.Append(", raycastTarget = ");
			builder.Append(raycastTarget.ToString());
			return true;
		}
	}
	public abstract record MaskableGraphicProperties : GraphicProperties, IProperties<MaskableGraphic>
	{
		public bool maskable { get; init; } = true;


		public void Apply(MaskableGraphic component)
		{
			base.Apply((Graphic)(object)component);
			component.maskable = maskable;
		}
	}
	public record RawImageProperties : MaskableGraphicProperties, IProperties<RawImage>
	{
		public Texture texture { get; init; }

		public Rect uvRect { get; init; } = new Rect(0f, 0f, 1f, 1f);


		public void Apply(RawImage component)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			base.Apply((MaskableGraphic)(object)component);
			if ((Object)(object)texture != (Object)null)
			{
				component.texture = texture;
			}
			component.uvRect = uvRect;
		}

		[CompilerGenerated]
		protected override bool PrintMembers(StringBuilder builder)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			if (base.PrintMembers(builder))
			{
				builder.Append(", ");
			}
			builder.Append("texture = ");
			builder.Append(texture);
			builder.Append(", uvRect = ");
			Rect val = uvRect;
			builder.Append(((object)(Rect)(ref val)).ToString());
			return true;
		}
	}
	public record ImageProperties : MaskableGraphicProperties, IProperties<Image>
	{
		public Sprite sprite { get; init; }

		public Sprite overrideSprite { get; init; }

		public Type type { get; init; }

		public bool preserveAspect { get; init; }

		public bool fillCenter { get; init; } = true;


		public FillMethod fillMethod { get; init; } = (FillMethod)4;


		public bool fillClockwise { get; init; } = true;


		public int fillOrigin { get; init; }

		public float alphaHitTestMinimumThreshold { get; init; }

		public bool useSpriteMesh { get; init; }

		public void Apply(Image component)
		{
			//IL_003d: 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)
			base.Apply((MaskableGraphic)(object)component);
			if ((Object)(object)sprite != (Object)null)
			{
				component.sprite = sprite;
			}
			if ((Object)(object)overrideSprite != (Object)null)
			{
				component.overrideSprite = overrideSprite;
			}
			component.type = type;
			component.preserveAspect = preserveAspect;
			component.fillCenter = fillCenter;
			component.fillMethod = fillMethod;
			component.fillClockwise = fillClockwise;
			component.fillOrigin = fillOrigin;
			component.alphaHitTestMinimumThreshold = alphaHitTestMinimumThreshold;
			component.useSpriteMesh = useSpriteMesh;
		}

		[CompilerGenerated]
		protected override bool PrintMembers(StringBuilder builder)
		{
			//IL_0055: 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_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			if (base.PrintMembers(builder))
			{
				builder.Append(", ");
			}
			builder.Append("sprite = ");
			builder.Append(sprite);
			builder.Append(", overrideSprite = ");
			builder.Append(overrideSprite);
			builder.Append(", type = ");
			Type val = type;
			builder.Append(((object)(Type)(ref val)).ToString());
			builder.Append(", preserveAspect = ");
			builder.Append(preserveAspect.ToString());
			builder.Append(", fillCenter = ");
			builder.Append(fillCenter.ToString());
			builder.Append(", fillMethod = ");
			FillMethod val2 = fillMethod;
			builder.Append(((object)(FillMethod)(ref val2)).ToString());
			builder.Append(", fillClockwise = ");
			builder.Append(fillClockwise.ToString());
			builder.Append(", fillOrigin = ");
			builder.Append(fillOrigin.ToString());
			builder.Append(", alphaHitTestMinimumThreshold = ");
			builder.Append(alphaHitTestMinimumThreshold.ToString());
			builder.Append(", useSpriteMesh = ");
			builder.Append(useSpriteMesh.ToString());
			return true;
		}
	}
	public static class GraphicPropertiesBuilder
	{
		public static readonly ImageProperties ImagePropertiesDefault = new ImageProperties();

		public static readonly TranslucentImageProperties TranslucentImagePropertiesDefault = new TranslucentImageProperties();

		public static T WithRaycast<T>(this T record, bool raycastTarget) where T : GraphicProperties
		{
			T obj = (T)record.<Clone>$();
			obj.raycastTarget = raycastTarget;
			return obj;
		}

		public static T WithColor<T>(this T record, Color color) where T : GraphicProperties
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			T obj = (T)record.<Clone>$();
			obj.color = color;
			return obj;
		}

		public static T WithMaterial<T>(this T record, Material material) where T : GraphicProperties
		{
			T obj = (T)record.<Clone>$();
			obj.material = material;
			return obj;
		}

		public static T WithSprite<T>(this T record, Sprite sprite, Sprite overrideSprite = null, Type? type = null) where T : ImageProperties
		{
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			T obj = (T)record.<Clone>$();
			obj.sprite = sprite;
			obj.overrideSprite = (Object.op_Implicit((Object)(object)overrideSprite) ? overrideSprite : record.overrideSprite);
			obj.type = (type.HasValue ? type.Value : record.type);
			return obj;
		}

		public static T WithSlicedSprite<T>(this T record, Sprite sprite, Sprite overrideSprite = null) where T : ImageProperties
		{
			return record.WithSprite(sprite, overrideSprite, (Type)1);
		}
	}
	public record TranslucentImageProperties : ImageProperties, IProperties<TranslucentImage>
	{
		public TranslucentImageSource source { get; init; }

		public float vibrancy { get; init; } = 1f;


		public float brightness { get; init; }

		public float flatten { get; init; } = 0.1f;


		public bool updating { get; init; } = true;


		public bool lateUpdating { get; init; } = true;


		public float spriteBlending { get; init; } = 0.65f;


		public void Apply(TranslucentImage component)
		{
			base.Apply((Image)(object)component);
			component.vibrancy = vibrancy;
			component.brightness = brightness;
			component.flatten = flatten;
			component.updating = updating;
			component.lateUpdating = lateUpdating;
			component.spriteBlending = spriteBlending;
		}
	}
	public record TextProperties : MaskableGraphicProperties, IProperties<Text>
	{
		public Font font { get; init; }

		public bool supportRichText { get; init; } = true;


		public bool resizeTextForBestFit { get; init; }

		public int resizeTextMinSize { get; init; } = 14;


		public int resizeTextMaxSize { get; init; } = 40;


		public TextAnchor alignment { get; init; }

		public bool alignByGeometry { get; init; }

		public int fontSize { get; init; } = 14;


		public HorizontalWrapMode horizontalOverflow { get; init; }

		public VerticalWrapMode verticalOverflow { get; init; }

		public float lineSpacing { get; init; } = 1f;


		public FontStyle fontStyle { get; init; }

		public void Apply(Text component)
		{
			//IL_0053: 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_0083: 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)
			base.Apply((MaskableGraphic)(object)component);
			if ((Object)(object)font != (Object)null)
			{
				component.font = font;
			}
			component.supportRichText = supportRichText;
			component.resizeTextForBestFit = resizeTextForBestFit;
			component.resizeTextMinSize = resizeTextMinSize;
			component.resizeTextMaxSize = resizeTextMaxSize;
			component.alignment = alignment;
			component.alignByGeometry = alignByGeometry;
			component.fontSize = fontSize;
			component.horizontalOverflow = horizontalOverflow;
			component.verticalOverflow = verticalOverflow;
			component.lineSpacing = lineSpacing;
			component.fontStyle = fontStyle;
		}

		[CompilerGenerated]
		protected override bool PrintMembers(StringBuilder builder)
		{
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: 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_01c9: Unknown result type (might be due to invalid IL or missing references)
			if (base.PrintMembers(builder))
			{
				builder.Append(", ");
			}
			builder.Append("font = ");
			builder.Append(font);
			builder.Append(", supportRichText = ");
			builder.Append(supportRichText.ToString());
			builder.Append(", resizeTextForBestFit = ");
			builder.Append(resizeTextForBestFit.ToString());
			builder.Append(", resizeTextMinSize = ");
			builder.Append(resizeTextMinSize.ToString());
			builder.Append(", resizeTextMaxSize = ");
			builder.Append(resizeTextMaxSize.ToString());
			builder.Append(", alignment = ");
			TextAnchor val = alignment;
			builder.Append(((object)(TextAnchor)(ref val)).ToString());
			builder.Append(", alignByGeometry = ");
			builder.Append(alignByGeometry.ToString());
			builder.Append(", fontSize = ");
			builder.Append(fontSize.ToString());
			builder.Append(", horizontalOverflow = ");
			HorizontalWrapMode val2 = horizontalOverflow;
			builder.Append(((object)(HorizontalWrapMode)(ref val2)).ToString());
			builder.Append(", verticalOverflow = ");
			VerticalWrapMode val3 = verticalOverflow;
			builder.Append(((object)(VerticalWrapMode)(ref val3)).ToString());
			builder.Append(", lineSpacing = ");
			builder.Append(lineSpacing.ToString());
			builder.Append(", fontStyle = ");
			FontStyle val4 = fontStyle;
			builder.Append(((object)(FontStyle)(ref val4)).ToString());
			return true;
		}
	}
	public record SelectableProperties : IProperties<Selectable>
	{
		public Transition? transition { get; init; }

		public ColorBlock? colors { get; init; }

		public SpriteState? spriteState { get; init; }

		public void Apply(Selectable component)
		{
			//IL_001a: 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_0062: Unknown result type (might be due to invalid IL or missing references)
			if (transition.HasValue)
			{
				component.transition = transition.Value;
			}
			if (colors.HasValue)
			{
				component.colors = colors.Value;
			}
			if (spriteState.HasValue)
			{
				component.spriteState = spriteState.Value;
			}
		}
	}
	public record ScrollRectProperties : IProperties<ScrollRect>
	{
		public MovementType movementType { get; init; } = (MovementType)1;


		public float elasticity { get; init; } = 0.1f;


		public bool inertia { get; init; } = true;


		public float decelerationRate { get; init; } = 0.135f;


		public float scrollSensitivity { get; init; } = 1f;


		public float horizontalScrollbarSpacing { get; init; }

		public float verticalScrollbarSpacing { get; init; }

		public void Apply(ScrollRect component)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			component.movementType = movementType;
			component.elasticity = elasticity;
			component.inertia = inertia;
			component.decelerationRate = decelerationRate;
			component.scrollSensitivity = scrollSensitivity;
			component.horizontalScrollbarSpacing = horizontalScrollbarSpacing;
			component.verticalScrollbarSpacing = verticalScrollbarSpacing;
		}

		[CompilerGenerated]
		protected virtual bool PrintMembers(StringBuilder builder)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			RuntimeHelpers.EnsureSufficientExecutionStack();
			builder.Append("movementType = ");
			MovementType val = movementType;
			builder.Append(((object)(MovementType)(ref val)).ToString());
			builder.Append(", elasticity = ");
			builder.Append(elasticity.ToString());
			builder.Append(", inertia = ");
			builder.Append(inertia.ToString());
			builder.Append(", decelerationRate = ");
			builder.Append(decelerationRate.ToString());
			builder.Append(", scrollSensitivity = ");
			builder.Append(scrollSensitivity.ToString());
			builder.Append(", horizontalScrollbarSpacing = ");
			builder.Append(horizontalScrollbarSpacing.ToString());
			builder.Append(", verticalScrollbarSpacing = ");
			builder.Append(verticalScrollbarSpacing.ToString());
			return true;
		}
	}
	public static class UIBuilderPlugin
	{
		private static Harmony _harmony;

		public static ManualLogSource Log;

		private static string GUID;

		public static void Create(string requestingModGUID, Action onReadyCallback)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			GUID = requestingModGUID + "-UIBuilder";
			Log = Logger.CreateLogSource(GUID);
			_harmony = new Harmony(GUID);
			_harmony.PatchAll(typeof(UIBuilder));
			UIBuilder.QueueReadyCallback(onReadyCallback);
			UIRoot instance = UIRoot.instance;
			bool? obj;
			if (instance == null)
			{
				obj = null;
			}
			else
			{
				UIGame uiGame = instance.uiGame;
				obj = ((uiGame != null) ? new bool?(((ManualBehaviour)uiGame).created) : null);
			}
			bool? flag = obj;
			if (flag.GetValueOrDefault())
			{
				UIBuilder.Create();
			}
			Log.LogInfo((object)(GUID + " Create() called"));
		}

		public static void Destroy()
		{
			UIBuilder.Destroy();
			Log.LogInfo((object)(GUID + " Destroy() called"));
			Harmony harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			Log = null;
		}
	}
	public enum AnchorHorizontal
	{
		Left,
		Middle,
		Right,
		Stretch
	}
	public enum AnchorVertical
	{
		Top,
		Middle,
		Bottom,
		Stretch
	}
	public record Anchor(AnchorVertical vertical, AnchorHorizontal horizontal)
	{
		public static Anchor TopLeft = new Anchor(AnchorVertical.Top, AnchorHorizontal.Left);

		public static Anchor Top = new Anchor(AnchorVertical.Top, AnchorHorizontal.Middle);

		public static Anchor TopRight = new Anchor(AnchorVertical.Top, AnchorHorizontal.Right);

		public static Anchor Left = new Anchor(AnchorVertical.Middle, AnchorHorizontal.Left);

		public static Anchor Center = new Anchor(AnchorVertical.Middle, AnchorHorizontal.Middle);

		public static Anchor Right = new Anchor(AnchorVertical.Middle, AnchorHorizontal.Right);

		public static Anchor BottomLeft = new Anchor(AnchorVertical.Bottom, AnchorHorizontal.Left);

		public static Anchor Bottom = new Anchor(AnchorVertical.Bottom, AnchorHorizontal.Middle);

		public static Anchor BottomRight = new Anchor(AnchorVertical.Bottom, AnchorHorizontal.Right);

		public static Anchor Stretch = new Anchor(AnchorVertical.Stretch, AnchorHorizontal.Stretch);

		public static Anchor TopStretch = new Anchor(AnchorVertical.Top, AnchorHorizontal.Stretch);

		public static Anchor CenterStretch = new Anchor(AnchorVertical.Middle, AnchorHorizontal.Stretch);

		public static Anchor BottomStretch = new Anchor(AnchorVertical.Bottom, AnchorHorizontal.Stretch);

		public static Anchor StretchLeft = new Anchor(AnchorVertical.Stretch, AnchorHorizontal.Left);

		public static Anchor StretchCenter = new Anchor(AnchorVertical.Stretch, AnchorHorizontal.Middle);

		public static Anchor StretchRight = new Anchor(AnchorVertical.Stretch, AnchorHorizontal.Right);

		public (Vector2, Vector2) ToMinMaxAnchors()
		{
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			var (num, num2) = horizontal switch
			{
				AnchorHorizontal.Left => (0f, 0f), 
				AnchorHorizontal.Right => (1f, 1f), 
				AnchorHorizontal.Middle => (0.5f, 0.5f), 
				AnchorHorizontal.Stretch => (0f, 1f), 
				_ => throw new NotImplementedException(), 
			};
			var (num3, num4) = vertical switch
			{
				AnchorVertical.Bottom => (0f, 0f), 
				AnchorVertical.Top => (1f, 1f), 
				AnchorVertical.Middle => (0.5f, 0.5f), 
				AnchorVertical.Stretch => (0f, 1f), 
				_ => throw new NotImplementedException(), 
			};
			return (new Vector2(num, num3), new Vector2(num2, num4));
		}

		[CompilerGenerated]
		protected Anchor(Anchor original)
		{
			vertical = original.vertical;
			horizontal = original.horizontal;
		}
	}
	public interface IButtonSelectableContext : ISelectableContext
	{
		Button button { get; }
	}
	public record ButtonContext(Button button, Text text) : UIElementContext(((Component)button).gameObject), IButtonSelectableContext, ISelectableContext, ITextContext, IGraphicContext, ISelectableVisuals
	{
		public Graphic visuals { get; set; }

		Text ITextContext.text => text;

		Graphic IGraphicContext.graphic => (Graphic)(object)text;

		Button IButtonSelectableContext.button => button;

		Selectable ISelectableContext.selectable => (Selectable)(object)button;
	}
	public static class ButtonContextExtensions
	{
		public static ButtonContext Select(Button button, Text text = null, Graphic visuals = null)
		{
			return new ButtonContext(button, text)
			{
				visuals = visuals
			};
		}

		public static ButtonContext Create(GameObject buttonObj, GameObject textObj)
		{
			Button orCreateComponent = buttonObj.GetOrCreateComponent<Button>();
			Text orCreateComponent2 = textObj.GetOrCreateComponent<Text>();
			return Select(orCreateComponent, orCreateComponent2);
		}

		public static ButtonContext Create(GameObject buttonObj)
		{
			return Select(buttonObj.GetOrCreateComponent<Button>());
		}

		public static ButtonContext Create(GameObject buttonObj, string buttonText)
		{
			return Create(buttonObj.GetOrCreateComponent<Button>(), buttonText);
		}

		public static ButtonContext Create(Button button, string buttonText)
		{
			TextContext context = UIBuilderDSL.Create.Text("text");
			VerticalWrapMode? vertical = (VerticalWrapMode)0;
			TextContext textContext = context.WithOverflow(null, vertical).WithFont(UIBuilder.fontSAIRASB).WithFontSize(16)
				.WithLocalizer(buttonText)
				.ChildOf(((Component)button).gameObject)
				.WithAnchor(Anchor.Stretch)
				.At(0, 0);
			return Select(button, textContext.text);
		}
	}
	public static class IButtonContextExtensions
	{
		public static T AddClickListener<T>(this T Context, UnityAction onClickCallback) where T : IButtonSelectableContext
		{
			if (onClickCallback != null)
			{
				((UnityEvent)Context.button.onClick).AddListener(onClickCallback);
			}
			return Context;
		}

		public static T RemoveClickListener<T>(this T Context, UnityAction onClickCallback) where T : IButtonSelectableContext
		{
			if (onClickCallback != null)
			{
				((UnityEvent)Context.button.onClick).RemoveListener(onClickCallback);
			}
			return Context;
		}

		public static T ClearClickListeners<T>(this T Context) where T : IButtonSelectableContext
		{
			((UnityEventBase)Context.button.onClick).RemoveAllListeners();
			return Context;
		}

		public static T SetClickListener<T>(this T Context, UnityAction onClickCallback) where T : IButtonSelectableContext
		{
			return Context.ClearClickListeners().AddClickListener(onClickCallback);
		}
	}
	public static class UIBuilderDSL
	{
		public record ComboBoxContext : UIElementContext
		{
			public ComboBoxContext Context => this;

			public ComboBoxContext(GameObject uiElement)
				: base(uiElement)
			{
			}
		}

		public record FancyWindowContext : WindowContext<FancyWindowContext>
		{
			public override FancyWindowContext Context => this;

			protected override TranslucentImageProperties panelBgCloneImgProperties => UIBuilder.fancyWindowPanelBgProperties;

			protected override ImageProperties panelBgBorderCloneImgProperties => UIBuilder.fancyWindowPanelBgBorderProperties;

			protected override ImageProperties panelBgDragTriggerCloneImgProperties => UIBuilder.fancyWindowPanelBgDragTriggerProperties;

			protected override ImageProperties shadowCloneImgProperties => UIBuilder.fancyWindowShadowImgProperties;

			public FancyWindowContext(GameObject uiElement)
				: base(uiElement)
			{
			}

			internal FancyWindowContext WithButtonBox(bool withSortBtn)
			{
				WithPanelBg();
				if ((Object)(object)base.panelBg.SelectChild("btn-box") != (Object)null)
				{
					return Context;
				}
				TranslucentImage component;
				UIElementContext parent = UIElementExtensions.WithComponent<UIElementContext, TranslucentImage>(Create.UIElement("btn-box"), out component, new IProperties<TranslucentImage>[1] { UIBuilder.fancyWindowPanelBgBtnBoxProperties }).ChildOf(base.panelBg).WithAnchor(Anchor.TopRight)
					.WithPivot(0.5f, 0.5f)
					.OfSize(withSortBtn ? 60 : 40, 24)
					.At(withSortBtn ? (-60) : (-50), -30);
				UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("btn-border"), out Image _, new IProperties<Image>[1] { UIBuilder.fancyWindowPanelBgBtnBoxBorderProperties }).ChildOf(parent).WithAnchor(Anchor.Stretch);
				return Context;
			}

			public FancyWindowContext WithCloseButton(UnityAction closeCallback)
			{
				using (base.DeactivatedScope)
				{
					WithButtonBox(withSortBtn: false);
					GameObject val = base.panelBg.SelectChild("btn-box");
					if ((Object)(object)val.SelectChild("close-btn") != (Object)null)
					{
						return Context;
					}
					Image component;
					UIElementContext uIElementContext = UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("close-btn"), out component, new IProperties<Image>[1] { UIBuilder.fancyWindowPanelBgBtnBoxHexBtnProperties }).ChildOf(val).WithPivot(0.5f, 0.5f)
						.OfSize(38, 23);
					UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("x"), out Image component2, new IProperties<Image>[1] { UIBuilder.fancyWindowPanelBgBtnBoxCloseBtnXProperties }).ChildOf(uIElementContext).WithPivot(0.5f, 0.5f)
						.OfSize(10, 10);
					UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("col"), out Image _, new IProperties<Image>[1] { UIBuilder.fancyWindowPanelBgBtnBoxCloseBtnColProperties }).ChildOf(uIElementContext).WithPivot(0.5f, 0.5f)
						.OfSize(25, 19);
					uIElementContext.WithComponent<UIElementContext, Button>(out Button _, (Action<Button>)delegate(Button b)
					{
						((UnityEvent)b.onClick).AddListener(closeCallback);
					}).WithTransitions(UIBuilder.fancyWindowPanelBgBtnBoxCloseBtnTransition.CloneWithTarget((Graphic)(object)component), UIBuilder.fancyWindowPanelBgBtnBoxCloseBtnXTransition.CloneWithTarget((Graphic)(object)component2));
					return Context;
				}
			}

			public FancyWindowContext WithCloseAndSortButton(UnityAction closeCallback, UnityAction sortCallback)
			{
				WithButtonBox(withSortBtn: true);
				GameObject val = base.panelBg.SelectChild("btn-box");
				if ((Object)(object)val.SelectChild("close-btn") != (Object)null)
				{
					return Context;
				}
				Image component;
				UIElementContext uIElementContext = UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("close-btn"), out component, new IProperties<Image>[1] { UIBuilder.fancyWindowPanelBgBtnBoxHexBtnRProperties }).ChildOf(val).WithPivot(0.5f, 0.5f)
					.OfSize(30, 24)
					.At(15, 0);
				Image component2;
				UIElementContext uIElementContext2 = UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("sort-btn"), out component2, new IProperties<Image>[1] { UIBuilder.fancyWindowPanelBgBtnBoxHexBtnLProperties }).ChildOf(val).WithPivot(0.5f, 0.5f)
					.OfSize(30, 24)
					.At(-15, 0);
				UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("x"), out Image component3, new IProperties<Image>[1] { UIBuilder.fancyWindowPanelBgBtnBoxCloseBtnXProperties }).ChildOf(uIElementContext).WithPivot(0.5f, 0.5f)
					.OfSize(10, 10)
					.At(-3, 0);
				UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("col"), out Image component4, new IProperties<Image>[1] { UIBuilder.fancyWindowPanelBgBtnBoxCloseBtnColProperties }).ChildOf(uIElementContext).WithPivot(0.5f, 0.5f)
					.OfSize(25, 19)
					.At(-2, 0);
				UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("x"), out Image component5, new IProperties<Image>[1] { UIBuilder.fancyWindowPanelBgBtnBoxSortBtnXProperties }).ChildOf(uIElementContext2).WithPivot(0.5f, 0.5f)
					.OfSize(10, 10)
					.At(3, 0);
				UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("col"), out component4, new IProperties<Image>[1] { UIBuilder.fancyWindowPanelBgBtnBoxSortBtnColProperties }).ChildOf(uIElementContext2).WithPivot(0.5f, 0.5f)
					.OfSize(25, 19)
					.At(2, 0);
				uIElementContext.WithComponent<UIElementContext, Button>(out Button component6, (Action<Button>)delegate(Button b)
				{
					((UnityEvent)b.onClick).AddListener(closeCallback);
				}).WithTransitions(UIBuilder.fancyWindowPanelBgBtnBoxCloseBtnTransition.CloneWithTarget((Graphic)(object)component), UIBuilder.fancyWindowPanelBgBtnBoxCloseBtnXTransition.CloneWithTarget((Graphic)(object)component3));
				uIElementContext2.WithComponent<UIElementContext, Button>(out component6, (Action<Button>)delegate(Button b)
				{
					((UnityEvent)b.onClick).AddListener(sortCallback);
				}).WithTransitions(UIBuilder.fancyWindowPanelBgBtnBoxSortBtnTransition.CloneWithTarget((Graphic)(object)component2), UIBuilder.fancyWindowPanelBgBtnBoxSortBtnXTransition.CloneWithTarget((Graphic)(object)component5));
				return Context;
			}

			public override FancyWindowContext WithBorder()
			{
				WithPanelBg();
				UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("border"), out Image _, new IProperties<Image>[1] { panelBgBorderCloneImgProperties }).ChildOf(base.panelBg).WithAnchor(Anchor.Stretch)
					.OfSize(0, 0);
				return Context;
			}

			public override FancyWindowContext WithTitle(string title)
			{
				WithPanelBg();
				Create.Text("title-text").ChildOf(base.panelBg).WithAnchor(Anchor.TopLeft)
					.At(40, -20)
					.WithLocalizer(title)
					.WithFont(UIBuilder.fontSAIRAB)
					.WithFontSize(18)
					.WithAlignment((TextAnchor)3)
					.OfSize(158, 36)
					.WithOverflow((HorizontalWrapMode)0, (VerticalWrapMode)0);
				return Context;
			}

			[CompilerGenerated]
			public new void Deconstruct(out GameObject uiElement)
			{
				uiElement = base.uiElement;
			}
		}

		public record PlainWindowContext : WindowContext<PlainWindowContext>
		{
			public override PlainWindowContext Context => this;

			protected override TranslucentImageProperties panelBgCloneImgProperties => UIBuilder.plainWindowPanelBgProperties;

			protected override ImageProperties panelBgBorderCloneImgProperties => UIBuilder.plainWindowPanelBgBorderProperties;

			protected override ImageProperties panelBgDragTriggerCloneImgProperties => UIBuilder.plainWindowPanelBgDragTriggerProperties;

			protected override ImageProperties shadowCloneImgProperties => UIBuilder.plainWindowShadowImgProperties;

			public PlainWindowContext(GameObject uiElement)
				: base(uiElement)
			{
			}

			public override PlainWindowContext WithShadow()
			{
				base.WithShadow();
				new UIElementContext(base.uiElement.SelectChild("shadow")).OfSize(44, 44);
				return Context;
			}

			public PlainWindowContext WithCloseButton(UnityAction closeCallback)
			{
				WithPanelBg();
				if ((Object)(object)base.panelBg.SelectChild("x") != (Object)null)
				{
					return Context;
				}
				_ = UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("x"), out Image component, new IProperties<Image>[1] { UIBuilder.plainWindowPanelBgXProperties }).WithComponent<UIElementContext, Button>(out Button _, (Action<Button>)delegate(Button b)
				{
					((UnityEvent)b.onClick).AddListener(closeCallback);
				}).WithTransitions(UIBuilder.plainWindowPanelBgXTransition.CloneWithTarget((Graphic)(object)component))
					.ChildOf(base.panelBg)
					.WithAnchor(Anchor.TopRight)
					.OfSize(21, 21)
					.At(-13, -13)
					.uiElement;
				return Context;
			}

			public override PlainWindowContext WithBorder()
			{
				WithPanelBg();
				UIElementExtensions.WithComponent<UIElementContext, Image>(Create.UIElement("border"), out Image _, new IProperties<Image>[1] { panelBgBorderCloneImgProperties }).ChildOf(base.panelBg).WithAnchor(Anchor.Stretch)
					.OfSize(6, 6);
				return Context;
			}

			public override PlainWindowContext WithTitle(string title)
			{
				//IL_006d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0072: Unknown result type (might be due to invalid IL or missing references)
				//IL_007a: Unknown result type (might be due to invalid IL or missing references)
				WithPanelBg();
				TextContext context = IGraphicContextExtensions.WithMaterial(Create.Text("title-text").ChildOf(base.panelBg).WithAnchor(Anchor.TopLeft)
					.At(15, -24)
					.WithLocalizer(title)
					.WithFont(UIBuilder.fontSAIRAB)
					.WithFontSize(18)
					.WithAlignment((TextAnchor)3), UIBuilder.materialWidgetTextAlpha5x);
				Color white = Color.white;
				IGraphicContextExtensions.WithColor(context, ((Color)(ref white)).AlphaMultiplied(0.6f)).WithContentSizeFitter((FitMode)2);
				return Context;
			}

			[CompilerGenerated]
			public new void Deconstruct(out GameObject uiElement)
			{
				uiElement = base.uiElement;
			}
		}

		[StructLayout(LayoutKind.Sequential, Size = 1)]
		public struct SelectContext
		{
			public readonly UIElementContext UIElement(RectTransform transform)
			{
				return UIElementExtensions.Select(((Component)transform).gameObject);
			}

			public readonly UIElementContext UIElement(GameObject obj)
			{
				return UIElementExtensions.Select(obj);
			}

			public readonly PlainWindowContext PlainWindow(GameObject obj)
			{
				return new PlainWindowContext(obj);
			}

			public readonly FancyWindowContext FancyWindow(GameObject obj)
			{
				return new FancyWindowContext(obj);
			}

			public readonly ScrollViewContext ScrollView(ScrollRect scrollRect)
			{
				return ScrollViewContextExtensions.Select(scrollRect);
			}

			public readonly ButtonContext Button(Button button, Text text = null, Graphic visuals = null)
			{
				return ButtonContextExtensions.Select(button, text, visuals);
			}

			public readonly ToggleContext Toggle(Toggle toggle, Image image = null)
			{
				return ToggleContextExtensions.Select(toggle, image);
			}

			public readonly ToggleButtonContext ToggleButton(Toggle toggle, Text text = null, Graphic visuals = null)
			{
				return ToggleButtonContextExtensions.Select(toggle, text, visuals);
			}

			public readonly TextContext Text(Text text)
			{
				return TextContextExtensions.Select(text);
			}

			public readonly SliderContext Slider(Slider slider, Image fill, Image handle = null)
			{
				return SliderContextExtensions.Select(slider, fill, handle);
			}

			public readonly InputFieldContext InputField(InputField inputField, Text text = null)
			{
				return InputFieldContextExtensions.Select(inputField, text);
			}

			public readonly ComboBoxContext ComboBox(GameObject obj)
			{
				return new ComboBoxContext(obj);
			}

			public readonly HorizontalLayoutGroupContext HorizontalLayoutGroup(GameObject obj)
			{
				return new HorizontalLayoutGroupContext(obj);
			}

			public readonly VerticalLayoutGroupContext VerticalLayoutGroup(GameObject obj)
			{
				return new VerticalLayoutGroupContext(obj);
			}

			public readonly GridLayoutGroupContext GridLayoutGroup(GameObject obj)
			{
				return new GridLayoutGroupContext(obj);
			}
		}

		[StructLayout(LayoutKind.Sequential, Size = 1)]
		public struct CreateContext
		{
			public readonly UIElementContext UIElement(string name)
			{
				return UIElementExtensions.Create(name);
			}

			public readonly PlainWindowContext PlainWindow(string name)
			{
				return Select.PlainWindow(UIElement(name).uiElement).WithBorder().WithShadow()
					.WithDragProperties()
					.WithResizeProperties();
			}

			public readonly FancyWindowContext FancyWindow(string name)
			{
				return Select.FancyWindow(UIElement(name).uiElement).WithBorder().WithShadow()
					.WithDragProperties()
					.WithResizeProperties();
			}

			public readonly ScrollViewContext ScrollView(string name, ScrollViewConfiguration configuration)
			{
				return ScrollViewContextExtensions.Create(UIElement(name).uiElement, configuration);
			}

			public readonly ButtonContext Button(string name, string buttonText, UnityAction onClickCallback = null)
			{
				return ButtonContextExtensions.Create(UIElement(name).uiElement, buttonText).AddClickListener(onClickCallback);
			}

			public readonly ToggleContext Toggle(string name)
			{
				return ToggleContextExtensions.Create(UIElement(name).uiElement);
			}

			public readonly ToggleButtonContext ToggleButton(string name, string buttonText)
			{
				return ToggleButtonContextExtensions.Create(UIElement(name).uiElement, buttonText);
			}

			public readonly TextContext Text(string name)
			{
				return TextContextExtensions.Create(UIElement(name).uiElement);
			}

			public readonly SliderContext Slider(string name, SliderConfiguration configuration)
			{
				return SliderContextExtensions.Create(UIElement(name).uiElement, configuration);
			}

			public readonly InputFieldContext InputField(string name)
			{
				return InputFieldContextExtensions.Create(UIElement(name).uiElement);
			}

			public readonly ComboBoxContext ComboBox(string name)
			{
				UIComboBox val = Object.Instantiate<UIComboBox>(UIBuilder.comboBoxComponent, (Transform)null, false);
				return Select.ComboBox(((Component)val).gameObject);
			}

			public readonly HorizontalLayoutGroupContext HorizontalLayoutGroup(string name)
			{
				return Select.HorizontalLayoutGroup(UIElement(name).uiElement);
			}

			public readonly VerticalLayoutGroupContext VerticalLayoutGroup(string name)
			{
				return Select.VerticalLayoutGroup(UIElement(name).uiElement);
			}

			public readonly GridLayoutGroupContext GridLayoutGroup(string name)
			{
				return Select.GridLayoutGroup(UIElement(name).uiElement);
			}
		}

		public abstract record WindowContext<T> : UIElementContext where T : WindowContext<T>
		{
			public bool scrollCapture { get; set; }

			public GameObject panelBg { get; protected set; }

			protected abstract TranslucentImageProperties panelBgCloneImgProperties { get; }

			protected abstract ImageProperties panelBgBorderCloneImgProperties { get; }

			protected abstract ImageProperties panelBgDragTriggerCloneImgProperties { get; }

			protected abstract ImageProperties shadowCloneImgProperties { get; }

			public abstract T Context { get; }

			protected WindowContext(GameObject uiElement)
				: base(uiElement)
			{
			}

			public T WithScrollCapture()
			{
				scrollCapture = true;
				return Context;
			}

			internal T WithPanelBg()
			{
				if ((Object)(object)panelBg != (Object)null)
				{
					return Context;
				}
				panelBg = UIElementExtensions.WithComponent<UIElementContext, TranslucentImage>(Create.UIElement("panel-bg"), out TranslucentImage _, new IProperties<TranslucentImage>[1] { panelBgCloneImgProperties }).ChildOf(base.uiElement).WithAnchor(Anchor.Stretch)
					.uiElement;
				return Context;
			}

			internal T WithDragSuppor