Decompiled source of PathfindingLib v2.3.2

PathfindingLib.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Concurrent;
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 System.Threading;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using MonoMod.RuntimeDetour;
using PathfindingLib.API;
using PathfindingLib.API.SmartPathfinding;
using PathfindingLib.Components;
using PathfindingLib.Data;
using PathfindingLib.Jobs;
using PathfindingLib.Patches;
using PathfindingLib.Patches.Native;
using PathfindingLib.Utilities;
using PathfindingLib.Utilities.Collections;
using PathfindingLib.Utilities.Internal.IL;
using PathfindingLib.Utilities.Native;
using Unity.AI.Navigation;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Jobs;
using Unity.Jobs.LowLevel.Unsafe;
using Unity.Mathematics;
using Unity.Mathematics.Geometry;
using Unity.Netcode;
using Unity.Profiling;
using Unity.Profiling.LowLevel.Unsafe;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Experimental.AI;
using UnityEngine.Pool;
using UnityEngine.Scripting;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("PathfindingLib")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PathfindingLib")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("fedb984b-16ae-458c-b2cc-19590627c578")]
[assembly: AssemblyFileVersion("2.3.2")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.3.2.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class IsUnmanagedAttribute : Attribute
	{
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace PathfindingLib
{
	[BepInPlugin("Zaggy1024.PathfindingLib", "PathfindingLib", "2.3.2")]
	public class PathfindingLibPlugin : BaseUnityPlugin
	{
		public const string PluginName = "PathfindingLib";

		public const string PluginGUID = "Zaggy1024.PathfindingLib";

		public const string PluginVersion = "2.3.2";

		private readonly Harmony harmony = new Harmony("Zaggy1024.PathfindingLib");

		internal ConfigEntry<bool> PatchOffMeshConnectionStutterStepping;

		internal static PathfindingLibPlugin Instance { get; private set; }

		internal ManualLogSource Logger => ((BaseUnityPlugin)this).Logger;

		public void Awake()
		{
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Expected O, but got Unknown
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			Instance = this;
			PatchOffMeshConnectionStutterStepping = ((BaseUnityPlugin)this).Config.Bind<bool>("Vanilla Patches", "PatchOffMeshConnectionStutterStepping", true, "Whether to patch auto-updating OffMeshLinks and NavMeshLinks to avoid invalidating paths and causing AI to stutter-step.");
			ApplyAllNativePatches();
			harmony.PatchAll(typeof(PatchNavMeshSurface));
			harmony.PatchAll(typeof(PatchEntranceTeleport));
			harmony.PatchAll(typeof(PatchMineshaftElevatorController));
			if (PatchOffMeshConnectionStutterStepping.Value)
			{
				ApplyOffMeshConnectionStutterSteppingPatches(harmony);
			}
			GameObject val = new GameObject("SmartPathTaskDisposer");
			Object.DontDestroyOnLoad((Object)val);
			((Object)val).hideFlags = (HideFlags)61;
			val.AddComponent<SmartPathTaskDisposer>();
		}

		private static void ApplyAllNativePatches()
		{
			NativeFunctions.SetUpNativeMethodPointers();
			NavMeshQueryUtils.SetUpNativeMethodPointers();
			PatchNavMeshManagerUpdate.Apply();
			PatchConnectUnconnectOffMeshConnection.Apply();
			PatchApplyCarveResults.Apply();
			PatchNavMeshAgent.Apply();
		}

		private static void ApplyOffMeshConnectionStutterSteppingPatches(Harmony harmony)
		{
			harmony.PatchAll(typeof(PatchNavMeshLink));
			PatchOffMeshLinkUpdatePositions.Apply();
		}
	}
}
namespace PathfindingLib.Utilities
{
	public static class AgentExtensions
	{
		public static Vector3 GetPathOrigin(this NavMeshAgent agent)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			IntPtr cachedPtr = ((Object)agent).GetCachedPtr();
			return NativeFunctions.GetAgentPosition(cachedPtr);
		}

		public unsafe static void GetQueryFilter(this NavMeshAgent agent, out int agentTypeID, out int areaMask, out Span<float> costs)
		{
			agentTypeID = -1;
			areaMask = -1;
			costs = default(Span<float>);
			IntPtr cachedPtr = ((Object)agent).GetCachedPtr();
			if (!(cachedPtr == IntPtr.Zero))
			{
				QueryFilter* agentQueryFilter = NativeFunctions.GetAgentQueryFilter(cachedPtr);
				if (agentQueryFilter != null)
				{
					agentTypeID = (int)agentQueryFilter->AgentType;
					areaMask = (int)agentQueryFilter->AreaMask;
					costs = new Span<float>(UnsafeUtility.AddressOf<float>(ref agentQueryFilter->CostsStart), 32);
				}
			}
		}
	}
	[StructLayout(LayoutKind.Sequential, Pack = 4)]
	public struct NavMeshPathNative
	{
		public int offMeshLinkModCount;

		public int status;

		public IntPtr polygons;

		public unsafe fixed int padding[4];

		public ulong size;

		public ulong capacity;

		public Vector3 sourcePosition;

		public Vector3 targetPosition;

		public unsafe Span<PolygonId> currentPolygons => new Span<PolygonId>(polygons.ToPointer(), (int)size);

		public override readonly string ToString()
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			return $"modcount {offMeshLinkModCount} status {status} polys {(ulong)(long)polygons:X16} source {sourcePosition} target {targetPosition} size {size} capacity {capacity}";
		}

		public unsafe static NavMeshPathNative GetNativeData(NavMeshPath path)
		{
			return Unsafe.Read<NavMeshPathNative>(path.m_Ptr.ToPointer());
		}
	}
	[Flags]
	public enum StraightPathFlags : byte
	{
		Start = 1,
		End = 2,
		OffMeshConnection = 4
	}
	public static class NavMeshQueryUtils
	{
		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private unsafe delegate PathQueryStatus FindStraightPathDelegate(NavMeshQuery self, in Vector3 startPos, in Vector3 endPos, PolygonId* path, int pathSize, Vector3* straightPath, StraightPathFlags* straightPathFlags, PolygonId* straightPathRefs, ref int straightPathCount, int maxStraightPath);

		public const int RecommendedCornerCount = 128;

		private static FindStraightPathDelegate findStraightPathMethod;

		public static int RequiredCornerCount(int pathPolygonCount)
		{
			return pathPolygonCount + 2;
		}

		public static Vector3 GetQueryExtents(int agentTypeID)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return NativeFunctions.GetQueryExtents(agentTypeID);
		}

		public unsafe static PathQueryStatus FindStraightPath(this NavMeshQuery query, in Vector3 startPos, in Vector3 endPos, in NativeSlice<PolygonId> path, int pathSize, in NativeArray<Vector3> straightPath, in NativeArray<StraightPathFlags> straightPathFlags, in NativeArray<PolygonId> straightPathRefs, out int straightPathCount)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Invalid comparison between Unknown and I4
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			if (path.Stride != UnsafeUtility.SizeOf<PolygonId>())
			{
				throw new ArgumentException("Path slice must have a stride equal to the size of PolygonId.");
			}
			if (straightPathFlags.Length < straightPath.Length)
			{
				throw new ArgumentException("Straight path flags buffer is too small.");
			}
			if (straightPathRefs.Length < straightPath.Length)
			{
				throw new ArgumentException("Straight path refs buffer is too small.");
			}
			straightPathCount = 0;
			Vector3 endPos2 = default(Vector3);
			PathQueryStatus closestPointOnPoly = NavMeshQuery.GetClosestPointOnPoly(query.m_NavMeshQuery, path[pathSize - 1], endPos, ref endPos2);
			if ((int)closestPointOnPoly < 0)
			{
				return closestPointOnPoly;
			}
			return findStraightPathMethod(query, in startPos, in endPos2, path.GetPtr<PolygonId>(), pathSize, straightPath.GetPtr<Vector3>(), GetPtr(in straightPathFlags), straightPathRefs.GetPtr<PolygonId>(), ref straightPathCount, straightPath.Length);
		}

		public static PathQueryStatus FindStraightPath(this NavMeshQuery query, in Vector3 startPos, in Vector3 endPos, in NativeSlice<PolygonId> path, int pathSize, in NativeArray<Vector3> straightPath, out int straightPathCount)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			NativeArray<StraightPathFlags> straightPathFlags = default(NativeArray<StraightPathFlags>);
			straightPathFlags..ctor(straightPath.Length, (Allocator)2, (NativeArrayOptions)1);
			try
			{
				NativeArray<PolygonId> straightPathRefs = new NativeArray<PolygonId>(straightPath.Length, (Allocator)2, (NativeArrayOptions)1);
				try
				{
					return query.FindStraightPath(in startPos, in endPos, in path, pathSize, in straightPath, in straightPathFlags, in straightPathRefs, out straightPathCount);
				}
				finally
				{
					((IDisposable)straightPathRefs).Dispose();
				}
			}
			finally
			{
				((IDisposable)straightPathFlags).Dispose();
			}
		}

		[Obsolete("Use NativeArray<Vector3> for the straightPath parameter")]
		public static PathQueryStatus FindStraightPath(this NavMeshQuery query, float3 startPos, float3 endPos, NativeSlice<PolygonId> path, int pathSize, NativeArray<NavMeshLocation> straightPath, out int straightPathCount)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: 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_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			NativeArray<Vector3> straightPath2 = default(NativeArray<Vector3>);
			straightPath2..ctor(straightPath.Length, (Allocator)2, (NativeArrayOptions)1);
			try
			{
				NativeArray<StraightPathFlags> straightPathFlags = new NativeArray<StraightPathFlags>(straightPath.Length, (Allocator)2, (NativeArrayOptions)1);
				try
				{
					NativeArray<PolygonId> straightPathRefs = new NativeArray<PolygonId>(straightPath.Length, (Allocator)2, (NativeArrayOptions)1);
					try
					{
						Vector3 startPos2 = float3.op_Implicit(startPos);
						Vector3 endPos2 = float3.op_Implicit(endPos);
						PathQueryStatus result = query.FindStraightPath(in startPos2, in endPos2, in path, pathSize, in straightPath2, in straightPathFlags, in straightPathRefs, out straightPathCount);
						for (int i = 0; i < straightPathCount; i++)
						{
							straightPath[i] = new NavMeshLocation(straightPath2[i], straightPathRefs[i]);
						}
						return result;
					}
					finally
					{
						((IDisposable)straightPathRefs).Dispose();
					}
				}
				finally
				{
					((IDisposable)straightPathFlags).Dispose();
				}
			}
			finally
			{
				((IDisposable)straightPath2).Dispose();
			}
		}

		internal static void SetUpNativeMethodPointers()
		{
			int num = 10850928;
			if (NativeHelpers.IsDebugBuild)
			{
				num = 19595328;
			}
			findStraightPathMethod = Marshal.GetDelegateForFunctionPointer<FindStraightPathDelegate>(NativeHelpers.BaseAddress + num);
		}

		private unsafe static T* GetPtr<T>(this in NativeArray<T> array) where T : unmanaged
		{
			return (T*)array.m_Buffer;
		}

		private unsafe static T* GetPtr<T>(this in NativeSlice<T> slice) where T : unmanaged
		{
			return (T*)slice.m_Buffer;
		}
	}
	public struct NavMeshReadLocker : IDisposable
	{
		private bool locked;

		public NavMeshReadLocker()
		{
			locked = false;
			NavMeshLock.BeginRead();
			locked = true;
		}

		public void Yield()
		{
			NavMeshLock.YieldRead();
		}

		public void Dispose()
		{
			if (locked)
			{
				locked = false;
				NavMeshLock.EndRead();
			}
		}
	}
	public static class PathQueryStatusExtensions
	{
		public static PathQueryStatus GetResult(this PathQueryStatus status)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return (PathQueryStatus)(status & -16777216);
		}

		public static PathQueryStatus GetDetail(this PathQueryStatus status)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return (PathQueryStatus)(status & 0xFFFFFF);
		}
	}
	[IgnoredByDeepProfiler]
	[UsedByNativeCode]
	public struct TogglableProfilerAuto : IDisposable
	{
		[NativeDisableUnsafePtrRestriction]
		internal readonly IntPtr ptr;

		internal bool on;

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public TogglableProfilerAuto(in ProfilerMarker marker)
		{
			ptr = marker.m_Ptr;
			on = true;
			ProfilerUnsafeUtility.BeginSample(ptr);
		}

		public void Pause()
		{
			if (on)
			{
				ProfilerUnsafeUtility.EndSample(ptr);
				on = false;
			}
		}

		public void Resume()
		{
			if (!on)
			{
				on = true;
				ProfilerUnsafeUtility.BeginSample(ptr);
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public void Dispose()
		{
			if (on)
			{
				ProfilerUnsafeUtility.EndSample(ptr);
				on = false;
			}
		}
	}
}
namespace PathfindingLib.Utilities.Native
{
	internal static class NativeFunctions
	{
		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private unsafe delegate char* GetNameDelegate(IntPtr component);

		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private delegate IntPtr DerefPPtrDelegate(IntPtr thisPPtr);

		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private unsafe delegate void GetPositionDelegate(IntPtr transform, Vector3* result);

		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private unsafe delegate void GetQueryExtentsDelegate(IntPtr navMeshManager, Vector3* result, int agentTypeID);

		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private unsafe delegate void GetLinkQueryExtentsDelegate(IntPtr navMeshManager, Vector3* result, int agentTypeID);

		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private delegate IntPtr GetAgentByRefDelegate(IntPtr crowdManager, ulong id);

		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private delegate IntPtr GetInternalAgentDelegate(IntPtr agent);

		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private unsafe delegate QueryFilter* GetAgentFilterDelegate(IntPtr crowdManager, ulong id);

		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private unsafe delegate QueryFilter* GetFilterDelegate(IntPtr agent);

		[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
		private unsafe delegate char* GrowStringDelegate(IntPtr str, ulong size);

		private static GetNameDelegate getNameMethod;

		private static DerefPPtrDelegate derefPPtrMethod;

		private static GetPositionDelegate getPositionMethod;

		private static GetQueryExtentsDelegate getQueryExtentsMethod;

		private static GetLinkQueryExtentsDelegate getLinkQueryExtentsMethod;

		private static GetAgentByRefDelegate getAgentByRefMethod;

		private static GetInternalAgentDelegate getInternalAgentMethod;

		private static GetAgentFilterDelegate getAgentFilterMethod;

		private static GetFilterDelegate getFilterMethod;

		private static GrowStringDelegate growStringMethod;

		internal static void SetUpNativeMethodPointers()
		{
			SetUpGetName();
			SetUpGetPPtr();
			SetUpGetPosition();
			SetUpGetQueryExtents();
			SetUpGetLinkQueryExtents();
			SetUpGetCrowdAgent();
			SetUpGetAgentQueryFilter();
			SetUpGrowString();
		}

		private static void SetUpGetName()
		{
			int num = 3609840;
			if (NativeHelpers.IsDebugBuild)
			{
				num = 5508864;
			}
			getNameMethod = Marshal.GetDelegateForFunctionPointer<GetNameDelegate>(NativeHelpers.BaseAddress + num);
		}

		internal unsafe static string GetName(IntPtr component)
		{
			return Marshal.PtrToStringAnsi((IntPtr)getNameMethod(component));
		}

		private static void SetUpGetPPtr()
		{
			int num = 1484992;
			if (NativeHelpers.IsDebugBuild)
			{
				num = 4765200;
			}
			derefPPtrMethod = Marshal.GetDelegateForFunctionPointer<DerefPPtrDelegate>(NativeHelpers.BaseAddress + num);
		}

		internal static IntPtr DerefPPtr(IntPtr pptr)
		{
			return derefPPtrMethod(pptr);
		}

		private static void SetUpGetPosition()
		{
			int num = 6713424;
			if (NativeHelpers.IsDebugBuild)
			{
				num = 13067056;
			}
			getPositionMethod = Marshal.GetDelegateForFunctionPointer<GetPositionDelegate>(NativeHelpers.BaseAddress + num);
		}

		internal unsafe static Vector3 GetPosition(IntPtr transform)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			Vector3 result = default(Vector3);
			getPositionMethod(transform, &result);
			return result;
		}

		private static void SetUpGetQueryExtents()
		{
			int num = 10645696;
			if (NativeHelpers.IsDebugBuild)
			{
				num = 19385664;
			}
			getQueryExtentsMethod = Marshal.GetDelegateForFunctionPointer<GetQueryExtentsDelegate>(NativeHelpers.BaseAddress + num);
		}

		internal unsafe static Vector3 GetQueryExtents(int agentTypeID)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			Vector3 zero = Vector3.zero;
			getQueryExtentsMethod(NativeHelpers.GetNavMeshManager(), &zero, agentTypeID);
			return zero;
		}

		private static void SetUpGetLinkQueryExtents()
		{
			int num = 10646048;
			if (NativeHelpers.IsDebugBuild)
			{
				num = 19384784;
			}
			getLinkQueryExtentsMethod = Marshal.GetDelegateForFunctionPointer<GetLinkQueryExtentsDelegate>(NativeHelpers.BaseAddress + num);
		}

		internal unsafe static Vector3 GetLinkQueryExtents(int agentTypeID)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			Vector3 zero = Vector3.zero;
			getLinkQueryExtentsMethod(NativeHelpers.GetNavMeshManager(), &zero, agentTypeID);
			return zero;
		}

		private static void SetUpGetCrowdAgent()
		{
			if (NativeHelpers.IsDebugBuild)
			{
				getAgentByRefMethod = Marshal.GetDelegateForFunctionPointer<GetAgentByRefDelegate>(NativeHelpers.BaseAddress + 19516880);
			}
			else
			{
				getInternalAgentMethod = Marshal.GetDelegateForFunctionPointer<GetInternalAgentDelegate>(NativeHelpers.BaseAddress + 10723040);
			}
		}

		private static IntPtr GetCrowdAgent(IntPtr agent)
		{
			if (getInternalAgentMethod != null)
			{
				return getInternalAgentMethod(agent);
			}
			return getAgentByRefMethod(NativeHelpers.GetCrowdManager(), NativeHelpers.GetAgentID(agent));
		}

		internal unsafe static Vector3 GetAgentPosition(IntPtr agent)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			IntPtr crowdAgent = GetCrowdAgent(agent);
			if (crowdAgent == IntPtr.Zero)
			{
				return Vector3.positiveInfinity;
			}
			return (Vector3)(*(void*)crowdAgent);
		}

		private static void SetUpGetAgentQueryFilter()
		{
			if (NativeHelpers.IsDebugBuild)
			{
				getAgentFilterMethod = Marshal.GetDelegateForFunctionPointer<GetAgentFilterDelegate>(NativeHelpers.BaseAddress + 19516960);
			}
			else
			{
				getFilterMethod = Marshal.GetDelegateForFunctionPointer<GetFilterDelegate>(NativeHelpers.BaseAddress + 10722896);
			}
		}

		internal unsafe static QueryFilter* GetAgentQueryFilter(IntPtr agent)
		{
			if (getFilterMethod != null)
			{
				return getFilterMethod(agent);
			}
			return getAgentFilterMethod(NativeHelpers.GetCrowdManager(), NativeHelpers.GetAgentID(agent));
		}

		private static void SetUpGrowString()
		{
			int num = 1421296;
			if (NativeHelpers.IsDebugBuild)
			{
				num = 2275792;
			}
			growStringMethod = Marshal.GetDelegateForFunctionPointer<GrowStringDelegate>(NativeHelpers.BaseAddress + num);
		}

		internal unsafe static char* GrowString(IntPtr str, ulong size)
		{
			return growStringMethod(str, size);
		}
	}
	internal static class NativeHelpers
	{
		[CompilerGenerated]
		private sealed class <GetAreaNames>d__13 : IEnumerable<string>, IEnumerable, IEnumerator<string>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private string <>2__current;

			private int <>l__initialThreadId;

			private IntPtr <nameAddress>5__2;

			private int <nameStride>5__3;

			private int <i>5__4;

			string IEnumerator<string>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GetAreaNames>d__13(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					GetNavMeshAreaNamesArray(out <nameAddress>5__2, out <nameStride>5__3);
					<i>5__4 = 0;
					break;
				case 1:
					<>1__state = -1;
					<nameAddress>5__2 += <nameStride>5__3;
					<i>5__4++;
					break;
				}
				if (<i>5__4 < 32)
				{
					<>2__current = GetBasicString(<nameAddress>5__2);
					<>1__state = 1;
					return true;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<string> IEnumerable<string>.GetEnumerator()
			{
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					return this;
				}
				return new <GetAreaNames>d__13(0);
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<string>)this).GetEnumerator();
			}
		}

		internal static readonly IntPtr BaseAddress = GetUnityPlayerModule().BaseAddress;

		internal static readonly bool IsDebugBuild = Debug.isDebugBuild;

		private static ProcessModule GetUnityPlayerModule()
		{
			ProcessModuleCollection modules = Process.GetCurrentProcess().Modules;
			for (int i = 0; i < modules.Count; i++)
			{
				ProcessModule processModule = modules[i];
				if (processModule.ModuleName.Contains("UnityPlayer"))
				{
					return processModule;
				}
			}
			return null;
		}

		internal unsafe static IntPtr GetNavMeshManager()
		{
			int num = 30320264;
			if (IsDebugBuild)
			{
				num = 48268768;
			}
			return *(IntPtr*)(void*)(BaseAddress + num);
		}

		internal unsafe static IntPtr GetNavMesh()
		{
			IntPtr navMeshManager = GetNavMeshManager();
			if (IsDebugBuild)
			{
				return *(IntPtr*)(void*)(navMeshManager + 192);
			}
			return *(IntPtr*)(void*)(navMeshManager + 168);
		}

		internal unsafe static IntPtr GetCrowdManager()
		{
			IntPtr navMeshManager = GetNavMeshManager();
			if (IsDebugBuild)
			{
				return *(IntPtr*)(void*)(navMeshManager + 168);
			}
			return *(IntPtr*)(void*)(navMeshManager + 144);
		}

		internal unsafe static IntPtr GetNavMeshProjectSettings()
		{
			int num = 29889864;
			if (IsDebugBuild)
			{
				num = 47668408;
			}
			return *(IntPtr*)(void*)(BaseAddress + num);
		}

		internal static void GetNavMeshAreaNamesArray(out IntPtr address, out int stride)
		{
			IntPtr navMeshProjectSettings = GetNavMeshProjectSettings();
			if (IsDebugBuild)
			{
				address = navMeshProjectSettings + 72;
				stride = 56;
			}
			else
			{
				address = navMeshProjectSettings + 48;
				stride = 48;
			}
		}

		internal unsafe static ref FreeList<OffMeshConnection> GetOffMeshConnectionFreeList()
		{
			int num = 64;
			if (IsDebugBuild)
			{
				num = 72;
			}
			return ref *(FreeList<OffMeshConnection>*)(void*)(GetNavMesh() + num);
		}

		internal unsafe static int GetInstanceID(IntPtr obj)
		{
			if (Object.OffsetOfInstanceIDInCPlusPlusObject == -1)
			{
				Object.OffsetOfInstanceIDInCPlusPlusObject = Object.GetOffsetOfInstanceIDInCPlusPlusObject();
			}
			return *(int*)(void*)(obj + Object.OffsetOfInstanceIDInCPlusPlusObject);
		}

		internal static OffMeshLink GetOffMeshLinkWrapper(int instanceID)
		{
			return OffMeshLinkData.GetOffMeshLinkInternal(instanceID);
		}

		internal unsafe static ulong GetAgentID(IntPtr agent)
		{
			int num = 96;
			if (IsDebugBuild)
			{
				num = 120;
			}
			return *(ulong*)(void*)(agent + num);
		}

		internal unsafe static string GetBasicString(IntPtr ptr)
		{
			ref BasicStringFields reference = ref *(BasicStringFields*)(void*)ptr;
			byte* bytes;
			ulong val;
			if (reference.IsShortString)
			{
				bytes = (byte*)UnsafeUtility.AddressOf<BasicStringFields>(ref reference);
				val = (ulong)(24 - reference.ShortStringUnusedBytes);
			}
			else
			{
				bytes = reference.Data;
				val = reference.Length;
			}
			return Encoding.UTF8.GetString(bytes, (int)Math.Min(val, 2147483647uL));
		}

		[IteratorStateMachine(typeof(<GetAreaNames>d__13))]
		internal static IEnumerable<string> GetAreaNames()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetAreaNames>d__13(-2);
		}

		internal unsafe static void SetBasicString(IntPtr ptr, string str)
		{
			ref BasicStringFields reference = ref *(BasicStringFields*)(void*)ptr;
			int byteCount = Encoding.UTF8.GetByteCount(str);
			char* pointer = NativeFunctions.GrowString(ptr, (ulong)byteCount);
			int bytes = Encoding.UTF8.GetBytes(str.AsSpan(), new Span<byte>(pointer, byteCount));
			if (reference.IsShortString)
			{
				reference.ShortStringUnusedBytes = (byte)(24 - bytes);
			}
			else
			{
				reference.Length = (ulong)bytes;
			}
		}

		internal static void SetAreaName(int index, string name)
		{
			if (index < 0 || index >= 32)
			{
				throw new IndexOutOfRangeException($"Area index out of range: {index}");
			}
			GetNavMeshAreaNamesArray(out var address, out var stride);
			SetBasicString(address + stride * index, name);
		}
	}
	internal static class NativeNavMeshUtils
	{
		[CompilerGenerated]
		private sealed class <GetOffMeshLinks>d__3 : IEnumerable<IntPtr>, IEnumerable, IEnumerator<IntPtr>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private IntPtr <>2__current;

			private int <>l__initialThreadId;

			private IntPtr navMeshManager;

			public IntPtr <>3__navMeshManager;

			private IntPtr <links>5__2;

			private int <linkCount>5__3;

			private int <i>5__4;

			IntPtr IEnumerator<IntPtr>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GetOffMeshLinks>d__3(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					GetOffMeshLinkList(navMeshManager, out <links>5__2, out <linkCount>5__3);
					if (<links>5__2 == IntPtr.Zero)
					{
						return false;
					}
					<i>5__4 = 0;
					break;
				case 1:
					<>1__state = -1;
					<i>5__4++;
					break;
				}
				if (<i>5__4 < <linkCount>5__3)
				{
					<>2__current = GetOffMeshLinkFromList(<links>5__2, <i>5__4);
					<>1__state = 1;
					return true;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<IntPtr> IEnumerable<IntPtr>.GetEnumerator()
			{
				<GetOffMeshLinks>d__3 <GetOffMeshLinks>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<GetOffMeshLinks>d__ = this;
				}
				else
				{
					<GetOffMeshLinks>d__ = new <GetOffMeshLinks>d__3(0);
				}
				<GetOffMeshLinks>d__.navMeshManager = <>3__navMeshManager;
				return <GetOffMeshLinks>d__;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<IntPtr>)this).GetEnumerator();
			}
		}

		internal unsafe static bool CarvingHasDataToApply(IntPtr navMeshCarving)
		{
			if (navMeshCarving == IntPtr.Zero)
			{
				return false;
			}
			ulong num = 0uL;
			ulong num2 = 0uL;
			if (NativeHelpers.IsDebugBuild)
			{
				num = *(ulong*)(void*)(navMeshCarving + 56);
				num2 = *(ulong*)(void*)(navMeshCarving + 64);
			}
			else
			{
				num = *(ulong*)((long)navMeshCarving + 40);
				num2 = *(ulong*)((long)navMeshCarving + 48);
			}
			return num2 > num;
		}

		private unsafe static void GetOffMeshLinkList(IntPtr navMeshManager, out IntPtr offMeshLinks, out int offMeshLinkCount)
		{
			if (NativeHelpers.IsDebugBuild)
			{
				offMeshLinks = *(IntPtr*)(void*)(navMeshManager + 112);
				offMeshLinkCount = *(int*)(void*)(navMeshManager + 136);
			}
			else
			{
				offMeshLinks = *(IntPtr*)(void*)(navMeshManager + 96);
				offMeshLinkCount = *(int*)(void*)(navMeshManager + 112);
			}
		}

		private unsafe static IntPtr GetOffMeshLinkFromList(IntPtr links, int index)
		{
			return *(IntPtr*)((byte*)(void*)links + (nint)index * (nint)sizeof(IntPtr));
		}

		[IteratorStateMachine(typeof(<GetOffMeshLinks>d__3))]
		internal static IEnumerable<IntPtr> GetOffMeshLinks(IntPtr navMeshManager)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetOffMeshLinks>d__3(-2)
			{
				<>3__navMeshManager = navMeshManager
			};
		}

		internal unsafe static ref OffMeshLinkFields GetOffMeshLinkFields(IntPtr offMeshLink)
		{
			int num = 64;
			if (NativeHelpers.IsDebugBuild)
			{
				num = 88;
			}
			return ref *(OffMeshLinkFields*)(void*)(offMeshLink + num);
		}

		internal unsafe static Vector3 GetOffMeshLinkEndPointPosition(NativeTransform* transform)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			if (transform == null)
			{
				return Vector3.positiveInfinity;
			}
			return NativeFunctions.GetPosition((IntPtr)transform);
		}

		internal unsafe static bool OffMeshLinkWillUpdate(IntPtr offMeshLink)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0069: 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_0075: Unknown result type (might be due to invalid IL or missing references)
			ref OffMeshLinkFields offMeshLinkFields = ref GetOffMeshLinkFields(offMeshLink);
			NativeTransform* transform = Methods.Get(ref offMeshLinkFields.Start);
			NativeTransform* transform2 = Methods.Get(ref offMeshLinkFields.End);
			Vector3 offMeshLinkEndPointPosition = GetOffMeshLinkEndPointPosition(transform);
			Vector3 offMeshLinkEndPointPosition2 = GetOffMeshLinkEndPointPosition(transform2);
			if (!offMeshLinkFields.AutoUpdatePositions)
			{
				return false;
			}
			if (offMeshLinkFields.NeedsInitialUpdate)
			{
				return false;
			}
			float num = offMeshLinkFields.AutoUpdateDistance * offMeshLinkFields.AutoUpdateDistance;
			Vector3 val = offMeshLinkEndPointPosition - offMeshLinkFields.LastStartPosition;
			if (((Vector3)(ref val)).sqrMagnitude > num)
			{
				return true;
			}
			val = offMeshLinkEndPointPosition2 - offMeshLinkFields.LastEndPosition;
			if (((Vector3)(ref val)).sqrMagnitude > num)
			{
				return true;
			}
			return false;
		}

		internal unsafe static ref FreeList<NavMeshLinkRegistryEntry> GetNavMeshLinkRegistry()
		{
			int num = 128;
			if (NativeHelpers.IsDebugBuild)
			{
				num = 152;
			}
			return ref *(FreeList<NavMeshLinkRegistryEntry>*)(void*)(NativeHelpers.GetNavMeshManager() + num);
		}
	}
	internal struct PPtr<T> where T : unmanaged
	{
		public int Ptr;
	}
	internal struct FreeList<T> where T : unmanaged
	{
		public uint NextFree;

		public uint Capacity;

		public unsafe T* Elements;
	}
	[StructLayout(LayoutKind.Explicit)]
	internal struct NativeTransform
	{
	}
	[StructLayout(LayoutKind.Explicit)]
	internal struct QueryFilter
	{
		[FieldOffset(0)]
		internal float CostsStart;

		[FieldOffset(128)]
		internal uint AreaMask;

		[FieldOffset(132)]
		internal uint AgentType;
	}
	internal struct NavMeshLinkRegistryEntry
	{
		internal int UseCount;

		internal uint Next;

		internal ulong ConnectionID;
	}
	[StructLayout(LayoutKind.Explicit)]
	internal struct BasicStringFields
	{
		[FieldOffset(0)]
		internal unsafe byte* Data;

		[FieldOffset(8)]
		internal ulong Capacity;

		[FieldOffset(16)]
		internal ulong Length;

		[FieldOffset(24)]
		internal byte ShortStringUnusedBytes;

		[FieldOffset(32)]
		internal bool IsShortString;
	}
	internal static class Methods
	{
		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public unsafe static IntPtr GetPtr<T>(this ref PPtr<T> ptr) where T : unmanaged
		{
			return NativeFunctions.DerefPPtr((IntPtr)UnsafeUtility.AddressOf<PPtr<T>>(ref ptr));
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public unsafe static T* Get<T>(this ref PPtr<T> ptr) where T : unmanaged
		{
			return (T*)(void*)GetPtr(ref ptr);
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		public unsafe static Vector3 GetPosition(this ref NativeTransform transform)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			return NativeFunctions.GetPosition((IntPtr)UnsafeUtility.AddressOf<NativeTransform>(ref transform));
		}
	}
	[StructLayout(LayoutKind.Explicit, Size = 208)]
	internal struct OffMeshConnection
	{
		[FieldOffset(0)]
		public int AgentTypeID;

		[FieldOffset(4)]
		public MinMaxAABB Bounds;

		[FieldOffset(32)]
		public OffMeshLinkEndPoint EndPointA;

		[FieldOffset(80)]
		public OffMeshLinkEndPoint EndPointB;

		[FieldOffset(128)]
		public Vector3 AxisX;

		[FieldOffset(140)]
		public Vector3 AxisY;

		[FieldOffset(152)]
		public Vector3 AxisZ;

		[FieldOffset(164)]
		public float Width;

		[FieldOffset(168)]
		public float CostModifier;

		[FieldOffset(172)]
		public bool Bidirectional;

		[FieldOffset(176)]
		public int AreaMask;

		[FieldOffset(180)]
		public byte Area;

		[FieldOffset(182)]
		public ushort LinkType;

		[FieldOffset(184)]
		public int UserID;

		[FieldOffset(188)]
		public int FirstLinkIndex;

		[FieldOffset(192)]
		public uint Salt;

		[FieldOffset(196)]
		public int Next;
	}
	[StructLayout(LayoutKind.Explicit, Size = 48)]
	internal struct OffMeshLinkEndPoint
	{
		[FieldOffset(0)]
		public Vector3 Pos;

		[FieldOffset(12)]
		public Vector3 MappedA;

		[FieldOffset(24)]
		public Vector3 MappedB;

		[FieldOffset(40)]
		public ulong TileRef;
	}
	[StructLayout(LayoutKind.Explicit)]
	internal ref struct OffMeshLinkFields
	{
		[FieldOffset(0)]
		public ulong ConnectionID;

		[FieldOffset(8)]
		public PPtr<NativeTransform> Start;

		[FieldOffset(12)]
		public PPtr<NativeTransform> End;

		[FieldOffset(16)]
		public Vector3 LastEndPosition;

		[FieldOffset(28)]
		public Vector3 LastStartPosition;

		[FieldOffset(40)]
		public float AutoUpdateDistance;

		[FieldOffset(44)]
		public float CostOverride;

		[FieldOffset(48)]
		public uint Area;

		[FieldOffset(52)]
		public int AgentTypeID;

		[FieldOffset(56)]
		public int ManagerLinkIndex;

		[FieldOffset(60)]
		public bool AutoUpdatePositions;

		[FieldOffset(61)]
		public bool NeedsInitialUpdate;

		[FieldOffset(62)]
		public bool Bidirectional;

		[FieldOffset(63)]
		public bool Activated;
	}
}
namespace PathfindingLib.Utilities.Internal.IL
{
	internal class ILInjector
	{
		[CompilerGenerated]
		private sealed class <GetRelativeInstructions>d__34 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private CodeInstruction <>2__current;

