Decompiled source of MirageRevive v1.0.0

BepInEx/plugins/MirageRevive.dll

Decompiled 5 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security.Permissions;
using System.Threading;
using <StartupCode$MirageRevive>.$Mirage.Revive.Domain;
using <StartupCode$MirageRevive>.$Mirage.Revive.Hook;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using FSharpPlus;
using FSharpPlus.Control;
using FSharpx.Control;
using GameNetcodeStuff;
using LobbyCompatibility.Enums;
using LobbyCompatibility.Features;
using Microsoft.FSharp.Collections;
using Microsoft.FSharp.Control;
using Microsoft.FSharp.Core;
using Microsoft.FSharp.Core.CompilerServices;
using Mirage.Revive.Domain;
using Mirage.Revive.Hook;
using Mirage.Revive.Unity;
using MirageRevive.NetcodePatcher;
using On;
using On.GameNetcodeStuff;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;

[assembly: FSharpInterfaceDataVersion(2, 0, 0)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("ClientNetworkTransform")]
[assembly: IgnoresAccessChecksTo("DissonanceVoip")]
[assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")]
[assembly: IgnoresAccessChecksTo("Unity.Burst")]
[assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")]
[assembly: IgnoresAccessChecksTo("Unity.Collections")]
[assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Jobs")]
[assembly: IgnoresAccessChecksTo("Unity.Mathematics")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")]
[assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")]
[assembly: IgnoresAccessChecksTo("Unity.Services.QoS")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Relay")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: AssemblyCompany("MirageRevive")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+45f19fcd3d93c13ee168b6f161535a281504197d")]
[assembly: AssemblyProduct("MirageRevive")]
[assembly: AssemblyTitle("MirageRevive")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace Mirage.Revive
{
	[Serializable]
	[BepInPlugin("qwbarch.MirageRevive", "MirageRevive", "1.0.0")]
	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		public void Awake()
		{
			ConfigFile config = ((BaseUnityPlugin)this).Config;
			Mirage.Revive.Domain.Config.localConfig = FSharpOption<Mirage.Revive.Domain.Config.LocalConfig>.Some(new Mirage.Revive.Domain.Config.LocalConfig(config));
			Mirage.Revive.Domain.Netcode.initNetcodePatcher();
			Compatibility.initLobbyCompatibility();
			Mirage.Revive.Hook.Config.syncConfig();
			Mirage.Revive.Hook.MaskedPlayerEnemy.revivePlayersOnDeath();
		}
	}
}
namespace <StartupCode$MirageRevive>
{
	internal static class $Plugin
	{
	}
}
namespace Mirage.Revive.Hook
{
	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static class MaskedPlayerEnemy
	{
		[Serializable]
		[SpecialName]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static class revivePlayersOnDeath@62
		{
			internal static void Invoke(orig_Awake orig, PlayerControllerB self)
			{
				orig.Invoke(self);
				BodyDeactivator.BodyDeactivator bodyDeactivator = ((Component)self).gameObject.AddComponent<BodyDeactivator.BodyDeactivator>();
			}
		}

		[Serializable]
		[SpecialName]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static class revivePlayersOnDeath@68-1
		{
			internal static void Invoke(orig_Start orig, GameNetworkManager self)
			{
				orig.Invoke(self);
				List<NetworkPrefab> prefabs = ((Component)self).GetComponent<NetworkManager>().NetworkConfig.Prefabs.m_Prefabs;
				foreach (NetworkPrefab item in prefabs)
				{
					HauntedMaskItem component = item.Prefab.gameObject.GetComponent<HauntedMaskItem>();
					if (component != null)
					{
						maskItem = component;
					}
				}
				if (maskItem == null)
				{
					Mirage.Revive.Domain.Logger.logWarning.Invoke("HauntedMaskItem prefab is missing. Another mod is messing with this prefab when they shouldn't be.");
				}
			}
		}

		[Serializable]
		[SpecialName]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static class revivePlayersOnDeath@79-2
		{
			internal static void Invoke(orig_StartGame orig, StartOfRound self)
			{
				orig.Invoke(self);
				killedPlayers.Clear();
			}
		}

		[Serializable]
		[SpecialName]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static class revivePlayersOnDeath@85-3
		{
			internal static void Invoke(orig_KillPlayerServerRpc orig, PlayerControllerB self, int playerId, bool spawnBody, Vector3 bodyVelocity, int causeOfDeath, int deathAnimation, Vector3 positionOffset)
			{
				//IL_0004: Unknown result type (might be due to invalid IL or missing references)
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0017: Unknown result type (might be due to invalid IL or missing references)
				orig.Invoke(self, playerId, spawnBody, bodyVelocity, causeOfDeath, deathAnimation, positionOffset);
				spawnMaskedEnemy<Vector3>(self, causeOfDeath, deathAnimation, spawnBody, bodyVelocity);
			}
		}

		[Serializable]
		[SpecialName]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static class revivePlayersOnDeath@89-4
		{
			internal static void Invoke(orig_KillPlayer orig, PlayerControllerB self, Vector3 bodyVelocity, bool spawnBody, CauseOfDeath causeOfDeath, int deathAnimation, Vector3 positionOffset)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0004: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				//IL_001b: Expected I4, but got Unknown
				orig.Invoke(self, bodyVelocity, spawnBody, causeOfDeath, deathAnimation, positionOffset);
				spawnMaskedEnemy<Vector3>(self, (int)causeOfDeath, deathAnimation, spawnBody, bodyVelocity);
			}
		}

		[Serializable]
		[SpecialName]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal sealed class revivePlayersOnDeath@99-6 : GeneratedSequenceBase<IEnumerator>
		{
			public orig_EndOfGame orig;

			public StartOfRound self;

			public int bodiesEnsured;

			public int connectedPlayersOnServer;

			public int scrapCollected;

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public IEnumerator<PlayerControllerB> @enum;

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public int pc;

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public IEnumerator current;

			public revivePlayersOnDeath@99-6(orig_EndOfGame orig, StartOfRound self, int bodiesEnsured, int connectedPlayersOnServer, int scrapCollected, IEnumerator<PlayerControllerB> @enum, int pc, IEnumerator current)
			{
				this.orig = orig;
				this.self = self;
				this.bodiesEnsured = bodiesEnsured;
				this.connectedPlayersOnServer = connectedPlayersOnServer;
				this.scrapCollected = scrapCollected;
				this.@enum = @enum;
				this.pc = pc;
				this.current = current;
				base..ctor();
			}

			public override int GenerateNext(ref IEnumerable<IEnumerator> next)
			{
				switch (pc)
				{
				default:
					pc = 1;
					current = orig.Invoke(self, bodiesEnsured, connectedPlayersOnServer, scrapCollected);
					return 1;
				case 1:
					@enum = ((IEnumerable<PlayerControllerB>)self.allPlayerScripts).GetEnumerator();
					pc = 2;
					while (@enum.MoveNext())
					{
						PlayerControllerB val = @enum.Current;
						val.deadBody = null;
					}
					goto case 2;
				case 2:
					pc = 3;
					IntrinsicFunctions.Dispose<IEnumerator<PlayerControllerB>>(@enum);
					@enum = null;
					pc = 3;
					break;
				case 3:
					break;
				}
				current = null;
				return 0;
			}

			public override void Close()
			{
				Exception ex = default(Exception);
				while (true)
				{
					switch (pc)
					{
					case 3:
						if (ex != null)
						{
							throw ex;
						}
						return;
					}
					try
					{
						switch (pc)
						{
						default:
							pc = 3;
							IntrinsicFunctions.Dispose<IEnumerator<PlayerControllerB>>(@enum);
							break;
						case 0:
						case 1:
						case 3:
							break;
						}
						pc = 3;
						current = null;
					}
					catch (object obj)
					{
						Exception ex2 = (Exception)obj;
						ex = ex2;
					}
				}
			}

			public override bool get_CheckClose()
			{
				switch (pc)
				{
				default:
					return true;
				case 1:
					return false;
				case 0:
				case 3:
					return false;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			public override IEnumerator get_LastGenerated()
			{
				return current;
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			public override IEnumerator<IEnumerator> GetFreshEnumerator()
			{
				return (IEnumerator<IEnumerator>)(object)new revivePlayersOnDeath@99-6(orig, self, bodiesEnsured, connectedPlayersOnServer, scrapCollected, null, 0, null);
			}
		}

		[Serializable]
		[SpecialName]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static class revivePlayersOnDeath@97-5
		{
			internal static IEnumerator Invoke(orig_EndOfGame orig, StartOfRound self, int bodiesEnsured, int connectedPlayersOnServer, int scrapCollected)
			{
				return (IEnumerator)(object)new revivePlayersOnDeath@99-6(orig, self, bodiesEnsured, connectedPlayersOnServer, scrapCollected, null, 0, null);
			}
		}

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static Random random => <StartupCode$MirageRevive>.$Mirage.Revive.Hook.MaskedPlayerEnemy.random@14;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static HashSet<ulong> killedPlayers => <StartupCode$MirageRevive>.$Mirage.Revive.Hook.MaskedPlayerEnemy.killedPlayers@17;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static HauntedMaskItem maskItem
		{
			get
			{
				return <StartupCode$MirageRevive>.$Mirage.Revive.Hook.MaskedPlayerEnemy.maskItem@20;
			}
			set
			{
				<StartupCode$MirageRevive>.$Mirage.Revive.Hook.MaskedPlayerEnemy.maskItem@20 = value;
			}
		}

		[CompilationArgumentCounts(new int[] { 1, 1, 1, 1, 1 })]
		internal static void spawnMaskedEnemy<a>(PlayerControllerB player, int causeOfDeath, int deathAnimation, bool spawnBody, a bodyVelocity)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			if (killedPlayers.Add(player.playerClientId))
			{
				Vector3 position = ((Component)player).transform.position;
				NavMeshHit val = default(NavMeshHit);
				bool flag = NavMesh.SamplePosition(position, ref val, 1f, -1) && Mathf.Approximately(position.x, ((NavMeshHit)(ref val)).position.x) && Mathf.Approximately(position.z, ((NavMeshHit)(ref val)).position.z);
				int num;
				if (causeOfDeath == 5 && spawnBody)
				{
					a val2 = bodyVelocity;
					num = (val2.Equals(Vector3.zero) ? 1 : 0);
				}
				else
				{
					num = 0;
				}
				bool flag2 = (byte)num != 0;
				bool flag3 = causeOfDeath == 4 && deathAnimation == 4;
				Mirage.Revive.Domain.Config.SyncedConfig config = Mirage.Revive.Domain.Config.getConfig();
				bool flag4 = !config.reviveOnlyWhenPlayerAlone@ || player.isPlayerAlone;
				if ((flag || (player.isInHangarShipRoom && StartOfRound.Instance.shipHasLanded)) && !flag2 && !flag3 && spawnBody && flag4 && random.Next(1, 101) <= config.reviveChance@)
				{
					float y = ((Component)player).transform.eulerAngles.y;
					GameObject val3 = Object.Instantiate<GameObject>(maskItem.mimicEnemy.enemyPrefab, ((Component)player).transform.position, Quaternion.Euler(new Vector3(0f, y, 0f)));
					MaskedPlayerEnemy component = val3.GetComponent<MaskedPlayerEnemy>();
					component.mimickingPlayer = player;
					val3.GetComponentInChildren<NetworkObject>().Spawn(true);
					((Component)player).GetComponent<BodyDeactivator.BodyDeactivator>().DeactivateBody((EnemyAI)(object)component);
				}
			}
		}

		public static void revivePlayersOnDeath()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected O, but got Unknown
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Expected O, but got Unknown
			PlayerControllerB.Awake += new hook_Awake(revivePlayersOnDeath@62.Invoke);
			GameNetworkManager.Start += new hook_Start(revivePlayersOnDeath@68-1.Invoke);
			StartOfRound.StartGame += new hook_StartGame(revivePlayersOnDeath@79-2.Invoke);
			PlayerControllerB.KillPlayerServerRpc += new hook_KillPlayerServerRpc(revivePlayersOnDeath@85-3.Invoke);
			PlayerControllerB.KillPlayer += new hook_KillPlayer(revivePlayersOnDeath@89-4.Invoke);
			StartOfRound.EndOfGame += new hook_EndOfGame(revivePlayersOnDeath@97-5.Invoke);
		}
	}
}
namespace <StartupCode$MirageRevive>.$Mirage.Revive.Hook
{
	internal static class MaskedPlayerEnemy
	{
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static readonly Random random@14;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static readonly HashSet<ulong> killedPlayers@17;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static HauntedMaskItem maskItem@20;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal static int init@;

		static MaskedPlayerEnemy()
		{
			random@14 = new Random();
			killedPlayers@17 = new HashSet<ulong>();
			maskItem@20 = null;
		}
	}
}
namespace Mirage.Revive.Unity
{
	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static class BodyDeactivator
	{
		[Serializable]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		public class BodyDeactivator : NetworkBehaviour
		{
			public void DeactivateBody(EnemyAI enemy)
			{
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				PlayerControllerB component = ((Component)this).GetComponent<PlayerControllerB>();
				if (component.deadBody != null)
				{
					component.redirectToEnemy = enemy;
					component.deadBody.DeactivateBody(false);
					if (((NetworkBehaviour)this).IsHost)
					{
						DeactivateBodyClientRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)this).NetworkObject));
					}
				}
			}

			[ClientRpc]
			public void DeactivateBodyClientRpc(NetworkObjectReference reference)
			{
				//IL_0024: Unknown result type (might be due to invalid IL or missing references)
				//IL_002e: Invalid comparison between Unknown and I4
				//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Invalid comparison between Unknown and I4
				//IL_005f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0068: Unknown result type (might be due to invalid IL or missing references)
				//IL_006d: Unknown result type (might be due to invalid IL or missing references)
				//IL_007d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0083: Unknown result type (might be due to invalid IL or missing references)
				//IL_0097: Unknown result type (might be due to invalid IL or missing references)
				NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
				if (networkManager == null || !networkManager.IsListening)
				{
					return;
				}
				if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(727223059u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref reference, default(ForNetworkSerializable));
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 727223059u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && !((NetworkBehaviour)this).IsHost)
				{
					NetworkObject val3 = null;
					if (((NetworkObjectReference)(ref reference)).TryGet(ref val3, (NetworkManager)null))
					{
						DeactivateBody(((Component)val3).GetComponent<EnemyAI>());
					}
					else
					{
						Mirage.Revive.Domain.Logger.logError.Invoke("DeactivateBodyClientRpc received an invalid network object reference.");
					}
				}
			}

			protected override void __initializeVariables()
			{
				((NetworkBehaviour)this).__initializeVariables();
			}

			[RuntimeInitializeOnLoadMethod]
			internal static void InitializeRPCS_BodyDeactivator()
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_001b: Expected O, but got Unknown
				NetworkManager.__rpc_func_table.Add(727223059u, new RpcReceiveHandler(__rpc_handler_727223059));
			}

			private static void __rpc_handler_727223059(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
			{
				//IL_002f: 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_0044: 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_005e: Unknown result type (might be due to invalid IL or missing references)
				NetworkManager networkManager = target.NetworkManager;
				if (networkManager != null && networkManager.IsListening)
				{
					NetworkObjectReference reference = default(NetworkObjectReference);
					((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref reference, default(ForNetworkSerializable));
					target.__rpc_exec_stage = (__RpcExecStage)2;
					((BodyDeactivator)(object)target).DeactivateBodyClientRpc(reference);
					target.__rpc_exec_stage = (__RpcExecStage)0;
				}
			}

			[MethodImpl(MethodImplOptions.NoInlining)]
			protected internal override string __getTypeName()
			{
				return "BodyDeactivator";
			}
		}
	}
}
namespace <StartupCode$MirageRevive>.$Mirage.Revive.Unity
{
	internal static class BodyDeactivator
	{
	}
}
namespace Mirage.Revive.Hook
{
	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static class Config
	{
		[Serializable]
		[SpecialName]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static class syncConfig@7
		{
			internal static void Invoke(orig_ConnectClientToPlayerObject orig, PlayerControllerB self)
			{
				orig.Invoke(self);
				if (NetworkManager.Singleton.IsHost)
				{
					Mirage.Revive.Domain.Config.registerHandler(Mirage.Revive.Domain.Config.SyncAction.RequestSync);
					return;
				}
				Mirage.Revive.Domain.Config.registerHandler(Mirage.Revive.Domain.Config.SyncAction.ReceiveSync);
				Mirage.Revive.Domain.Config.requestSync();
			}
		}

		[Serializable]
		[SpecialName]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static class syncConfig@16-1
		{
			internal static void Invoke(orig_StartDisconnect orig, GameNetworkManager self)
			{
				orig.Invoke(self);
				Mirage.Revive.Domain.Config.syncedConfig = null;
			}
		}

		public static void syncConfig()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			PlayerControllerB.ConnectClientToPlayerObject += new hook_ConnectClientToPlayerObject(syncConfig@7.Invoke);
			GameNetworkManager.StartDisconnect += new hook_StartDisconnect(syncConfig@16-1.Invoke);
		}
	}
}
namespace <StartupCode$MirageRevive>.$Mirage.Revive.Hook
{
	internal static class Config
	{
	}
}
namespace Mirage.Revive.Domain
{
	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static class Config
	{
		[Serializable]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		public class LocalConfig
		{
			internal ConfigEntry<int> ReviveChance@;

			internal ConfigEntry<bool> ReviveOnlyWhenPlayerAlone@;

			public ConfigEntry<int> ReviveChance
			{
				[CompilerGenerated]
				[DebuggerNonUserCode]
				get
				{
					return ReviveChance@;
				}
			}

			public ConfigEntry<bool> ReviveOnlyWhenPlayerAlone
			{
				[CompilerGenerated]
				[DebuggerNonUserCode]
				get
				{
					return ReviveOnlyWhenPlayerAlone@;
				}
			}

			public LocalConfig(ConfigFile config)
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_0033: Expected O, but got Unknown
				ReviveChance@ = config.Bind<int>("Revive", "Revive chance", 10, new ConfigDescription("The chance a player will revive as a masked enemy, on player death.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
				ReviveOnlyWhenPlayerAlone@ = config.Bind<bool>("Revive", "Revive only when alone", false, "If enabled, revivals only happen when the player dies alone (where others will almost never see the masked enemy come to life from your body)." + "If disabled, revivals will always happen based on the configured chance, which means players that are near you can see the masked enemy coming back to life.");
			}
		}

		[Serializable]
		[Serializable]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		public sealed class SyncedConfig : IEquatable<SyncedConfig>, IStructuralEquatable, IComparable<SyncedConfig>, IComparable, IStructuralComparable
		{
			[CompilerGenerated]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			internal int reviveChance@;

			[CompilerGenerated]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			internal bool reviveOnlyWhenPlayerAlone@;

			[CompilationMapping(/*Could not decode attribute arguments.*/)]
			public int reviveChance
			{
				[CompilerGenerated]
				[DebuggerNonUserCode]
				get
				{
					return reviveChance@;
				}
			}

			[CompilationMapping(/*Could not decode attribute arguments.*/)]
			public bool reviveOnlyWhenPlayerAlone
			{
				[CompilerGenerated]
				[DebuggerNonUserCode]
				get
				{
					return reviveOnlyWhenPlayerAlone@;
				}
			}

			[DynamicDependency(DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties, typeof(SyncedConfig))]
			public SyncedConfig(int reviveChance, bool reviveOnlyWhenPlayerAlone)
			{
				reviveChance@ = reviveChance;
				reviveOnlyWhenPlayerAlone@ = reviveOnlyWhenPlayerAlone;
			}

			[CompilerGenerated]
			public override string ToString()
			{
				return ExtraTopLevelOperators.PrintFormatToString<FSharpFunc<SyncedConfig, string>>((PrintfFormat<FSharpFunc<SyncedConfig, string>, Unit, string, string>)(object)new PrintfFormat<FSharpFunc<SyncedConfig, string>, Unit, string, string, SyncedConfig>("%+A")).Invoke(this);
			}

			[CompilerGenerated]
			public sealed int CompareTo(SyncedConfig obj)
			{
				if (this != null)
				{
					if (obj != null)
					{
						IComparer genericComparer = LanguagePrimitives.GenericComparer;
						int num = reviveChance@;
						int num2 = obj.reviveChance@;
						int num3 = ((num > num2) ? 1 : 0) - ((num < num2) ? 1 : 0);
						if (num3 < 0)
						{
							return num3;
						}
						if (num3 > 0)
						{
							return num3;
						}
						genericComparer = LanguagePrimitives.GenericComparer;
						bool flag = reviveOnlyWhenPlayerAlone@;
						bool flag2 = obj.reviveOnlyWhenPlayerAlone@;
						return (flag ? 1 : 0) - (flag2 ? 1 : 0);
					}
					return 1;
				}
				if (obj != null)
				{
					return -1;
				}
				return 0;
			}

			[CompilerGenerated]
			public sealed int CompareTo(object obj)
			{
				return CompareTo((SyncedConfig)obj);
			}

			[CompilerGenerated]
			public sealed int CompareTo(object obj, IComparer comp)
			{
				SyncedConfig syncedConfig = (SyncedConfig)obj;
				if (this != null)
				{
					if ((SyncedConfig)obj != null)
					{
						int num = reviveChance@;
						int num2 = syncedConfig.reviveChance@;
						int num3 = ((num > num2) ? 1 : 0) - ((num < num2) ? 1 : 0);
						if (num3 < 0)
						{
							return num3;
						}
						if (num3 > 0)
						{
							return num3;
						}
						bool flag = reviveOnlyWhenPlayerAlone@;
						bool flag2 = syncedConfig.reviveOnlyWhenPlayerAlone@;
						return (flag ? 1 : 0) - (flag2 ? 1 : 0);
					}
					return 1;
				}
				if ((SyncedConfig)obj != null)
				{
					return -1;
				}
				return 0;
			}

			[CompilerGenerated]
			public sealed int GetHashCode(IEqualityComparer comp)
			{
				if (this != null)
				{
					int num = 0;
					num = -1640531527 + ((reviveOnlyWhenPlayerAlone@ ? 1 : 0) + ((num << 6) + (num >> 2)));
					return -1640531527 + (reviveChance@ + ((num << 6) + (num >> 2)));
				}
				return 0;
			}

			[CompilerGenerated]
			public sealed override int GetHashCode()
			{
				return GetHashCode(LanguagePrimitives.GenericEqualityComparer);
			}

			[CompilerGenerated]
			public sealed bool Equals(object obj, IEqualityComparer comp)
			{
				if (this != null)
				{
					if (obj is SyncedConfig syncedConfig)
					{
						if (reviveChance@ == syncedConfig.reviveChance@)
						{
							return reviveOnlyWhenPlayerAlone@ == syncedConfig.reviveOnlyWhenPlayerAlone@;
						}
						return false;
					}
					return false;
				}
				return obj == null;
			}

			[CompilerGenerated]
			public sealed bool Equals(SyncedConfig obj)
			{
				if (this != null)
				{
					if (obj != null)
					{
						if (reviveChance@ == obj.reviveChance@)
						{
							return reviveOnlyWhenPlayerAlone@ == obj.reviveOnlyWhenPlayerAlone@;
						}
						return false;
					}
					return false;
				}
				return obj == null;
			}

			[CompilerGenerated]
			public sealed override bool Equals(object obj)
			{
				if (obj is SyncedConfig obj2)
				{
					return Equals(obj2);
				}
				return false;
			}
		}

		[Serializable]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[DebuggerDisplay("{__DebugDisplay(),nq}")]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		public sealed class SyncAction : IEquatable<SyncAction>, IStructuralEquatable, IComparable<SyncAction>, IComparable, IStructuralComparable
		{
			public static class Tags
			{
				public const int RequestSync = 0;

				public const int ReceiveSync = 1;
			}

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal static readonly SyncAction _unique_RequestSync = new SyncAction(0);

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal static readonly SyncAction _unique_ReceiveSync = new SyncAction(1);

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[field: DebuggerNonUserCode]
			public int Tag
			{
				[DebuggerNonUserCode]
				get;
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			public static SyncAction RequestSync
			{
				[CompilationMapping(/*Could not decode attribute arguments.*/)]
				get
				{
					return _unique_RequestSync;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			public bool IsRequestSync
			{
				[CompilerGenerated]
				[DebuggerNonUserCode]
				get
				{
					return Tag == 0;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			public static SyncAction ReceiveSync
			{
				[CompilationMapping(/*Could not decode attribute arguments.*/)]
				get
				{
					return _unique_ReceiveSync;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			public bool IsReceiveSync
			{
				[CompilerGenerated]
				[DebuggerNonUserCode]
				get
				{
					return Tag == 1;
				}
			}

			[DynamicDependency(DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicNestedTypes | DynamicallyAccessedMemberTypes.NonPublicNestedTypes | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties, typeof(SyncAction))]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal SyncAction(int _tag)
			{
				this._tag = _tag;
			}

			[SpecialName]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal object __DebugDisplay()
			{
				return ExtraTopLevelOperators.PrintFormatToString<FSharpFunc<SyncAction, string>>((PrintfFormat<FSharpFunc<SyncAction, string>, Unit, string, string>)(object)new PrintfFormat<FSharpFunc<SyncAction, string>, Unit, string, string, string>("%+0.8A")).Invoke(this);
			}

			[CompilerGenerated]
			public override string ToString()
			{
				return ExtraTopLevelOperators.PrintFormatToString<FSharpFunc<SyncAction, string>>((PrintfFormat<FSharpFunc<SyncAction, string>, Unit, string, string>)(object)new PrintfFormat<FSharpFunc<SyncAction, string>, Unit, string, string, SyncAction>("%+A")).Invoke(this);
			}

			[CompilerGenerated]
			public sealed int CompareTo(SyncAction obj)
			{
				if (this != null)
				{
					if (obj != null)
					{
						int tag = _tag;
						int tag2 = obj._tag;
						if (tag == tag2)
						{
							return 0;
						}
						return tag - tag2;
					}
					return 1;
				}
				if (obj != null)
				{
					return -1;
				}
				return 0;
			}

			[CompilerGenerated]
			public sealed int CompareTo(object obj)
			{
				return CompareTo((SyncAction)obj);
			}

			[CompilerGenerated]
			public sealed int CompareTo(object obj, IComparer comp)
			{
				SyncAction syncAction = (SyncAction)obj;
				if (this != null)
				{
					if ((SyncAction)obj != null)
					{
						int tag = _tag;
						int tag2 = syncAction._tag;
						if (tag == tag2)
						{
							return 0;
						}
						return tag - tag2;
					}
					return 1;
				}
				if ((SyncAction)obj != null)
				{
					return -1;
				}
				return 0;
			}

			[CompilerGenerated]
			public sealed int GetHashCode(IEqualityComparer comp)
			{
				return this?._tag ?? 0;
			}

			[CompilerGenerated]
			public sealed override int GetHashCode()
			{
				return GetHashCode(LanguagePrimitives.GenericEqualityComparer);
			}

			[CompilerGenerated]
			public sealed bool Equals(object obj, IEqualityComparer comp)
			{
				if (this != null)
				{
					if (obj is SyncAction syncAction)
					{
						int tag = _tag;
						int tag2 = syncAction._tag;
						return tag == tag2;
					}
					return false;
				}
				return obj == null;
			}

			[CompilerGenerated]
			public sealed bool Equals(SyncAction obj)
			{
				if (this != null)
				{
					if (obj != null)
					{
						int tag = _tag;
						int tag2 = obj._tag;
						return tag == tag2;
					}
					return false;
				}
				return obj == null;
			}

			[CompilerGenerated]
			public sealed override bool Equals(object obj)
			{
				if (obj is SyncAction obj2)
				{
					return Equals(obj2);
				}
				return false;
			}
		}

		[Serializable]
		internal sealed class getConfig@65 : FSharpFunc<Unit, SyncedConfig>
		{
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public SyncedConfig k;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal getConfig@65(SyncedConfig k)
			{
				this.k = k;
			}

			public override SyncedConfig Invoke(Unit _arg1)
			{
				return k;
			}
		}

		[Serializable]
		internal sealed class onReceiveSync@116 : FSharpFunc<Tuple<Return, FSharpResult<Unit, string>>, FSharpFunc<Unit, FSharpResult<Unit, string>>>
		{
			internal static readonly onReceiveSync@116 @_instance = new onReceiveSync@116();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal onReceiveSync@116()
			{
			}

			public override FSharpFunc<Unit, FSharpResult<Unit, string>> Invoke(Tuple<Return, FSharpResult<Unit, string>> tupledArg)
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				return Return.Return<Unit, string>(tupledArg.Item2, tupledArg.Item1);
			}
		}

		[Serializable]
		internal sealed class onReceiveSync@120-1 : FSharpFunc<Tuple<Return, FSharpResult<Unit, string>>, FSharpFunc<Unit, FSharpResult<Unit, string>>>
		{
			internal static readonly onReceiveSync@120-1 @_instance = new onReceiveSync@120-1();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal onReceiveSync@120-1()
			{
			}

			public override FSharpFunc<Unit, FSharpResult<Unit, string>> Invoke(Tuple<Return, FSharpResult<Unit, string>> tupledArg)
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				return Return.Return<Unit, string>(tupledArg.Item2, tupledArg.Item1);
			}
		}

		[Serializable]
		internal sealed class onReceiveSync@124-2 : FSharpFunc<Tuple<Return, FSharpResult<Unit, string>>, FSharpFunc<Unit, FSharpResult<Unit, string>>>
		{
			internal static readonly onReceiveSync@124-2 @_instance = new onReceiveSync@124-2();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal onReceiveSync@124-2()
			{
			}

			public override FSharpFunc<Unit, FSharpResult<Unit, string>> Invoke(Tuple<Return, FSharpResult<Unit, string>> tupledArg)
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				return Return.Return<Unit, string>(tupledArg.Item2, tupledArg.Item1);
			}
		}

		[Serializable]
		internal sealed class callback@135 : FSharpFunc<ulong, FastBufferReader, Unit>
		{
			internal static readonly callback@135 @_instance = new callback@135();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal callback@135()
			{
			}

			public override Unit Invoke(ulong clientId, FastBufferReader arg10@)
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				onRequestSync<FastBufferReader>(clientId, arg10@);
				return null;
			}
		}

		[Serializable]
		internal sealed class callback@136-1 : FSharpFunc<ulong, FastBufferReader, Unit>
		{
			internal static readonly callback@136-1 @_instance = new callback@136-1();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal callback@136-1()
			{
			}

			public override Unit Invoke(ulong arg00@, FastBufferReader reader)
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				onReceiveSync(arg00@, reader);
				return null;
			}
		}

		[Serializable]
		[SpecialName]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal sealed class registerHandler@137
		{
			public FSharpFunc<ulong, FSharpFunc<FastBufferReader, Unit>> callback;

			public registerHandler@137(FSharpFunc<ulong, FSharpFunc<FastBufferReader, Unit>> callback)
			{
				this.callback = callback;
				base..ctor();
			}

			internal void Invoke(ulong delegateArg0, FastBufferReader delegateArg1)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				FSharpFunc<ulong, FastBufferReader>.InvokeFast<Unit>(callback, delegateArg0, delegateArg1);
			}
		}

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static FSharpOption<LocalConfig> localConfig
		{
			get
			{
				return <StartupCode$MirageRevive>.$Mirage.Revive.Domain.Config.localConfig@45;
			}
			set
			{
				<StartupCode$MirageRevive>.$Mirage.Revive.Domain.Config.localConfig@45 = value;
			}
		}

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static FSharpOption<SyncedConfig> syncedConfig
		{
			get
			{
				return <StartupCode$MirageRevive>.$Mirage.Revive.Domain.Config.syncedConfig@46;
			}
			set
			{
				<StartupCode$MirageRevive>.$Mirage.Revive.Domain.Config.syncedConfig@46 = value;
			}
		}

		internal static SyncedConfig toSyncedConfig()
		{
			return new SyncedConfig(localConfig.Value.ReviveChance@.Value, localConfig.Value.ReviveOnlyWhenPlayerAlone@.Value);
		}

		internal static string toNamedMessage(SyncAction _arg1)
		{
			if (_arg1.Tag != 1)
			{
				return PrintfModule.PrintFormatToStringThen<string>((PrintfFormat<string, Unit, string, string>)(object)new PrintfFormat<string, Unit, string, string, string>("%P()_OnRequestConfigSync", new object[1] { "qwbarch.MirageRevive" }, (Type[])null));
			}
			return PrintfModule.PrintFormatToStringThen<string>((PrintfFormat<string, Unit, string, string>)(object)new PrintfFormat<string, Unit, string, string, string>("%P()_OnReceiveConfigSync", new object[1] { "qwbarch.MirageRevive" }, (Type[])null));
		}

		internal static CustomMessagingManager messageManager()
		{
			return NetworkManager.Singleton.CustomMessagingManager;
		}

		internal static bool isClient()
		{
			return NetworkManager.Singleton.IsClient;
		}

		internal static bool isHost()
		{
			return NetworkManager.Singleton.IsHost;
		}

		internal static void initConfig(ConfigFile configFile)
		{
			localConfig = FSharpOption<LocalConfig>.Some(new LocalConfig(configFile));
		}

		public static SyncedConfig getConfig()
		{
			SyncedConfig k = toSyncedConfig();
			FSharpFunc<Unit, SyncedConfig> val = new getConfig@65(k);
			FSharpOption<SyncedConfig> val2 = syncedConfig;
			if (val2 == null)
			{
				return val.Invoke((Unit)null);
			}
			return val2.Value;
		}

		internal static byte[] serializeToBytes<A>(A value)
		{
			DataContractSerializer dataContractSerializer = new DataContractSerializer(typeof(A));
			using MemoryStream memoryStream = new MemoryStream();
			try
			{
				dataContractSerializer.WriteObject(memoryStream, value);
				return memoryStream.ToArray();
			}
			catch (object obj)
			{
				Exception ex = (Exception)obj;
				Logger.logError.Invoke(PrintfModule.PrintFormatToStringThen<string>((PrintfFormat<string, Unit, string, string>)(object)new PrintfFormat<string, Unit, string, string, Exception>("Failed to serialize value: %P()", new object[1] { ex }, (Type[])null)));
				return null;
			}
		}

		internal static A deserializeFromBytes<A>(byte[] data)
		{
			DataContractSerializer dataContractSerializer = new DataContractSerializer(typeof(A));
			using MemoryStream stream = new MemoryStream(data);
			try
			{
				return IntrinsicFunctions.UnboxGeneric<A>(dataContractSerializer.ReadObject(stream));
			}
			catch (object obj)
			{
				Exception ex = (Exception)obj;
				Logger.logError.Invoke(PrintfModule.PrintFormatToStringThen<string>((PrintfFormat<string, Unit, string, string>)(object)new PrintfFormat<string, Unit, string, string, Exception>("Failed to deserialize bytes: %P()", new object[1] { ex }, (Type[])null)));
				A result = default(A);
				return result;
			}
		}

		[CompilationArgumentCounts(new int[] { 1, 1, 1 })]
		internal static void sendMessage(SyncAction action, ulong clientId, FastBufferWriter stream)
		{
			//IL_0016: 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_0029: Unknown result type (might be due to invalid IL or missing references)
			NetworkDelivery val = (NetworkDelivery)((((FastBufferWriter)(ref stream)).Capacity <= 1300) ? 2 : 4);
			NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage(toNamedMessage(action), clientId, stream, val);
		}

		internal static void revertSync()
		{
			syncedConfig = null;
		}

		internal unsafe static void requestSync()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkManager.Singleton.IsClient)
			{
				FastBufferWriter stream = new FastBufferWriter(sizeof(int), (Allocator)2, -1);
				try
				{
					sendMessage(SyncAction.RequestSync, 0uL, stream);
				}
				finally
				{
					((IDisposable)(FastBufferWriter)(ref stream)).Dispose();
				}
			}
		}

		[CompilationArgumentCounts(new int[] { 1, 1 })]
		internal unsafe static void onRequestSync<a>(ulong clientId, a _arg1)
		{
			//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_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkManager.Singleton.IsHost)
			{
				return;
			}
			byte[] array = serializeToBytes(getConfig());
			int num = array.Length;
			FastBufferWriter stream = new FastBufferWriter(num + sizeof(int), (Allocator)2, -1);
			try
			{
				ForPrimitives val = default(ForPrimitives);
				((FastBufferWriter)(ref stream)).WriteValueSafe<int>(ref num, val);
				((FastBufferWriter)(ref stream)).WriteBytesSafe(array, -1, 0);
				sendMessage(SyncAction.ReceiveSync, clientId, stream);
			}
			catch (object obj)
			{
				Exception ex = (Exception)obj;
				Logger.logError.Invoke(PrintfModule.PrintFormatToStringThen<string>((PrintfFormat<string, Unit, string, string>)(object)new PrintfFormat<string, Unit, string, string, Exception>("Failed during onRequestSync: %P()", new object[1] { ex }, (Type[])null)));
			}
			finally
			{
				((IDisposable)(FastBufferWriter)(ref stream)).Dispose();
			}
		}

		[CompilerGenerated]
		internal static FSharpResult<Unit, string> f@1-1(FastBufferReader reader, FSharpRef<int> bytesLength, Unit unitVar0)
		{
			//IL_003b: 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)
			byte[] array = ArrayModule.ZeroCreate<byte>(bytesLength.contents);
			((FastBufferReader)(ref reader)).ReadBytesSafe(ref new FSharpRef<byte[]>(array).contents@, bytesLength.contents, 0);
			syncedConfig = FSharpOption<SyncedConfig>.Some(deserializeFromBytes<SyncedConfig>(array));
			FSharpResult<Unit, string> item = default(FSharpResult<Unit, string>);
			return FSharpFunc<Tuple<Return, FSharpResult<Unit, string>>, Unit>.InvokeFast<FSharpResult<Unit, string>>((FSharpFunc<Tuple<Return, FSharpResult<Unit, string>>, FSharpFunc<Unit, FSharpResult<Unit, string>>>)onReceiveSync@124-2.@_instance, new Tuple<Return, FSharpResult<Unit, string>>(null, item), (Unit)null);
		}

		[CompilerGenerated]
		internal static FSharpResult<Unit, string> f@1(FastBufferReader reader, Unit unitVar0)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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)
			//IL_004d: 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_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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)
			FSharpRef<int> val = new FSharpRef<int>(0);
			ForPrimitives val2 = default(ForPrimitives);
			((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref val.contents@, val2);
			FSharpResult<Unit, string> item = default(FSharpResult<Unit, string>);
			FSharpResult<Unit, string> val3 = (((FastBufferReader)(ref reader)).TryBeginRead(val.contents) ? FSharpFunc<Tuple<Return, FSharpResult<Unit, string>>, Unit>.InvokeFast<FSharpResult<Unit, string>>((FSharpFunc<Tuple<Return, FSharpResult<Unit, string>>, FSharpFunc<Unit, FSharpResult<Unit, string>>>)onReceiveSync@120-1.@_instance, new Tuple<Return, FSharpResult<Unit, string>>(null, item), (Unit)null) : FSharpResult<Unit, string>.NewError("onReceiveSync failed. Host could not synchronize config."));
			Bind val4 = null;
			FSharpResult<Unit, string> val5 = default(FSharpResult<Unit, string>);
			item = val5;
			if (val3.Tag != 0)
			{
				return FSharpResult<Unit, string>.NewError(val3.ErrorValue);
			}
			return f@1-1(reader, val, val3.ResultValue);
		}

		[CompilationArgumentCounts(new int[] { 1, 1 })]
		internal unsafe static void onReceiveSync<a>(a _arg1, FastBufferReader reader)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkManager.Singleton.IsHost)
			{
				MonadFxStrictBuilder<FSharpResult<Unit, string>> val = new MonadFxStrictBuilder<FSharpResult<Unit, string>>();
				FSharpResult<Unit, string> item = default(FSharpResult<Unit, string>);
				FSharpResult<Unit, string> val2 = (((FastBufferReader)(ref reader)).TryBeginRead(sizeof(int)) ? FSharpFunc<Tuple<Return, FSharpResult<Unit, string>>, Unit>.InvokeFast<FSharpResult<Unit, string>>((FSharpFunc<Tuple<Return, FSharpResult<Unit, string>>, FSharpFunc<Unit, FSharpResult<Unit, string>>>)onReceiveSync@116.@_instance, new Tuple<Return, FSharpResult<Unit, string>>(null, item), (Unit)null) : FSharpResult<Unit, string>.NewError("onReceiveSync failed while reading beginning of buffer."));
				Bind val3 = null;
				FSharpResult<Unit, string> val4 = default(FSharpResult<Unit, string>);
				item = val4;
				FSharpResult<Unit, string> val5 = ((val2.Tag == 0) ? f@1(reader, val2.ResultValue) : FSharpResult<Unit, string>.NewError(val2.ErrorValue));
				if (val5.Tag == 1)
				{
					Logger.logError.Invoke(val5.ErrorValue);
				}
			}
		}

		internal static void registerHandler(SyncAction action)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Expected O, but got Unknown
			string text = toNamedMessage(action);
			object @_instance;
			if (action.Tag != 1)
			{
				syncedConfig = FSharpOption<SyncedConfig>.Some(toSyncedConfig());
				@_instance = callback@135.@_instance;
			}
			else
			{
				@_instance = callback@136-1.@_instance;
			}
			FSharpFunc<ulong, FSharpFunc<FastBufferReader, Unit>> callback = (FSharpFunc<ulong, FSharpFunc<FastBufferReader, Unit>>)@_instance;
			HandleNamedMessageDelegate val = new HandleNamedMessageDelegate(new registerHandler@137(callback).Invoke);
			NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler(text, val);
		}
	}
}
namespace <StartupCode$MirageRevive>.$Mirage.Revive.Domain
{
	internal static class Config
	{
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static FSharpOption<Mirage.Revive.Domain.Config.LocalConfig> localConfig@45;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static FSharpOption<Mirage.Revive.Domain.Config.SyncedConfig> syncedConfig@46;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal static int init@;