			private int <>l__initialThreadId;

			public ILInjector <>4__this;

			private int offset;

			public int <>3__offset;

			private int size;

			public int <>3__size;

			private int <i>5__2;

			CodeInstruction IEnumerator<CodeInstruction>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GetRelativeInstructions>d__34(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				int num = <>1__state;
				ILInjector iLInjector = <>4__this;
				switch (num)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<i>5__2 = 0;
					break;
				case 1:
					<>1__state = -1;
					<i>5__2++;
					break;
				}
				if (<i>5__2 < size)
				{
					<>2__current = iLInjector.instructions[iLInjector.index + offset + <i>5__2];
					<>1__state = 1;
					return true;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator()
			{
				<GetRelativeInstructions>d__34 <GetRelativeInstructions>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<GetRelativeInstructions>d__ = this;
				}
				else
				{
					<GetRelativeInstructions>d__ = new <GetRelativeInstructions>d__34(0)
					{
						<>4__this = <>4__this
					};
				}
				<GetRelativeInstructions>d__.offset = <>3__offset;
				<GetRelativeInstructions>d__.size = <>3__size;
				return <GetRelativeInstructions>d__;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<CodeInstruction>)this).GetEnumerator();
			}
		}

		private const string INVALID = "Injector is invalid";

		private List<CodeInstruction> instructions = instructions.ToList();

		private ILGenerator generator;

		private int index;

		private int matchEnd;

		public int Index
		{
			get
			{
				return index;
			}
			set
			{
				index = value;
			}
		}

		public bool IsValid
		{
			get
			{
				if (instructions != null)
				{
					return IsIndexValid(index);
				}
				return false;
			}
		}

		public CodeInstruction Instruction
		{
			get
			{
				if (!IsIndexInRange(index))
				{
					return null;
				}
				return instructions[index];
			}
			set
			{
				if (!IsIndexInRange(index))
				{
					throw new InvalidOperationException($"Current index {index} is out of range of instruction count {instructions.Count}");
				}
				instructions[index] = value;
			}
		}

		public CodeInstruction LastMatchedInstruction
		{
			get
			{
				int num = matchEnd - 1;
				if (!IsIndexInRange(num))
				{
					return null;
				}
				return instructions[num];
			}
			set
			{
				int num = matchEnd - 1;
				if (!IsIndexInRange(num))
				{
					throw new InvalidOperationException($"Last matched index {index} is out of range of instruction count {instructions.Count}");
				}
				instructions[num] = value;
			}
		}

		public ICollection<CodeInstruction> Instructions => instructions.AsReadOnly();

		public ILInjector(IEnumerable<CodeInstruction> instructions, ILGenerator generator = null)
		{
			this.generator = generator;
			matchEnd = -1;
			base..ctor();
		}

		public ILInjector GoToStart()
		{
			matchEnd = index;
			index = 0;
			return this;
		}

		public ILInjector GoToEnd()
		{
			matchEnd = index;
			index = instructions.Count;
			return this;
		}

		public ILInjector Forward(int offset)
		{
			if (!IsValid)
			{
				return this;
			}
			matchEnd = index;
			index = Math.Clamp(index + offset, -1, instructions.Count);
			return this;
		}

		public ILInjector Back(int offset)
		{
			return Forward(-offset);
		}

		private void MarkInvalid()
		{
			index = -1;
			matchEnd = -1;
		}

		private void Search(bool forward, ILMatcher[] predicates)
		{
			if (!IsValid)
			{
				return;
			}
			int num = 1;
			if (!forward)
			{
				num = -1;
				index--;
			}
			while (forward ? (index < instructions.Count) : (index >= 0))
			{
				if (forward && index + predicates.Length > instructions.Count)
				{
					index = instructions.Count;
					break;
				}
				int i;
				for (i = 0; i < predicates.Length && predicates[i].Matches(instructions[index + i]); i++)
				{
				}
				if (i == predicates.Length)
				{
					matchEnd = index + i;
					return;
				}
				index += num;
			}
			MarkInvalid();
		}

		public ILInjector Find(params ILMatcher[] predicates)
		{
			Search(forward: true, predicates);
			return this;
		}

		public ILInjector ReverseFind(params ILMatcher[] predicates)
		{
			Search(forward: false, predicates);
			return this;
		}

		public ILInjector GoToPush(int popIndex)
		{
			if (!IsValid)
			{
				return this;
			}
			matchEnd = index;
			index--;
			int num = 0;
			while (index >= 0)
			{
				CodeInstruction instruction = instructions[index];
				num += instruction.PushCount();
				num -= instruction.PopCount();
				if (num >= popIndex)
				{
					return this;
				}
				index--;
			}
			return this;
		}

		public ILInjector SkipBranch()
		{
			if (Instruction == null)
			{
				return this;
			}
			if (!(Instruction.operand is Label label))
			{
				throw new InvalidOperationException($"Current instruction is not a branch: {Instruction}");
			}
			return FindLabel(label);
		}

		public ILInjector FindLabel(Label label)
		{
			if (label == default(Label))
			{
				return this;
			}
			matchEnd = index;
			for (index = 0; index < instructions.Count; index++)
			{
				if (instructions[index].labels.Contains(label))
				{
					return this;
				}
			}
			MarkInvalid();
			return this;
		}

		public ILInjector GoToMatchEnd()
		{
			index = matchEnd;
			return this;
		}

		public ILInjector GoToLastMatchedInstruction()
		{
			if (!IsIndexValid(matchEnd))
			{
				return this;
			}
			index = matchEnd - 1;
			return this;
		}

		private bool IsIndexValid(int index)
		{
			return index != -1;
		}

		private bool IsIndexInRange(int index)
		{
			if (index >= 0)
			{
				return index < instructions.Count;
			}
			return false;
		}

		public CodeInstruction GetRelativeInstruction(int offset)
		{
			if (!IsValid)
			{
				throw new InvalidOperationException("Injector is invalid");
			}
			int num = index + offset;
			if (!IsIndexInRange(num))
			{
				throw new IndexOutOfRangeException($"Offset {offset} would read out of bounds at index {num}");
			}
			return instructions[num];
		}

		public ILInjector SetRelativeInstruction(int offset, CodeInstruction instruction)
		{
			if (!IsValid)
			{
				throw new InvalidOperationException("Injector is invalid");
			}
			int num = index + offset;
			if (!IsIndexInRange(num))
			{
				throw new IndexOutOfRangeException($"Offset {offset} would write out of bounds at index {num}");
			}
			instructions[num] = instruction;
			return this;
		}

		[IteratorStateMachine(typeof(<GetRelativeInstructions>d__34))]
		public IEnumerable<CodeInstruction> GetRelativeInstructions(int offset, int size)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetRelativeInstructions>d__34(-2)
			{
				<>4__this = this,
				<>3__offset = offset,
				<>3__size = size
			};
		}

		public IEnumerable<CodeInstruction> GetRelativeInstructions(int size)
		{
			return GetRelativeInstructions(0, size);
		}

		private void GetLastMatchRangeAbsolute(out int start, out int end)
		{
			start = index;
			end = matchEnd;
			if (start > end)
			{
				int num = end;
				int num2 = start;
				start = num;
				end = num2;
			}
		}

		private void GetLastMatchRange(out int start, out int size)
		{
			GetLastMatchRangeAbsolute(out start, out var end);
			if (start < 0 || start >= instructions.Count)
			{
				throw new InvalidOperationException($"Last match range starts at invalid index {start}");
			}
			if (end < 0 || end > instructions.Count)
			{
				throw new InvalidOperationException($"Last match range ends at invalid index {end}");
			}
			size = end - start;
		}

		public List<CodeInstruction> GetLastMatch()
		{
			GetLastMatchRange(out var start, out var size);
			return instructions.GetRange(start, size);
		}

		public ILInjector DefineLabel(out Label label)
		{
			if (generator == null)
			{
				throw new InvalidOperationException("No ILGenerator was provided");
			}
			label = generator.DefineLabel();
			return this;
		}

		public ILInjector AddLabel(out Label label)
		{
			DefineLabel(out label);
			return AddLabel(label);
		}

		public ILInjector AddLabel(Label label)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			Instruction = new CodeInstruction(Instruction);
			Instruction.labels.Add(label);
			return this;
		}

		public ILInjector InsertInPlace(params CodeInstruction[] instructions)
		{
			if (!IsValid)
			{
				throw new InvalidOperationException("Injector is invalid");
			}
			this.instructions.InsertRange(index, instructions);
			if (matchEnd >= index)
			{
				matchEnd += instructions.Length;
			}
			return this;
		}

		public ILInjector Insert(params CodeInstruction[] instructions)
		{
			InsertInPlace(instructions);
			index += instructions.Length;
			return this;
		}

		public ILInjector InsertInPlaceAfterBranch(params CodeInstruction[] instructions)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			if (!IsValid)
			{
				throw new InvalidOperationException("Injector is invalid");
			}
			List<Label> labels = Instruction.labels;
			Instruction = new CodeInstruction(Instruction);
			Instruction.labels.Clear();
			this.instructions.InsertRange(index, instructions);
			Instruction.labels.AddRange(labels);
			if (matchEnd >= index)
			{
				matchEnd += instructions.Length;
			}
			return this;
		}

		public ILInjector InsertAfterBranch(params CodeInstruction[] instructions)
		{
			InsertInPlaceAfterBranch(instructions);
			index += instructions.Length;
			return this;
		}

		public ILInjector RemoveAllPreviousInstructions()
		{
			if (!IsValid)
			{
				throw new InvalidOperationException("Injector is invalid");
			}
			instructions.RemoveRange(0, index);
			matchEnd -= index;
			if (matchEnd < 0)
			{
				matchEnd = 0;
			}
			index = 0;
			return this;
		}

		public ILInjector Remove(int count = 1)
		{
			if (!IsValid)
			{
				throw new InvalidOperationException("Injector is invalid");
			}
			instructions.RemoveRange(index, count);
			if (matchEnd > index)
			{
				matchEnd = Math.Max(index, matchEnd - count);
			}
			return this;
		}

		public ILInjector RemoveLastMatch()
		{
			GetLastMatchRange(out var start, out var size);
			List<Label> labels = instructions[start].labels;
			instructions.RemoveRange(start, size);
			index = start;
			matchEnd = start;
			instructions[start].labels.AddRange(labels);
			return this;
		}

		public ILInjector ReplaceLastMatch(params CodeInstruction[] replacementInstructions)
		{
			if (replacementInstructions.Length == 0)
			{
				throw new ArgumentException("Cannot replace a match with an empty array.");
			}
			GetLastMatchRange(out var start, out var size);
			List<Label> labels = instructions[start].labels;
			instructions.RemoveRange(start, size);
			instructions.InsertRange(start, replacementInstructions);
			index = start;
			matchEnd = start + replacementInstructions.Length;
			instructions[start].labels.AddRange(labels);
			return this;
		}

		public List<CodeInstruction> ReleaseInstructions()
		{
			List<CodeInstruction> result = instructions;
			instructions = null;
			return result;
		}

		public ILInjector PrintContext(int context, string header = "")
		{
			if (!IsValid)
			{
				throw new InvalidOperationException("Injector is invalid (" + header + ")");
			}
			StringBuilder stringBuilder = new StringBuilder(header);
			if (header.Length > 0)
			{
				stringBuilder.Append(':');
			}
			stringBuilder.AppendLine();
			GetLastMatchRangeAbsolute(out var start, out var end);
			int num = Math.Min(end + 1 + context, instructions.Count);
			for (int i = Math.Max(start - context, 0); i < num; i++)
			{
				if (end == -1 && i == index)
				{
					stringBuilder.Append("╶> ");
				}
				else
				{
					if (i >= start && i < end)
					{
						stringBuilder.Append("│");
					}
					else
					{
						stringBuilder.Append(" ");
					}
					if (i == index)
					{
						stringBuilder.Append("╶> ");
					}
					else
					{
						stringBuilder.Append("   ");
					}
				}
				stringBuilder.AppendLine($"{i}: {instructions[i]}");
			}
			PathfindingLibPlugin.Instance.Logger.LogInfo((object)stringBuilder);
			return this;
		}

		public ILInjector PrintContext(string header = "")
		{
			return PrintContext(4, header);
		}
	}
	internal interface ILMatcher
	{
		bool Matches(CodeInstruction instruction);

		ILMatcher CaptureAs(out CodeInstruction variable)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			variable = new CodeInstruction(OpCodes.Nop, (object)null);
			return new InstructionCapturingMatcher(this, variable);
		}

		unsafe ILMatcher CaptureOperandAs<T>(out T operand) where T : unmanaged
		{
			operand = default(T);
			fixed (T* operand2 = &operand)
			{
				return new OperandCapturingMatcher<T>(this, operand2);
			}
		}

		ILMatcher Debug()
		{
			return new DebuggingMatcher(this);
		}

		static ILMatcher Not(ILMatcher matcher)
		{
			return new NotMatcher(matcher);
		}

		static ILMatcher Opcode(OpCode opcode)
		{
			return new OpcodeMatcher(opcode);
		}

		static ILMatcher Opcodes(params OpCode[] opcodes)
		{
			return new OpcodesMatcher(opcodes);
		}

		static ILMatcher OpcodeOperand(OpCode opcode, object operand)
		{
			return new OpcodeOperandMatcher(opcode, operand);
		}

		static ILMatcher Instruction(CodeInstruction instruction)
		{
			return new InstructionMatcher(instruction);
		}

		static ILMatcher Ldarg(int? arg = null)
		{
			return new LdargMatcher(arg);
		}

		static ILMatcher Ldloc(int? loc = null)
		{
			return new LdlocMatcher(loc);
		}

		static ILMatcher Stloc(int? loc = null)
		{
			return new StlocMatcher(loc);
		}

		static ILMatcher Ldc(int? value = null)
		{
			return new LdcI32Matcher(value);
		}

		static ILMatcher LdcF32(float? value = null)
		{
			return new LdcF32Matcher(value);
		}

		static ILMatcher Branch()
		{
			return new BranchMatcher();
		}

		static ILMatcher Ldfld(FieldInfo field, [CallerMemberName] string callerName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
		{
			if (field == null)
			{
				PathfindingLibPlugin.Instance.Logger.LogWarning((object)$"Field passed to ILMatcher.Ldfld() was null at {sourceFilePath}#{sourceLineNumber} ({callerName})");
			}
			return new OpcodeOperandMatcher(OpCodes.Ldfld, field);
		}

		static ILMatcher Ldsfld(FieldInfo field, [CallerMemberName] string callerName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
		{
			if (field == null)
			{
				PathfindingLibPlugin.Instance.Logger.LogWarning((object)$"Field passed to ILMatcher.Ldsfld() was null at {sourceFilePath}#{sourceLineNumber} ({callerName})");
			}
			return new OpcodeOperandMatcher(OpCodes.Ldsfld, field);
		}

		static ILMatcher Stfld(FieldInfo field, [CallerMemberName] string callerName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
		{
			if (field == null)
			{
				PathfindingLibPlugin.Instance.Logger.LogWarning((object)$"Field passed to ILMatcher.Stfld() was null at {sourceFilePath}#{sourceLineNumber} ({callerName})");
			}
			return new OpcodeOperandMatcher(OpCodes.Stfld, field);
		}

		static ILMatcher Stsfld(FieldInfo field, [CallerMemberName] string callerName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
		{
			if (field == null)
			{
				PathfindingLibPlugin.Instance.Logger.LogWarning((object)$"Field passed to ILMatcher.Stsfld() was null at {sourceFilePath}#{sourceLineNumber} ({callerName})");
			}
			return new OpcodeOperandMatcher(OpCodes.Stsfld, field);
		}

		static ILMatcher Callvirt(MethodBase method, [CallerMemberName] string callerName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
		{
			if (method == null)
			{
				PathfindingLibPlugin.Instance.Logger.LogWarning((object)$"Method passed to ILMatcher.Callvirt() was null at {sourceFilePath}#{sourceLineNumber} ({callerName})");
			}
			return OpcodeOperand(OpCodes.Callvirt, method);
		}

		static ILMatcher Call(MethodBase method, [CallerMemberName] string callerName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
		{
			if (method == null)
			{
				PathfindingLibPlugin.Instance.Logger.LogWarning((object)$"Method passed to ILMatcher.Call() was null at {sourceFilePath}#{sourceLineNumber} ({callerName})");
			}
			return OpcodeOperand(OpCodes.Call, method);
		}

		static ILMatcher Predicate(Func<CodeInstruction, bool> predicate)
		{
			return new PredicateMatcher(predicate);
		}

		static ILMatcher Predicate(Func<FieldInfo, bool> predicate)
		{
			return new PredicateMatcher((CodeInstruction insn) => insn.operand is FieldInfo arg && predicate(arg));
		}
	}
	internal class NotMatcher : ILMatcher
	{
		private readonly ILMatcher matcher;

		public NotMatcher(ILMatcher matcher)
		{
			this.matcher = matcher;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			return !matcher.Matches(instruction);
		}
	}
	internal class OpcodeMatcher : ILMatcher
	{
		private readonly OpCode opcode;

		public OpcodeMatcher(OpCode opcode)
		{
			this.opcode = opcode;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			return instruction.opcode == opcode;
		}
	}
	internal class OpcodesMatcher : ILMatcher
	{
		private readonly OpCode[] opcodes;

		public OpcodesMatcher(OpCode[] opcodes)
		{
			this.opcodes = opcodes;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			return opcodes.Contains(instruction.opcode);
		}
	}
	internal class OpcodeOperandMatcher : ILMatcher
	{
		private readonly OpCode opcode;

		private readonly object operand;

		public OpcodeOperandMatcher(OpCode opcode, object operand)
		{
			this.opcode = opcode;
			this.operand = operand;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			if (instruction.opcode == opcode)
			{
				return instruction.operand == operand;
			}
			return false;
		}
	}
	internal class InstructionMatcher : ILMatcher
	{
		private readonly OpCode opcode = instruction.opcode;

		private readonly object operand = instruction.operand;

		private readonly Label[] labels = instruction.labels.ToArray();

		public InstructionMatcher(CodeInstruction instruction)
		{
		}

		public bool Matches(CodeInstruction instruction)
		{
			if (instruction.opcode != opcode)
			{
				return false;
			}
			if (instruction.operand != operand)
			{
				return false;
			}
			if (instruction.labels.Count != labels.Length)
			{
				return false;
			}
			for (int i = 0; i < labels.Length; i++)
			{
				if (labels[i] != instruction.labels[i])
				{
					return false;
				}
			}
			return true;
		}
	}
	internal class LdargMatcher : ILMatcher
	{
		private readonly int? arg;

		public LdargMatcher(int? arg)
		{
			this.arg = arg;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			if (!arg.HasValue)
			{
				return instruction.GetLdargIndex().HasValue;
			}
			return instruction.GetLdargIndex() == arg;
		}
	}
	internal class LdlocMatcher : ILMatcher
	{
		private readonly int? loc;

		public LdlocMatcher(int? loc)
		{
			this.loc = loc;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			if (!loc.HasValue)
			{
				return instruction.GetLdlocIndex().HasValue;
			}
			return instruction.GetLdlocIndex() == loc;
		}
	}
	internal class StlocMatcher : ILMatcher
	{
		private readonly int? loc;

		public StlocMatcher(int? loc)
		{
			this.loc = loc;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			if (!loc.HasValue)
			{
				return instruction.GetStlocIndex().HasValue;
			}
			return instruction.GetStlocIndex() == loc;
		}
	}
	internal class LdcI32Matcher : ILMatcher
	{
		private readonly int? value;

		public LdcI32Matcher(int? value)
		{
			this.value = value;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			if (!value.HasValue)
			{
				return instruction.GetLdcI32().HasValue;
			}
			return instruction.GetLdcI32() == value;
		}
	}
	internal class LdcF32Matcher : ILMatcher
	{
		private readonly float? value;

		public LdcF32Matcher(float? value)
		{
			this.value = value;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			if (instruction.opcode == OpCodes.Ldc_R4)
			{
				if (value.HasValue)
				{
					return (float)instruction.operand == value.Value;
				}
				return true;
			}
			return false;
		}
	}
	internal class BranchMatcher : ILMatcher
	{
		public bool Matches(CodeInstruction instruction)
		{
			Label? label = default(Label?);
			return CodeInstructionExtensions.Branches(instruction, ref label);
		}
	}
	internal class PredicateMatcher : ILMatcher
	{
		private readonly Func<CodeInstruction, bool> predicate;

		public PredicateMatcher(Func<CodeInstruction, bool> predicate)
		{
			this.predicate = predicate;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			return predicate(instruction);
		}
	}
	internal class InstructionCapturingMatcher : ILMatcher
	{
		private readonly ILMatcher matcher;

		private readonly CodeInstruction variable;

		public InstructionCapturingMatcher(ILMatcher matcher, CodeInstruction variable)
		{
			this.matcher = matcher;
			this.variable = variable;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			bool num = matcher.Matches(instruction);
			if (num)
			{
				variable.opcode = instruction.opcode;
				variable.operand = instruction.operand;
				variable.blocks = instruction.blocks.ToList();
				variable.labels = instruction.labels.ToList();
			}
			return num;
		}
	}
	internal class OperandCapturingMatcher<T> : ILMatcher where T : unmanaged
	{
		private readonly ILMatcher matcher;

		private unsafe readonly T* operand;

		public unsafe OperandCapturingMatcher(ILMatcher matcher, T* operand)
		{
			this.matcher = matcher;
			this.operand = operand;
			base..ctor();
		}

		public unsafe bool Matches(CodeInstruction instruction)
		{
			bool num = matcher.Matches(instruction);
			if (num)
			{
				*operand = (T)instruction.operand;
			}
			return num;
		}
	}
	internal class DebuggingMatcher : ILMatcher
	{
		private readonly ILMatcher matcher;

		public DebuggingMatcher(ILMatcher matcher)
		{
			this.matcher = matcher;
			base..ctor();
		}

		public bool Matches(CodeInstruction instruction)
		{
			bool num = matcher.Matches(instruction);
			if (num)
			{
				PathfindingLibPlugin.Instance.Logger.LogInfo((object)$"{matcher} matched {instruction}");
			}
			return num;
		}
	}
	internal static class InstructionUtilities
	{
		public static CodeInstruction MakeLdarg(int index)
		{
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Expected O, but got Unknown
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: 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_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			if (index < 256)
			{
				return (CodeInstruction)(index switch
				{
					0 => (object)new CodeInstruction(OpCodes.Ldarg_0, (object)null), 
					1 => (object)new CodeInstruction(OpCodes.Ldarg_1, (object)null), 
					2 => (object)new CodeInstruction(OpCodes.Ldarg_2, (object)null), 
					3 => (object)new CodeInstruction(OpCodes.Ldarg_3, (object)null), 
					_ => (object)new CodeInstruction(OpCodes.Ldarg_S, (object)index), 
				});
			}
			return new CodeInstruction(OpCodes.Ldarg, (object)index);
		}

		public static int PopCount(this CodeInstruction instruction)
		{
			if (instruction.opcode == OpCodes.Call || instruction.opcode == OpCodes.Callvirt || instruction.opcode == OpCodes.Newobj)
			{
				MethodBase obj = (MethodBase)instruction.operand;
				int num = obj.GetParameters().Length;
				if (!obj.IsStatic)
				{
					num++;
				}
				return num;
			}
			if (instruction.opcode == OpCodes.Ret)
			{
				return 1;
			}
			return instruction.opcode.StackBehaviourPop switch
			{
				StackBehaviour.Pop0 => 0, 
				StackBehaviour.Pop1 => 1, 
				StackBehaviour.Pop1_pop1 => 2, 
				StackBehaviour.Popi => 1, 
				StackBehaviour.Popi_pop1 => 2, 
				StackBehaviour.Popi_popi => 2, 
				StackBehaviour.Popi_popi8 => 2, 
				StackBehaviour.Popi_popi_popi => 3, 
				StackBehaviour.Popi_popr4 => 2, 
				StackBehaviour.Popi_popr8 => 2, 
				StackBehaviour.Popref => 1, 
				StackBehaviour.Popref_pop1 => 2, 
				StackBehaviour.Popref_popi => 2, 
				StackBehaviour.Popref_popi_popi => 3, 
				StackBehaviour.Popref_popi_popi8 => 3, 
				StackBehaviour.Popref_popi_popr4 => 3, 
				StackBehaviour.Popref_popi_popr8 => 3, 
				StackBehaviour.Popref_popi_popref => 3, 
				StackBehaviour.Varpop => throw new NotImplementedException($"Variable pop on non-call instruction '{instruction}'"), 
				StackBehaviour.Popref_popi_pop1 => 3, 
				_ => throw new NotSupportedException($"StackBehaviourPop of {instruction.opcode.StackBehaviourPop} was not a pop for instruction '{instruction}'"), 
			};
		}

		public static int PushCount(this CodeInstruction instruction)
		{
			if (instruction.opcode == OpCodes.Call || instruction.opcode == OpCodes.Callvirt || instruction.opcode == OpCodes.Newobj)
			{
				if (instruction.operand is MethodInfo methodInfo && methodInfo.ReturnType == typeof(void))
				{
					return 0;
				}
				return 1;
			}
			return instruction.opcode.StackBehaviourPush switch
			{
				StackBehaviour.Push0 => 0, 
				StackBehaviour.Push1 => 1, 
				StackBehaviour.Push1_push1 => 2, 
				StackBehaviour.Pushi => 1, 
				StackBehaviour.Pushi8 => 1, 
				StackBehaviour.Pushr4 => 1, 
				StackBehaviour.Pushr8 => 1, 
				StackBehaviour.Pushref => 1, 
				StackBehaviour.Varpush => throw new NotImplementedException($"Variable push on non-call instruction '{instruction}'"), 
				_ => throw new NotSupportedException($"StackBehaviourPush of {instruction.opcode.StackBehaviourPush} was not a push for instruction '{instruction}'"), 
			};
		}

		public static int? GetLdargIndex(this CodeInstruction instruction)
		{
			OpCode opcode = instruction.opcode;
			if (opcode == OpCodes.Ldarg_0)
			{
				return 0;
			}
			if (opcode == OpCodes.Ldarg_1)
			{
				return 1;
			}
			if (opcode == OpCodes.Ldarg_2)
			{
				return 2;
			}
			if (opcode == OpCodes.Ldarg_3)
			{
				return 3;
			}
			if (opcode == OpCodes.Ldarg || opcode == OpCodes.Ldarg_S)
			{
				return instruction.operand as int?;
			}
			return null;
		}

		public static int? GetLdlocIndex(this CodeInstruction instruction)
		{
			OpCode opcode = instruction.opcode;
			if (opcode == OpCodes.Ldloc_0)
			{
				return 0;
			}
			if (opcode == OpCodes.Ldloc_1)
			{
				return 1;
			}
			if (opcode == OpCodes.Ldloc_2)
			{
				return 2;
			}
			if (opcode == OpCodes.Ldloc_3)
			{
				return 3;
			}
			if (opcode == OpCodes.Ldloc || opcode == OpCodes.Ldloc_S)
			{
				return (instruction.operand as LocalBuilder)?.LocalIndex;
			}
			return null;
		}

		public static int? GetStlocIndex(this CodeInstruction instruction)
		{
			OpCode opcode = instruction.opcode;
			if (opcode == OpCodes.Stloc_0)
			{
				return 0;
			}
			if (opcode == OpCodes.Stloc_1)
			{
				return 1;
			}
			if (opcode == OpCodes.Stloc_2)
			{
				return 2;
			}
			if (opcode == OpCodes.Stloc_3)
			{
				return 3;
			}
			if (opcode == OpCodes.Stloc || opcode == OpCodes.Stloc_S)
			{
				return (instruction.operand as LocalBuilder)?.LocalIndex;
			}
			return null;
		}

		public static CodeInstruction LdlocToStloc(this CodeInstruction instruction)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: 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_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Expected O, but got Unknown
			OpCode opcode = instruction.opcode;
			if (opcode == OpCodes.Ldloc_0)
			{
				return new CodeInstruction(OpCodes.Stloc_0, (object)null);
			}
			if (opcode == OpCodes.Ldloc_1)
			{
				return new CodeInstruction(OpCodes.Stloc_1, (object)null);
			}
			if (opcode == OpCodes.Ldloc_2)
			{
				return new CodeInstruction(OpCodes.Stloc_2, (object)null);
			}
			if (opcode == OpCodes.Ldloc_3)
			{
				return new CodeInstruction(OpCodes.Stloc_3, (object)null);
			}
			if (opcode == OpCodes.Ldloc || opcode == OpCodes.Ldloc_S)
			{
				return new CodeInstruction(OpCodes.Stloc, instruction.operand);
			}
			return null;
		}

		public static CodeInstruction StlocToLdloc(this CodeInstruction instruction)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: 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_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Expected O, but got Unknown
			OpCode opcode = instruction.opcode;
			if (opcode == OpCodes.Stloc_0)
			{
				return new CodeInstruction(OpCodes.Ldloc_0, (object)null);
			}
			if (opcode == OpCodes.Stloc_1)
			{
				return new CodeInstruction(OpCodes.Ldloc_1, (object)null);
			}
			if (opcode == OpCodes.Stloc_2)
			{
				return new CodeInstruction(OpCodes.Ldloc_2, (object)null);
			}
			if (opcode == OpCodes.Stloc_3)
			{
				return new CodeInstruction(OpCodes.Ldloc_3, (object)null);
			}
			if (opcode == OpCodes.Stloc || opcode == OpCodes.Stloc_S)
			{
				return new CodeInstruction(OpCodes.Ldloc, instruction.operand);
			}
			return null;
		}

		public static int? GetLdcI32(this CodeInstruction instruction)
		{
			OpCode opcode = instruction.opcode;
			if (opcode == OpCodes.Ldc_I4_M1)
			{
				return -1;
			}
			if (opcode == OpCodes.Ldc_I4_0)
			{
				return 0;
			}
			if (opcode == OpCodes.Ldc_I4_1)
			{
				return 1;
			}
			if (opcode == OpCodes.Ldc_I4_2)
			{
				return 2;
			}
			if (opcode == OpCodes.Ldc_I4_3)
			{
				return 3;
			}
			if (opcode == OpCodes.Ldc_I4_4)
			{
				return 4;
			}
			if (opcode == OpCodes.Ldc_I4_5)
			{
				return 5;
			}
			if (opcode == OpCodes.Ldc_I4_6)
			{
				return 6;
			}
			if (opcode == OpCodes.Ldc_I4_7)
			{
				return 7;
			}
			if (opcode == OpCodes.Ldc_I4_8)
			{
				return 8;
			}
			if (opcode == OpCodes.Ldc_I4_S)
			{
				return instruction.operand as sbyte?;
			}
			if (opcode == OpCodes.Ldc_I4)
			{
				return instruction.operand as int?;
			}
			return null;
		}
	}
}
namespace PathfindingLib.Utilities.Collections
{
	internal struct NativeArrayBuilder<T> : IEnumerable<T>, IEnumerable, IDisposable where T : unmanaged
	{
		[CompilerGenerated]
		private sealed class <GetEnumerator>d__10 : IEnumerator<T>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private T <>2__current;

			public NativeArrayBuilder<T> <>4__this;

			private int <i>5__2;

			T IEnumerator<T>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GetEnumerator>d__10(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<i>5__2 = 0;
					break;
				case 1:
					<>1__state = -1;
					<i>5__2++;
					break;
				}
				if (<i>5__2 < <>4__this.size)
				{
					<>2__current = <>4__this.array[<i>5__2];
					<>1__state = 1;
					return true;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <System-Collections-IEnumerable-GetEnumerator>d__11 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public NativeArrayBuilder<T> <>4__this;

			private int <i>5__2;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <System-Collections-IEnumerable-GetEnumerator>d__11(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<i>5__2 = 0;
					break;
				case 1:
					<>1__state = -1;
					<i>5__2++;
					break;
				}
				if (<i>5__2 < <>4__this.size)
				{
					<>2__current = <>4__this.array[<i>5__2];
					<>1__state = 1;
					return true;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private NativeArray<T> array;

		private int size;

		public int Capacity
		{
			get
			{
				return array.Length;
			}
			set
			{
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				NativeArray<T> val = default(NativeArray<T>);
				val..ctor(value, (Allocator)4, (NativeArrayOptions)1);
				array.CopyTo(val);
				array.Dispose();
				array = val;
			}
		}

		public readonly int Count => size;

		public void Add(in T item)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (size >= Capacity)
			{
				int num;
				for (num = 8; num <= size; num <<= 1)
				{
				}
				Capacity = num;
			}
			array.GetRef<T>(size++) = item;
		}

		public void Clear()
		{
			size = 0;
		}

		public readonly NativeArray<T> Get()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return array;
		}

		[IteratorStateMachine(typeof(NativeArrayBuilder<>.<GetEnumerator>d__10))]
		public readonly IEnumerator<T> GetEnumerator()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetEnumerator>d__10(0)
			{
				<>4__this = this
			};
		}

		[IteratorStateMachine(typeof(NativeArrayBuilder<>.<System-Collections-IEnumerable-GetEnumerator>d__11))]
		readonly IEnumerator IEnumerable.GetEnumerator()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <System-Collections-IEnumerable-GetEnumerator>d__11(0)
			{
				<>4__this = this
			};
		}

		public void Dispose()
		{
			array.Dispose();
		}
	}
	internal static class NativeArrayExtensions
	{
		internal unsafe static ref T GetRef<T>(this NativeArray<T> array, int index) where T : unmanaged
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			if (index < 0)
			{
				throw new IndexOutOfRangeException("Index cannot be negative.");
			}
			if (index >= array.Length)
			{
				throw new IndexOutOfRangeException($"Index {index} is not within array length of {array.Length}.");
			}
			return ref *(T*)((byte*)array.m_Buffer + (nint)index * (nint)sizeof(T));
		}

		internal unsafe static void SetAllElements<T>(this NativeArray<T> array, T value) where T : unmanaged
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			T* buffer = (T*)array.m_Buffer;
			int length = array.Length;
			for (int i = 0; i < length; i++)
			{
				buffer[i] = value;
			}
		}

		internal unsafe static void CopyFrom<T>(this NativeArray<T> to, Span<T> from) where T : struct
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			if (from.Length != 0)
			{
				UnsafeUtility.MemCpy(NativeArrayUnsafeUtility.GetUnsafePtr<T>(to), UnsafeUtility.AddressOf<T>(ref from[0]), (long)from.Length);
			}
		}
	}
	internal struct NativeHeapIndex
	{
		internal static readonly NativeHeapIndex Invalid = new NativeHeapIndex
		{
			TableIndex = -1
		};

		internal int TableIndex;

		internal readonly bool IsValid => TableIndex >= 0;
	}
	[NativeContainer]
	[DebuggerDisplay("Count = {Count}")]
	internal struct NativeHeap<T, U> : IDisposable where T : unmanaged where U : unmanaged, IComparer<T>
	{
		internal const int DEFAULT_CAPACITY = 128;

		private const int VALIDATION_ERROR_WRONG_INSTANCE = 1;

		private const int VALIDATION_ERROR_INVALID = 2;

		private const int VALIDATION_ERROR_REMOVED = 3;

		[NativeDisableUnsafePtrRestriction]
		private unsafe HeapData<T, U>* Data;

		private Allocator Allocator;

		internal unsafe int Capacity
		{
			get
			{
				return Data->Capacity;
			}
			set
			{
				//IL_000e: 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_00df: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
				TableValue* ptr = (TableValue*)UnsafeUtility.Malloc((long)(UnsafeUtility.SizeOf<TableValue>() * value), UnsafeUtility.AlignOf<TableValue>(), Allocator);
				HeapNode<T>* ptr2 = (HeapNode<T>*)UnsafeUtility.Malloc((long)(UnsafeUtility.SizeOf<HeapNode<T>>() * value), UnsafeUtility.AlignOf<HeapNode<T>>(), Allocator);
				int num = ((Data->Capacity < value) ? Data->Capacity : value);
				UnsafeUtility.MemCpy((void*)ptr, (void*)Data->Table, (long)(num * UnsafeUtility.SizeOf<TableValue>()));
				UnsafeUtility.MemCpy((void*)ptr2, (void*)Data->Heap, (long)(num * UnsafeUtility.SizeOf<HeapNode<T>>()));
				for (int i = 0; i < value - Data->Capacity; i++)
				{
					ptr2[i + Data->Capacity] = new HeapNode<T>
					{
						TableIndex = i + Data->Capacity
					};
				}
				UnsafeUtility.Free((void*)Data->Table, Allocator);
				UnsafeUtility.Free((void*)Data->Heap, Allocator);
				Data->Table = ptr;
				Data->Heap = ptr2;
				Data->Capacity = value;
			}
		}

		internal unsafe int Count => Data->Count;

		internal unsafe U Comparator
		{
			get
			{
				return Data->Comparator;
			}
			set
			{
				Data->Comparator = value;
			}
		}

		internal NativeHeap(Allocator allocator, int initialCapacity = 128, U comparator = default(U))
			: this(initialCapacity, comparator, allocator, 1)
		{
		}//IL_0003: Unknown result type (might be due to invalid IL or missing references)


		public unsafe void Dispose()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			Data->Count = 0;
			Data->Capacity = 0;
			UnsafeUtility.Free((void*)Data->Heap, Allocator);
			UnsafeUtility.Free((void*)Data->Table, Allocator);
			UnsafeUtility.Free((void*)Data, Allocator);
		}

		internal unsafe void Clear()
		{
			Data->Count = 0;
		}

		internal bool IsValidIndex(NativeHeapIndex index)
		{
			return true;
		}

		[Conditional("ENABLE_UNITY_COLLECTIONS_CHECKS")]
		internal void AssertValidIndex(NativeHeapIndex index)
		{
			int num = 0;
			if (1 == 0)
			{
				switch (num)
				{
				case 1:
					throw new ArgumentException("The provided ItemHandle was not valid for this NativeHeap.  It was taken from a different instance.");
				case 2:
					throw new ArgumentException("The provided ItemHandle was not valid for this NativeHeap.");
				case 3:
					throw new ArgumentException("The provided ItemHandle was not valid for this NativeHeap.  The item it pointed to might have already been removed.");
				}
			}
		}

		internal T Peek()
		{
			if (!TryPeek(out var t))
			{
				throw new InvalidOperationException("Cannot Peek NativeHeap when the count is zero.");
			}
			return t;
		}

		internal unsafe bool TryPeek(out T t)
		{
			if (Data->Count == 0)
			{
				t = default(T);
				return false;
			}
			t = Data->Heap->Item;
			return true;
		}

		internal T Pop()
		{
			if (!TryPop(out var t))
			{
				throw new InvalidOperationException("Cannot Pop NativeHeap when the count is zero.");
			}
			return t;
		}

		internal unsafe bool TryPop(out T t)
		{
			if (Data->Count == 0)
			{
				t = default(T);
				return false;
			}
			HeapNode<T> heap = *Data->Heap;
			int num = --Data->Count;
			HeapNode<T> node = Data->Heap[num];
			Data->Heap[num] = heap;
			InsertAndBubbleDown(node, 0);
			t = heap.Item;
			return true;
		}

		internal unsafe NativeHeapIndex Insert(in T t)
		{
			if (Data->Count == Data->Capacity)
			{
				Capacity *= 2;
			}
			HeapNode<T> node = Data->Heap[Data->Count];
			node.Item = t;
			int insertIndex = Data->Count++;
			InsertAndBubbleUp(node, insertIndex);
			NativeHeapIndex result = default(NativeHeapIndex);
			result.TableIndex = node.TableIndex;
			return result;
		}

		internal unsafe T Remove(NativeHeapIndex index)
		{
			int heapIndex = Data->Table[index.TableIndex].HeapIndex;
			HeapNode<T> heapNode = Data->Heap[heapIndex];
			HeapNode<T> node = Data->Heap[--Data->Count];
			UnsafeUtility.WriteArrayElement<HeapNode<T>>((void*)Data->Heap, Data->Count, heapNode);
			if (heapIndex != 0)
			{
				int num = (heapIndex - 1) / 2;
				HeapNode<T> heapNode2 = Data->Heap[num];
				if (Data->Comparator.Compare(node.Item, heapNode2.Item) < 0)
				{
					InsertAndBubbleUp(node, heapIndex);
					return heapNode.Item;
				}
			}
			InsertAndBubbleDown(node, heapIndex);
			return heapNode.Item;
		}

		internal unsafe T Get(NativeHeapIndex index)
		{
			int heapIndex = Data->Table[index.TableIndex].HeapIndex;
			return Data->Heap[heapIndex].Item;
		}

		private unsafe NativeHeap(int initialCapacity, U comparator, Allocator allocator, int disposeSentinelStackDepth)
		{
			//IL_000c: 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_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			Data = (HeapData<T, U>*)UnsafeUtility.Malloc((long)UnsafeUtility.SizeOf<HeapData<T, U>>(), UnsafeUtility.AlignOf<HeapData<T, U>>(), allocator);
			Data->Heap = (HeapNode<T>*)UnsafeUtility.Malloc((long)(UnsafeUtility.SizeOf<HeapNode<T>>() * initialCapacity), UnsafeUtility.AlignOf<HeapNode<T>>(), allocator);
			Data->Table = (TableValue*)UnsafeUtility.Malloc((long)(UnsafeUtility.SizeOf<TableValue>() * initialCapacity), UnsafeUtility.AlignOf<TableValue>(), allocator);
			Allocator = allocator;
			for (int i = 0; i < initialCapacity; i++)
			{
				Data->Heap[i] = new HeapNode<T>
				{
					TableIndex = i
				};
			}
			Data->Count = 0;
			Data->Capacity = initialCapacity;
			Data->Comparator = comparator;
		}

		private unsafe void InsertAndBubbleDown(HeapNode<T> node, int insertIndex)
		{
			while (true)
			{
				int num = insertIndex * 2 + 1;
				int num2 = insertIndex * 2 + 2;
				if (num >= Data->Count)
				{
					break;
				}
				if (num2 >= Data->Count || Data->Comparator.Compare(Data->Heap[num].Item, Data->Heap[num2].Item) <= 0)
				{
					HeapNode<T> heapNode = Data->Heap[num];
					if (Data->Comparator.Compare(node.Item, heapNode.Item) <= 0)
					{
						break;
					}
					Data->Heap[insertIndex] = heapNode;
					Data->Table[heapNode.TableIndex].HeapIndex = insertIndex;
					insertIndex = num;
				}
				else
				{
					HeapNode<T> heapNode2 = Data->Heap[num2];
					if (Data->Comparator.Compare(node.Item, heapNode2.Item) <= 0)
					{
						break;
					}
					Data->Heap[insertIndex] = heapNode2;
					Data->Table[heapNode2.TableIndex].HeapIndex = insertIndex;
					insertIndex = num2;
				}
			}
			Data->Heap[insertIndex] = node;
			Data->Table[node.TableIndex].HeapIndex = insertIndex;
		}

		private unsafe void InsertAndBubbleUp(HeapNode<T> node, int insertIndex)
		{
			while (insertIndex != 0)
			{
				int num = (insertIndex - 1) / 2;
				HeapNode<T> heapNode = Data->Heap[num];
				if (Data->Comparator.Compare(heapNode.Item, node.Item) <= 0)
				{
					break;
				}
				Data->Heap[insertIndex] = heapNode;
				Data->Table[heapNode.TableIndex].HeapIndex = insertIndex;
				insertIndex = num;
			}
			Data->Heap[insertIndex] = node;
			Data->Table[node.TableIndex].HeapIndex = insertIndex;
		}

		[Conditional("ENABLE_UNITY_COLLECTIONS_CHECKS")]
		private void IsValidIndexInternal(NativeHeapIndex index, ref bool result, ref int errorCode)
		{
		}
	}
	internal struct TableValue
	{
		internal int HeapIndex;
	}
	internal struct HeapData<T, U> where T : unmanaged
	{
		internal int Count;

		internal int Capacity;

		internal unsafe HeapNode<T>* Heap;

		internal unsafe TableValue* Table;

		internal U Comparator;
	}
	internal struct HeapNode<T> where T : unmanaged
	{
		internal T Item;

		internal int TableIndex;
	}
	internal static class NativeListExtensions
	{
		internal static void Insert<T>(this ref UnsafeList<T> self, int index, T element) where T : unmanaged
		{
			self.InsertRangeWithBeginEnd(index, index + 1);
			self[index] = element;
		}

		public unsafe static int AddOrdered<T>(this ref UnsafeList<T> self, T item, IComparer<T> comparer) where T : unmanaged
		{
			int num = NativeSortExtension.BinarySearch<T, IComparer<T>>(self.Ptr, self.Length, item, comparer);
			if (num < 0)
			{
				num = ~num;
			}
			self.Insert(num, item);
			return num;
		}

		public static int FindIndex<T>(this in UnsafeList<T> self, Predicate<T> predicate) where T : unmanaged
		{
			//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_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < self.Length; i++)
			{
				if (predicate(self[i]))
				{
					return i;
				}
			}
			return -1;
		}
	}
}
namespace PathfindingLib.Patches
{
	internal static class PatchEntranceTeleport
	{
		internal static List<EntranceTeleport> allEntranceTeleports = new List<EntranceTeleport>();

		[HarmonyPostfix]
		[HarmonyPatch(typeof(EntranceTeleport), "Awake")]
		private static void AwakePostfix(EntranceTeleport __instance)
		{
			allEntranceTeleports.Add(__instance);
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(NetworkBehaviour), "OnDestroy")]
		private static void DestroyPostfix(NetworkBehaviour __instance)
		{
			EntranceTeleport val = (EntranceTeleport)(object)((__instance is EntranceTeleport) ? __instance : null);
			if (val != null)
			{
				allEntranceTeleports.Remove(val);
				SmartPathLinks.UnregisterEntranceTeleport(val);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(RoundManager), "SetExitIDs")]
		private static void SetExitIDsPostfix()
		{
			foreach (EntranceTeleport allEntranceTeleport in allEntranceTeleports)
			{
				if (!((Behaviour)allEntranceTeleport).isActiveAndEnabled)
				{
					continue;
				}
				foreach (EntranceTeleport allEntranceTeleport2 in allEntranceTeleports)
				{
					if (((Behaviour)allEntranceTeleport2).isActiveAndEnabled && allEntranceTeleport.entranceId == allEntranceTeleport2.entranceId && allEntranceTeleport.isEntranceToBuilding != allEntranceTeleport2.isEntranceToBuilding)
					{
						PathfindingLibPlugin.Instance.Logger.LogDebug((object)$"{allEntranceTeleport} ({((NetworkBehaviour)allEntranceTeleport).NetworkObjectId}) connects to {allEntranceTeleport2} ({((NetworkBehaviour)allEntranceTeleport2).NetworkObjectId})");
						SmartPathLinks.RegisterEntranceTeleport(allEntranceTeleport, allEntranceTeleport2.entrancePoint);
						break;
					}
				}
			}
		}
	}
	[HarmonyPatch(typeof(MineshaftElevatorController))]
	internal static class PatchMineshaftElevatorController
	{
		[HarmonyPostfix]
		[HarmonyPatch("OnEnable")]
		private static void OnEnablePostfix(MineshaftElevatorController __instance)
		{
			MineshaftElevatorAdapter mineshaftElevatorAdapter = default(MineshaftElevatorAdapter);
			if (((Component)__instance).TryGetComponent<MineshaftElevatorAdapter>(ref mineshaftElevatorAdapter))
			{
				((Behaviour)mineshaftElevatorAdapter).enabled = true;
			}
			mineshaftElevatorAdapter = ((Component)__instance).gameObject.AddComponent<MineshaftElevatorAdapter>();
			mineshaftElevatorAdapter.controller = __instance;
		}

		[HarmonyPostfix]
		[HarmonyPatch("OnDisable")]
		private static void OnDisablePostfix(MineshaftElevatorController __instance)
		{
			MineshaftElevatorAdapter mineshaftElevatorAdapter = default(MineshaftElevatorAdapter);
			if (((Component)__instance).TryGetComponent<MineshaftElevatorAdapter>(ref mineshaftElevatorAdapter))
			{
				((Behaviour)mineshaftElevatorAdapter).enabled = false;
			}
		}
	}
	[HarmonyPatch(typeof(NavMeshLink))]
	internal static class PatchNavMeshLink
	{
		private unsafe static bool TryUpdatingConnectionInPlace(NavMeshLink link)
		{
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: 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_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			if (NativeHelpers.GetNavMesh() == IntPtr.Zero)
			{
				return false;
			}
			int id = ((NavMeshLinkInstance)(ref link.m_LinkInstance)).id;
			int num = id & 0xFFFF;
			ref FreeList<NavMeshLinkRegistryEntry> navMeshLinkRegistry = ref NativeNavMeshUtils.GetNavMeshLinkRegistry();
			if (num >= navMeshLinkRegistry.Capacity)
			{
				return false;
			}
			ref NavMeshLinkRegistryEntry reference = ref navMeshLinkRegistry.Elements[num];
			if (reference.ConnectionID == 0L)
			{
				return false;
			}
			int num2 = (id >> 16) & 0xFFFF;
			if (reference.UseCount != num2)
			{
				return false;
			}
			Vector3 position = ((Component)link).transform.position;
			Quaternion rotation = ((Component)link).transform.rotation;
			Matrix4x4 val = Matrix4x4.TRS(position, rotation, Vector3.one);
			Vector3 start = ((Matrix4x4)(ref val)).MultiplyPoint3x4(link.startPoint);
			Vector3 end = ((Matrix4x4)(ref val)).MultiplyPoint3x4(link.endPoint);
			Vector3 up = rotation * Vector3.up;
			uint num3 = (uint)(int)reference.ConnectionID & 0xFFFFu;
			uint num4 = (uint)(reference.ConnectionID >> 48);
			ref FreeList<OffMeshConnection> offMeshConnectionFreeList = ref NativeHelpers.GetOffMeshConnectionFreeList();
			if (num3 >= offMeshConnectionFreeList.Capacity)
			{
				return false;
			}
			ref OffMeshConnection reference2 = ref offMeshConnectionFreeList.Elements[num3];
			if (reference2.Salt != num4)
			{
				return false;
			}
			NavMeshLock.BeginWrite();
			IntPtr navMesh = NativeHelpers.GetNavMesh();
			PatchConnectUnconnectOffMeshConnection.UnconnectOffMeshConnection(navMesh, num3);
			PatchOffMeshLinkUpdatePositions.UpdateConnection(ref reference2, start, end, up, link.width, link.costModifier, link.bidirectional, (byte)link.area, ((Behaviour)link).isActiveAndEnabled, ((Object)link).GetInstanceID(), link.agentTypeID);
			Vector3 linkQueryExtents = NativeFunctions.GetLinkQueryExtents(link.agentTypeID);
			PatchConnectUnconnectOffMeshConnection.ConnectOffMeshConnection(navMesh, num3, linkQueryExtents.x, linkQueryExtents.y);
			NavMeshLock.EndWrite();
			link.m_LastPosition = position;
			link.m_LastRotation = rotation;
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch("UpdateLink")]
		private static bool UpdateLinkPrefix(NavMeshLink __instance)
		{
			return !TryUpdatingConnectionInPlace(__instance);
		}
	}
	[HarmonyPatch(typeof(NavMeshSurface))]
	internal static class PatchNavMeshSurface
	{
		private static readonly MethodInfo m_BeginNavMeshWrite = typeof(NavMeshLock).GetMethod("BeginWrite", BindingFlags.Static | BindingFlags.Public);

		private static readonly MethodInfo m_EndNavMeshWrite = typeof(NavMeshLock).GetMethod("EndWrite", BindingFlags.Static | BindingFlags.Public);

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(NavMeshSurface), "BuildNavMesh")]
		[HarmonyPatch(typeof(NavMeshSurface), "AddData")]
		[HarmonyPatch(typeof(NavMeshSurface), "RemoveData")]
		private static IEnumerable<CodeInstruction> LockWriteForDurationOfMethodTranspiler(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			return new ILInjector(instructions).Insert(new CodeInstruction(OpCodes.Call, (object)m_BeginNavMeshWrite)).GoToEnd().ReverseFind(ILMatcher.Opcode(OpCodes.Ret))
				.Insert(new CodeInstruction(OpCodes.Call, (object)m_EndNavMeshWrite))
				.ReleaseInstructions();
		}

		[HarmonyTranspiler]
		[HarmonyPatch("UpdateDataIfTransformChanged")]
		private static IEnumerable<CodeInstruction> UpdateDataIfTransformChangedTranspiler(IEnumerable<CodeInstruction> instructions)
		{
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Expected O, but got Unknown
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Expected O, but got Unknown
			ILInjector iLInjector = new ILInjector(instructions).Find(ILMatcher.Ldarg(0), ILMatcher.Call(typeof(NavMeshSurface).GetMethod("RemoveData"), "UpdateDataIfTransformChangedTranspiler", "E:\\Development\\Lethal Company\\Projects\\PathfindingLib\\PathfindingLib\\Patches\\PatchNavMeshSurface.cs", 43));
			if (!iLInjector.IsValid)
			{
				PathfindingLibPlugin.Instance.Logger.LogError((object)"Failed to find the call to RemoveData in NavMeshSurface.UpdateDataIfTransformChanged.");
				return instructions;
			}
			iLInjector.Insert(new CodeInstruction(OpCodes.Call, (object)m_BeginNavMeshWrite)).Find(ILMatcher.Ldarg(0), ILMatcher.Call(typeof(NavMeshSurface).GetMethod("AddData"), "UpdateDataIfTransformChangedTranspiler", "E:\\Development\\Lethal Company\\Projects\\PathfindingLib\\PathfindingLib\\Patches\\PatchNavMeshSu