		static Config()
		{
			localConfig@45 = null;
			syncedConfig@46 = null;
		}
	}
}
namespace Mirage.Revive.Domain
{
	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static class Logger
	{
		[Serializable]
		[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
		[DebuggerDisplay("{__DebugDisplay(),nq}")]
		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal sealed class LogType : IEquatable<LogType>, IStructuralEquatable, IComparable<LogType>, IComparable, IStructuralComparable
		{
			internal static class Tags
			{
				public const int LogInfo = 0;

				public const int LogDebug = 1;

				public const int LogWarning = 2;

				public const int LogError = 3;
			}

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal static readonly LogType _unique_LogInfo = new LogType(0);

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal static readonly LogType _unique_LogDebug = new LogType(1);

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal static readonly LogType _unique_LogWarning = new LogType(2);

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal static readonly LogType _unique_LogError = new LogType(3);

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[field: DebuggerNonUserCode]
			internal int Tag
			{
				[DebuggerNonUserCode]
				get;
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			internal static LogType LogInfo
			{
				[CompilationMapping(/*Could not decode attribute arguments.*/)]
				get
				{
					return _unique_LogInfo;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			internal bool IsLogInfo
			{
				[CompilerGenerated]
				[DebuggerNonUserCode]
				get
				{
					return Tag == 0;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			internal static LogType LogDebug
			{
				[CompilationMapping(/*Could not decode attribute arguments.*/)]
				get
				{
					return _unique_LogDebug;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			internal bool IsLogDebug
			{
				[CompilerGenerated]
				[DebuggerNonUserCode]
				get
				{
					return Tag == 1;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			internal static LogType LogWarning
			{
				[CompilationMapping(/*Could not decode attribute arguments.*/)]
				get
				{
					return _unique_LogWarning;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			internal bool IsLogWarning
			{
				[CompilerGenerated]
				[DebuggerNonUserCode]
				get
				{
					return Tag == 2;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			internal static LogType LogError
			{
				[CompilationMapping(/*Could not decode attribute arguments.*/)]
				get
				{
					return _unique_LogError;
				}
			}

			[CompilerGenerated]
			[DebuggerNonUserCode]
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			internal bool IsLogError
			{
				[CompilerGenerated]
				[DebuggerNonUserCode]
				get
				{
					return Tag == 3;
				}
			}

			[DynamicDependency(DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicNestedTypes | DynamicallyAccessedMemberTypes.NonPublicNestedTypes | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties, typeof(LogType))]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal LogType(int _tag)
			{
				this._tag = _tag;
			}

			[SpecialName]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal object __DebugDisplay()
			{
				return ExtraTopLevelOperators.PrintFormatToString<FSharpFunc<LogType, string>>((PrintfFormat<FSharpFunc<LogType, string>, Unit, string, string>)(object)new PrintfFormat<FSharpFunc<LogType, string>, Unit, string, string, string>("%+0.8A")).Invoke(this);
			}

			[CompilerGenerated]
			public override string ToString()
			{
				return ExtraTopLevelOperators.PrintFormatToString<FSharpFunc<LogType, string>>((PrintfFormat<FSharpFunc<LogType, string>, Unit, string, string>)(object)new PrintfFormat<FSharpFunc<LogType, string>, Unit, string, string, LogType>("%+A")).Invoke(this);
			}

			[CompilerGenerated]
			public sealed int CompareTo(LogType obj)
			{
				if (this != null)
				{
					if (obj != null)
					{
						int tag = _tag;
						int tag2 = obj._tag;
						if (tag == tag2)
						{
							return 0;
						}
						return tag - tag2;
					}
					return 1;
				}
				if (obj != null)
				{
					return -1;
				}
				return 0;
			}

			[CompilerGenerated]
			public sealed int CompareTo(object obj)
			{
				return CompareTo((LogType)obj);
			}

			[CompilerGenerated]
			public sealed int CompareTo(object obj, IComparer comp)
			{
				LogType logType = (LogType)obj;
				if (this != null)
				{
					if ((LogType)obj != null)
					{
						int tag = _tag;
						int tag2 = logType._tag;
						if (tag == tag2)
						{
							return 0;
						}
						return tag - tag2;
					}
					return 1;
				}
				if ((LogType)obj != null)
				{
					return -1;
				}
				return 0;
			}

			[CompilerGenerated]
			public sealed int GetHashCode(IEqualityComparer comp)
			{
				return this?._tag ?? 0;
			}

			[CompilerGenerated]
			public sealed override int GetHashCode()
			{
				return GetHashCode(LanguagePrimitives.GenericEqualityComparer);
			}

			[CompilerGenerated]
			public sealed bool Equals(object obj, IEqualityComparer comp)
			{
				if (this != null)
				{
					if (obj is LogType logType)
					{
						int tag = _tag;
						int tag2 = logType._tag;
						return tag == tag2;
					}
					return false;
				}
				return obj == null;
			}

			[CompilerGenerated]
			public sealed bool Equals(LogType obj)
			{
				if (this != null)
				{
					if (obj != null)
					{
						int tag = _tag;
						int tag2 = obj._tag;
						return tag == tag2;
					}
					return false;
				}
				return obj == null;
			}

			[CompilerGenerated]
			public sealed override bool Equals(object obj)
			{
				if (obj is LogType obj2)
				{
					return Equals(obj2);
				}
				return false;
			}
		}

		[Serializable]
		internal sealed class channel@21-4 : FSharpFunc<string, Unit>
		{
			public ManualLogSource logger;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@21-4(ManualLogSource logger)
			{
				this.logger = logger;
			}

			public override Unit Invoke(string data)
			{
				logger.LogInfo((object)data);
				return null;
			}
		}

		[Serializable]
		internal sealed class channel@22-5 : FSharpFunc<string, Unit>
		{
			public ManualLogSource logger;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@22-5(ManualLogSource logger)
			{
				this.logger = logger;
			}

			public override Unit Invoke(string data)
			{
				logger.LogDebug((object)data);
				return null;
			}
		}

		[Serializable]
		internal sealed class channel@23-6 : FSharpFunc<string, Unit>
		{
			public ManualLogSource logger;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@23-6(ManualLogSource logger)
			{
				this.logger = logger;
			}

			public override Unit Invoke(string data)
			{
				logger.LogWarning((object)data);
				return null;
			}
		}

		[Serializable]
		internal sealed class channel@24-7 : FSharpFunc<string, Unit>
		{
			public ManualLogSource logger;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@24-7(ManualLogSource logger)
			{
				this.logger = logger;
			}

			public override Unit Invoke(string data)
			{
				logger.LogError((object)data);
				return null;
			}
		}

		[Serializable]
		internal sealed class channel@26-9 : FSharpFunc<AsyncActivation<Unit>, AsyncReturn>
		{
			internal static readonly channel@26-9 @_instance = new channel@26-9();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@26-9()
			{
			}

			public override AsyncReturn Invoke(AsyncActivation<Unit> ctxt)
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				return AsyncActivation<Unit>.Success(ctxt, (Unit)null);
			}
		}

		[Serializable]
		internal sealed class channel@26-8 : FSharpFunc<Unit, FSharpAsync<Unit>>
		{
			internal static readonly channel@26-8 @_instance = new channel@26-8();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@26-8()
			{
			}

			public override FSharpAsync<Unit> Invoke(Unit _arg2)
			{
				return AsyncPrimitives.MakeAsync<Unit>((FSharpFunc<AsyncActivation<Unit>, AsyncReturn>)channel@26-9.@_instance);
			}
		}

		[Serializable]
		internal sealed class channel@26-10 : FSharpFunc<AsyncActivation<Unit>, AsyncReturn>
		{
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public FSharpAsync<Unit> computation;

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public FSharpFunc<Unit, FSharpAsync<Unit>> binder;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@26-10(FSharpAsync<Unit> computation, FSharpFunc<Unit, FSharpAsync<Unit>> binder)
			{
				this.computation = computation;
				this.binder = binder;
			}

			public override AsyncReturn Invoke(AsyncActivation<Unit> ctxt)
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				return AsyncPrimitives.Bind<Unit, Unit>(ctxt, computation, binder);
			}
		}

		[Serializable]
		internal sealed class channel@19-3 : FSharpFunc<(LogType, string), FSharpAsync<Unit>>
		{
			public ManualLogSource logger;

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public Lazy<FSharpAsync<Unit>> consumer;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@19-3(ManualLogSource logger, Lazy<FSharpAsync<Unit>> consumer)
			{
				this.logger = logger;
				this.consumer = consumer;
			}

			public override FSharpAsync<Unit> Invoke((LogType, string) _arg1)
			{
				string item = _arg1.Item2;
				var (logType, _) = _arg1;
				((FSharpFunc<string, Unit>)(logType.Tag switch
				{
					1 => new channel@22-5(logger), 
					2 => new channel@23-6(logger), 
					3 => new channel@24-7(logger), 
					_ => new channel@21-4(logger), 
				})).Invoke(item);
				FSharpAsync<Unit> value = consumer.Value;
				FSharpFunc<Unit, FSharpAsync<Unit>> @_instance;
				@_instance = channel@26-8.@_instance;
				return AsyncPrimitives.MakeAsync<Unit>((FSharpFunc<AsyncActivation<Unit>, AsyncReturn>)new channel@26-10(value, @_instance));
			}
		}

		[Serializable]
		internal sealed class channel@18-11 : FSharpFunc<AsyncActivation<Unit>, AsyncReturn>
		{
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public FSharpAsync<(LogType, string)> computation;

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public FSharpFunc<(LogType, string), FSharpAsync<Unit>> binder;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@18-11(FSharpAsync<(LogType, string)> computation, FSharpFunc<(LogType, string), FSharpAsync<Unit>> binder)
			{
				this.computation = computation;
				this.binder = binder;
			}

			public override AsyncReturn Invoke(AsyncActivation<Unit> ctxt)
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				return AsyncPrimitives.Bind<Unit, (LogType, string)>(ctxt, computation, binder);
			}
		}

		[Serializable]
		internal sealed class channel@18-2 : FSharpFunc<Unit, FSharpAsync<Unit>>
		{
			public ManualLogSource logger;

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public Lazy<FSharpAsync<Unit>> consumer;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@18-2(ManualLogSource logger, Lazy<FSharpAsync<Unit>> consumer)
			{
				this.logger = logger;
				this.consumer = consumer;
			}

			public override FSharpAsync<Unit> Invoke(Unit unitVar)
			{
				FSharpAsync<(LogType, string)> computation = self@13.AsyncGet((FSharpOption<int>)null);
				FSharpFunc<(LogType, string), FSharpAsync<Unit>> binder = new channel@19-3(logger, consumer);
				return AsyncPrimitives.MakeAsync<Unit>((FSharpFunc<AsyncActivation<Unit>, AsyncReturn>)new channel@18-11(computation, binder));
			}
		}

		[Serializable]
		internal sealed class channel@16-1 : FSharpFunc<Unit, FSharpAsync<Unit>>
		{
			public ManualLogSource logger;

			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public Lazy<FSharpAsync<Unit>> consumer;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@16-1(ManualLogSource logger, Lazy<FSharpAsync<Unit>> consumer)
			{
				this.logger = logger;
				this.consumer = consumer;
			}

			public override FSharpAsync<Unit> Invoke(Unit unitVar)
			{
				return ExtraTopLevelOperators.DefaultAsyncBuilder.Delay<Unit>((FSharpFunc<Unit, FSharpAsync<Unit>>)new channel@18-2(logger, consumer));
			}
		}

		[Serializable]
		internal sealed class channel@15 : FSharpFunc<Unit, FSharpAsync<Unit>>
		{
			internal static readonly channel@15 @_instance = new channel@15();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal channel@15()
			{
			}

			public override FSharpAsync<Unit> Invoke(Unit unitVar)
			{
				ManualLogSource logger = Logger.CreateLogSource("qwbarch.MirageRevive");
				Lazy<FSharpAsync<Unit>> consumer = default(Lazy<FSharpAsync<Unit>>);
				FSharpFunc<Unit, FSharpAsync<Unit>> val = new channel@16-1(logger, consumer);
				consumer = LazyExtensions.Create<FSharpAsync<Unit>>(val);
				((channel@16-1)val).consumer = consumer;
				FSharpAsync<Unit> value = consumer.Value;
				FSharpAsync.StartImmediate(value, (FSharpOption<CancellationToken>)null);
				return ExtraTopLevelOperators.DefaultAsyncBuilder.Zero();
			}
		}

		[Serializable]
		internal sealed class logInfo@35 : FSharpFunc<string, Unit>
		{
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public LogType logType;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal logInfo@35(LogType logType)
			{
				this.logType = logType;
			}

			public override Unit Invoke(string message)
			{
				logMessage(logType, message);
				return null;
			}
		}

		[Serializable]
		internal sealed class logDebug@36 : FSharpFunc<string, Unit>
		{
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public LogType logType;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal logDebug@36(LogType logType)
			{
				this.logType = logType;
			}

			public override Unit Invoke(string message)
			{
				logMessage(logType, message);
				return null;
			}
		}

		[Serializable]
		internal sealed class logWarning@37 : FSharpFunc<string, Unit>
		{
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public LogType logType;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal logWarning@37(LogType logType)
			{
				this.logType = logType;
			}

			public override Unit Invoke(string message)
			{
				logMessage(logType, message);
				return null;
			}
		}

		[Serializable]
		internal sealed class logError@38 : FSharpFunc<string, Unit>
		{
			[DebuggerBrowsable(DebuggerBrowsableState.Never)]
			[CompilerGenerated]
			[DebuggerNonUserCode]
			public LogType logType;

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal logError@38(LogType logType)
			{
				this.logType = logType;
			}

			public override Unit Invoke(string message)
			{
				logMessage(logType, message);
				return null;
			}
		}

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static BlockingQueueAgent<(LogType, string)> channel => <StartupCode$MirageRevive>.$Mirage.Revive.Domain.Logger.channel@12;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static BlockingQueueAgent<(LogType, string)> self@13 => <StartupCode$MirageRevive>.$Mirage.Revive.Domain.Logger.self@13;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static FSharpAsync<Unit> arg1@1 => <StartupCode$MirageRevive>.$Mirage.Revive.Domain.Logger.arg1@1;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static FSharpFunc<string, Unit> logInfo => <StartupCode$MirageRevive>.$Mirage.Revive.Domain.Logger.logInfo@35;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static FSharpFunc<string, Unit> logDebug => <StartupCode$MirageRevive>.$Mirage.Revive.Domain.Logger.logDebug@36;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static FSharpFunc<string, Unit> logWarning => <StartupCode$MirageRevive>.$Mirage.Revive.Domain.Logger.logWarning@37;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		internal static FSharpFunc<string, Unit> logError => <StartupCode$MirageRevive>.$Mirage.Revive.Domain.Logger.logError@38;

		[CompilationArgumentCounts(new int[] { 1, 1 })]
		internal static void logMessage(LogType logType, string message)
		{
			(LogType, string) tuple = (logType, message);
			FSharpAsync<Unit> val = channel.AsyncAdd(tuple, (FSharpOption<int>)null);
			FSharpAsync.StartImmediate(val, (FSharpOption<CancellationToken>)null);
		}
	}
}
namespace <StartupCode$MirageRevive>.$Mirage.Revive.Domain
{
	internal static class Logger
	{
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static readonly BlockingQueueAgent<(Mirage.Revive.Domain.Logger.LogType, string)> channel@12;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static readonly BlockingQueueAgent<(Mirage.Revive.Domain.Logger.LogType, string)> self@13;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static readonly FSharpAsync<Unit> arg1@1;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static readonly FSharpFunc<string, Unit> logInfo@35;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static readonly FSharpFunc<string, Unit> logDebug@36;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static readonly FSharpFunc<string, Unit> logWarning@37;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal static readonly FSharpFunc<string, Unit> logError@38;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal static int init@;

		static Logger()
		{
			self@13 = new BlockingQueueAgent<(Mirage.Revive.Domain.Logger.LogType, string)>(int.MaxValue);
			arg1@1 = ExtraTopLevelOperators.DefaultAsyncBuilder.Delay<Unit>((FSharpFunc<Unit, FSharpAsync<Unit>>)Mirage.Revive.Domain.Logger.channel@15.@_instance);
			FSharpAsync.Start(Mirage.Revive.Domain.Logger.arg1@1, (FSharpOption<CancellationToken>)null);
			channel@12 = Mirage.Revive.Domain.Logger.self@13;
			Mirage.Revive.Domain.Logger.LogType logInfo = Mirage.Revive.Domain.Logger.LogType.LogInfo;
			logInfo@35 = new Mirage.Revive.Domain.Logger.logInfo@35(logInfo);
			logInfo = Mirage.Revive.Domain.Logger.LogType.LogDebug;
			logDebug@36 = new Mirage.Revive.Domain.Logger.logDebug@36(logInfo);
			logInfo = Mirage.Revive.Domain.Logger.LogType.LogWarning;
			logWarning@37 = new Mirage.Revive.Domain.Logger.logWarning@37(logInfo);
			logInfo = Mirage.Revive.Domain.Logger.LogType.LogError;
			logError@38 = new Mirage.Revive.Domain.Logger.logError@38(logInfo);
		}
	}
}
namespace Mirage.Revive.Domain
{
	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static class Netcode
	{
		[Serializable]
		internal sealed class initNetcodePatcher@41 : FSharpFunc<Type, MethodInfo[]>
		{
			internal static readonly initNetcodePatcher@41 @_instance = new initNetcodePatcher@41();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal initNetcodePatcher@41()
			{
			}

			public override MethodInfo[] Invoke(Type _arg1)
			{
				return _arg1.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
			}
		}

		[Serializable]
		internal sealed class initNetcodePatcher@41-1 : FSharpFunc<MethodInfo, Unit>
		{
			internal static readonly initNetcodePatcher@41-1 @_instance = new initNetcodePatcher@41-1();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal initNetcodePatcher@41-1()
			{
			}

			public override Unit Invoke(MethodInfo method)
			{
				invokeMethod(method);
				return null;
			}
		}

		[Literal]
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		internal const BindingFlags flags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic;

		internal static void invokeMethod(MethodInfo method)
		{
			object[] customAttributes = method.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
			if (customAttributes.Length > 0)
			{
				object obj = method.Invoke(null, null);
			}
		}

		public static void initNetcodePatcher()
		{
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			FSharpFunc<Type, MethodInfo[]> @_instance;
			@_instance = initNetcodePatcher@41.@_instance;
			Bind val = null;
			MethodInfo[] array = null;
			MethodInfo[] array2 = ArrayModule.Collect<Type, MethodInfo>(@_instance, types);
			Iterate val2 = null;
			Iterate.Iterate<MethodInfo>(array2, (FSharpFunc<MethodInfo, Unit>)initNetcodePatcher@41-1.@_instance);
		}
	}
}
namespace <StartupCode$MirageRevive>.$Mirage.Revive.Domain
{
	internal static class Netcode
	{
	}
}
namespace Mirage.Revive
{
	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static class Compatibility
	{
		[Serializable]
		internal sealed class initLobbyCompatibility@14 : FSharpFunc<Unit, FSharpAsync<Unit>>
		{
			internal static readonly initLobbyCompatibility@14 @_instance = new initLobbyCompatibility@14();

			[CompilerGenerated]
			[DebuggerNonUserCode]
			internal initLobbyCompatibility@14()
			{
			}

			public override FSharpAsync<Unit> Invoke(Unit unitVar)
			{
				PluginHelper.RegisterPlugin("MirageRevive", Version.Parse("1.0.0"), (CompatibilityLevel)2, (VersionStrictness)2);
				return ExtraTopLevelOperators.DefaultAsyncBuilder.Zero();
			}
		}

		public static void initLobbyCompatibility()
		{
			if (Chainloader.PluginInfos.ContainsKey("BMX.LobbyCompatibility"))
			{
				FSharpAsync<Unit> val = ExtraTopLevelOperators.DefaultAsyncBuilder.Delay<Unit>((FSharpFunc<Unit, FSharpAsync<Unit>>)initLobbyCompatibility@14.@_instance);
				FSharpAsync.RunSynchronously<Unit>(val, (FSharpOption<int>)null, (FSharpOption<CancellationToken>)null);
			}
		}
	}
}
namespace <StartupCode$MirageRevive>.$Mirage.Revive
{
	internal static class Compatibility
	{
	}
}
namespace Mirage.Revive
{
	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static class PluginInfo
	{
		[Literal]
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		public const string pluginName = "MirageRevive";

		[Literal]
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		public const string pluginId = "qwbarch.MirageRevive";

		[Literal]
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		public const string pluginVersion = "1.0.0";
	}
}
namespace <StartupCode$MirageRevive>.$Mirage.Revive
{
	internal static class PluginInfo
	{
	}
}
[CompilationMapping(/*Could not decode attribute arguments.*/)]
public static class AssemblyInfo
{
}
namespace <StartupCode$MirageRevive>
{
	internal static class $AssemblyInfo
	{
	}
}
namespace <StartupCode$MirageRevive>.$MirageRevive
{
	internal static class AssemblyInfo
	{
	}
}
namespace <StartupCode$MirageRevive>.$.NETStandard,Version=v2.1
{
	internal static class AssemblyAttributes
	{
	}
}
namespace System.Diagnostics.CodeAnalysis
{
	[Serializable]
	[Flags]
	[CompilerGenerated]
	[DebuggerNonUserCode]
	internal enum DynamicallyAccessedMemberTypes
	{
		All = -1,
		None = 0,
		PublicParameterlessConstructor = 1,
		PublicConstructors = 3,
		NonPublicConstructors = 4,
		PublicMethods = 8,
		NonPublicMethods = 0x10,
		PublicFields = 0x20,
		NonPublicFields = 0x40,
		PublicNestedTypes = 0x80,
		NonPublicNestedTypes = 0x100,
		PublicProperties = 0x200,
		NonPublicProperties = 0x400,
		PublicEvents = 0x800,
		NonPublicEvents = 0x1000,
		Interfaces = 0x2000
	}
	[CompilerGenerated]
	internal class DynamicDependencyAttribute : Attribute
	{
		[CompilerGenerated]
		[DebuggerNonUserCode]
		private DynamicallyAccessedMemberTypes MemberType@;

		[CompilerGenerated]
		[DebuggerNonUserCode]
		private Type Type@;

		[CompilerGenerated]
		[DebuggerNonUserCode]
		public DynamicallyAccessedMemberTypes MemberType
		{
			[CompilerGenerated]
			[DebuggerNonUserCode]
			get
			{
				return MemberType@;
			}
		}

		[CompilerGenerated]
		[DebuggerNonUserCode]
		public Type Type
		{
			[CompilerGenerated]
			[DebuggerNonUserCode]
			get
			{
				return Type@;
			}
		}

		[CompilerGenerated]
		[DebuggerNonUserCode]
		public DynamicDependencyAttribute(DynamicallyAccessedMemberTypes MemberType, Type Type)
		{
			MemberType@ = MemberType;
			Type@ = Type;
		}
	}
}
namespace MirageRevive.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}