Decompiled source of OdinOnDemand v1.2.5

BepInEx/plugins/LibVLCSharp.dll

Decompiled 3 days ago
#define TRACE
using System;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Resources;
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 System.Threading.Tasks;
using LibVLCSharp.Shared.Helpers;
using LibVLCSharp.Shared.Structures;
using Microsoft.CodeAnalysis;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: InternalsVisibleTo("LibVLCSharp.Forms")]
[assembly: InternalsVisibleTo("LibVLCSharp.MAUI")]
[assembly: InternalsVisibleTo("LibVLCSharp.Uno")]
[assembly: InternalsVisibleTo("LibVLCSharp.Tests")]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("VideoLAN")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("LibVLCSharp is a cross-platform audio and video API for .NET platforms based on VideoLAN's LibVLC Library. It provides a comprehensive multimedia API that can be used across mobile, server and desktop to render video and output audio. Mono, .NET Framework and .NET Core runtimes are supported.\n\nThis package contains the core features of LibVLCSharp (libvlc loading and initialization, .NET-friendly classes to ease the use of libvlc...). All other `LibVLCSharp.*` packages depend on this one.\nFeatures:\n- Play every media file formats, every codec and every streaming protocols\n- Run on every platform, from desktop (Windows, Linux, Mac) to mobile (Android, iOS) and TVs\n- Hardware and efficient decoding on every platform, up to 8K\n- Network browsing for distant filesystems (SMB, FTP, SFTP, NFS...) and servers (UPnP, DLNA)\n- Playback of Audio CD, DVD and Bluray with menu navigation\n- Support for HDR, including tonemapping for SDR streams\n- Audio passthrough with SPDIF and HDMI, including for Audio HD codecs, like DD+, TrueHD or DTS-HD\n- Support for video and audio filters\n- Support for 360 video and 3D audio playback, including Ambisonics\n- Able to cast and stream to distant renderers, like Chromecast and UPnP renderers.\n\nThis package also contains the views for the following platforms:\n\n- Android\n- iOS\n- Mac\n- tvOS\n\nIf you need Xamarin.Forms support, see LibVLCSharp.Forms. \n\nLibVLC needs to be installed separately, see VideoLAN.LibVLC.* packages.")]
[assembly: AssemblyFileVersion("3.10.1.0")]
[assembly: AssemblyInformationalVersion("3.10.1+4896d0e06d19ac40b46802cf7dc167d432f3fd63")]
[assembly: AssemblyProduct("LibVLCSharp")]
[assembly: AssemblyTitle("LibVLCSharp")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://code.videolan.org/videolan/LibVLCSharp")]
[assembly: NeutralResourcesLanguage("en")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("3.10.1.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class IsReadOnlyAttribute : Attribute
	{
	}
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace FontAwesome
{
	internal static class FontAwesomeIcons
	{
		public const string FiveHundredPX = "\uf26e";

		public const string Abacus = "\uf640";

		public const string AccessibleIcon = "\uf368";

		public const string Accusoft = "\uf369";

		public const string Acorn = "\uf6ae";

		public const string AcquisitionsIncorporated = "\uf6af";

		public const string Ad = "\uf641";

		public const string AddressBook = "\uf2b9";

		public const string AddressCard = "\uf2bb";

		public const string Adjust = "\uf042";

		public const string Adn = "\uf170";

		public const string Adversal = "\uf36a";

		public const string Affiliatetheme = "\uf36b";

		public const string AirFreshener = "\uf5d0";

		public const string AlarmClock = "\uf34e";

		public const string Algolia = "\uf36c";

		public const string Alicorn = "\uf6b0";

		public const string AlignCenter = "\uf037";

		public const string AlignJustify = "\uf039";

		public const string AlignLeft = "\uf036";

		public const string AlignRight = "\uf038";

		public const string Alipay = "\uf642";

		public const string Allergies = "\uf461";

		public const string Amazon = "\uf270";

		public const string AmazonPay = "\uf42c";

		public const string Ambulance = "\uf0f9";

		public const string AmericanSignLanguageInterpreting = "\uf2a3";

		public const string Amilia = "\uf36d";

		public const string Analytics = "\uf643";

		public const string Anchor = "\uf13d";

		public const string Android = "\uf17b";

		public const string Angellist = "\uf209";

		public const string AngleDoubleDown = "\uf103";

		public const string AngleDoubleLeft = "\uf100";

		public const string AngleDoubleRight = "\uf101";

		public const string AngleDoubleUp = "\uf102";

		public const string AngleDown = "\uf107";

		public const string AngleLeft = "\uf104";

		public const string AngleRight = "\uf105";

		public const string AngleUp = "\uf106";

		public const string Angry = "\uf556";

		public const string Angrycreative = "\uf36e";

		public const string Angular = "\uf420";

		public const string Ankh = "\uf644";

		public const string AppStore = "\uf36f";

		public const string AppStoreIos = "\uf370";

		public const string Apper = "\uf371";

		public const string Apple = "\uf179";

		public const string AppleAlt = "\uf5d1";

		public const string AppleCrate = "\uf6b1";

		public const string ApplePay = "\uf415";

		public const string Archive = "\uf187";

		public const string Archway = "\uf557";

		public const string ArrowAltCircleDown = "\uf358";

		public const string ArrowAltCircleLeft = "\uf359";

		public const string ArrowAltCircleRight = "\uf35a";

		public const string ArrowAltCircleUp = "\uf35b";

		public const string ArrowAltDown = "\uf354";

		public const string ArrowAltFromBottom = "\uf346";

		public const string ArrowAltFromLeft = "\uf347";

		public const string ArrowAltFromRight = "\uf348";

		public const string ArrowAltFromTop = "\uf349";

		public const string ArrowAltLeft = "\uf355";

		public const string ArrowAltRight = "\uf356";

		public const string ArrowAltSquareDown = "\uf350";

		public const string ArrowAltSquareLeft = "\uf351";

		public const string ArrowAltSquareRight = "\uf352";

		public const string ArrowAltSquareUp = "\uf353";

		public const string ArrowAltToBottom = "\uf34a";

		public const string ArrowAltToLeft = "\uf34b";

		public const string ArrowAltToRight = "\uf34c";

		public const string ArrowAltToTop = "\uf34d";

		public const string ArrowAltUp = "\uf357";

		public const string ArrowCircleDown = "\uf0ab";

		public const string ArrowCircleLeft = "\uf0a8";

		public const string ArrowCircleRight = "\uf0a9";

		public const string ArrowCircleUp = "\uf0aa";

		public const string ArrowDown = "\uf063";

		public const string ArrowFromBottom = "\uf342";

		public const string ArrowFromLeft = "\uf343";

		public const string ArrowFromRight = "\uf344";

		public const string ArrowFromTop = "\uf345";

		public const string ArrowLeft = "\uf060";

		public const string ArrowRight = "\uf061";

		public const string ArrowSquareDown = "\uf339";

		public const string ArrowSquareLeft = "\uf33a";

		public const string ArrowSquareRight = "\uf33b";

		public const string ArrowSquareUp = "\uf33c";

		public const string ArrowToBottom = "\uf33d";

		public const string ArrowToLeft = "\uf33e";

		public const string ArrowToRight = "\uf340";

		public const string ArrowToTop = "\uf341";

		public const string ArrowUp = "\uf062";

		public const string Arrows = "\uf047";

		public const string ArrowsAlt = "\uf0b2";

		public const string ArrowsAltH = "\uf337";

		public const string ArrowsAltV = "\uf338";

		public const string ArrowsH = "\uf07e";

		public const string ArrowsV = "\uf07d";

		public const string AssistiveListeningSystems = "\uf2a2";

		public const string Asterisk = "\uf069";

		public const string Asymmetrik = "\uf372";

		public const string At = "\uf1fa";

		public const string Atlas = "\uf558";

		public const string Atom = "\uf5d2";

		public const string AtomAlt = "\uf5d3";

		public const string Audible = "\uf373";

		public const string AudioDescription = "\uf29e";

		public const string Autoprefixer = "\uf41c";

		public const string Avianex = "\uf374";

		public const string Aviato = "\uf421";

		public const string Award = "\uf559";

		public const string Aws = "\uf375";

		public const string Axe = "\uf6b2";

		public const string AxeBattle = "\uf6b3";

		public const string Backpack = "\uf5d4";

		public const string Backspace = "\uf55a";

		public const string Backward = "\uf04a";

		public const string Badge = "\uf335";

		public const string BadgeCheck = "\uf336";

		public const string BadgeDollar = "\uf645";

		public const string BadgePercent = "\uf646";

		public const string BadgerHoney = "\uf6b4";

		public const string BalanceScale = "\uf24e";

		public const string BalanceScaleLeft = "\uf515";

		public const string BalanceScaleRight = "\uf516";

		public const string Ballot = "\uf732";

		public const string BallotCheck = "\uf733";

		public const string Ban = "\uf05e";

		public const string BandAid = "\uf462";

		public const string Bandcamp = "\uf2d5";

		public const string Barcode = "\uf02a";

		public const string BarcodeAlt = "\uf463";

		public const string BarcodeRead = "\uf464";

		public const string BarcodeScan = "\uf465";

		public const string Bars = "\uf0c9";

		public const string Baseball = "\uf432";

		public const string BaseballBall = "\uf433";

		public const string BasketballBall = "\uf434";

		public const string BasketballHoop = "\uf435";

		public const string Bat = "\uf6b5";

		public const string Bath = "\uf2cd";

		public const string BatteryBolt = "\uf376";

		public const string BatteryEmpty = "\uf244";

		public const string BatteryFull = "\uf240";

		public const string BatteryHalf = "\uf242";

		public const string BatteryQuarter = "\uf243";

		public const string BatterySlash = "\uf377";

		public const string BatteryThreeQuarters = "\uf241";

		public const string Bed = "\uf236";

		public const string Beer = "\uf0fc";

		public const string Behance = "\uf1b4";

		public const string BehanceSquare = "\uf1b5";

		public const string Bell = "\uf0f3";

		public const string BellSchool = "\uf5d5";

		public const string BellSchoolSlash = "\uf5d6";

		public const string BellSlash = "\uf1f6";

		public const string BezierCurve = "\uf55b";

		public const string Bible = "\uf647";

		public const string Bicycle = "\uf206";

		public const string Bimobject = "\uf378";

		public const string Binoculars = "\uf1e5";

		public const string BirthdayCake = "\uf1fd";

		public const string Bitbucket = "\uf171";

		public const string Bitcoin = "\uf379";

		public const string Bity = "\uf37a";

		public const string BlackTie = "\uf27e";

		public const string Blackberry = "\uf37b";

		public const string Blanket = "\uf498";

		public const string Blender = "\uf517";

		public const string BlenderPhone = "\uf6b6";

		public const string Blind = "\uf29d";

		public const string Blogger = "\uf37c";

		public const string BloggerB = "\uf37d";

		public const string Bluetooth = "\uf293";

		public const string BluetoothB = "\uf294";

		public const string Bold = "\uf032";

		public const string Bolt = "\uf0e7";

		public const string Bomb = "\uf1e2";

		public const string Bone = "\uf5d7";

		public const string BoneBreak = "\uf5d8";

		public const string Bong = "\uf55c";

		public const string Book = "\uf02d";

		public const string BookAlt = "\uf5d9";

		public const string BookDead = "\uf6b7";

		public const string BookHeart = "\uf499";

		public const string BookOpen = "\uf518";

		public const string BookReader = "\uf5da";

		public const string BookSpells = "\uf6b8";

		public const string Bookmark = "\uf02e";

		public const string Books = "\uf5db";

		public const string BoothCurtain = "\uf734";

		public const string BowArrow = "\uf6b9";

		public const string BowlingBall = "\uf436";

		public const string BowlingPins = "\uf437";

		public const string Box = "\uf466";

		public const string BoxAlt = "\uf49a";

		public const string BoxBallot = "\uf735";

		public const string BoxCheck = "\uf467";

		public const string BoxFragile = "\uf49b";

		public const string BoxFull = "\uf49c";

		public const string BoxHeart = "\uf49d";

		public const string BoxOpen = "\uf49e";

		public const string BoxUp = "\uf49f";

		public const string BoxUsd = "\uf4a0";

		public const string Boxes = "\uf468";

		public const string BoxesAlt = "\uf4a1";

		public const string BoxingGlove = "\uf438";

		public const string Braille = "\uf2a1";

		public const string Brain = "\uf5dc";

		public const string Briefcase = "\uf0b1";

		public const string BriefcaseMedical = "\uf469";

		public const string BroadcastTower = "\uf519";

		public const string Broom = "\uf51a";

		public const string Browser = "\uf37e";

		public const string Brush = "\uf55d";

		public const string Btc = "\uf15a";

		public const string Bug = "\uf188";

		public const string Building = "\uf1ad";

		public const string Bullhorn = "\uf0a1";

		public const string Bullseye = "\uf140";

		public const string BullseyeArrow = "\uf648";

		public const string BullseyePointer = "\uf649";

		public const string Burn = "\uf46a";

		public const string Buromobelexperte = "\uf37f";

		public const string Bus = "\uf207";

		public const string BusAlt = "\uf55e";

		public const string BusSchool = "\uf5dd";

		public const string BusinessTime = "\uf64a";

		public const string Buysellads = "\uf20d";

		public const string CabinetFiling = "\uf64b";

		public const string Calculator = "\uf1ec";

		public const string CalculatorAlt = "\uf64c";

		public const string Calendar = "\uf133";

		public const string CalendarAlt = "\uf073";

		public const string CalendarCheck = "\uf274";

		public const string CalendarEdit = "\uf333";

		public const string CalendarExclamation = "\uf334";

		public const string CalendarMinus = "\uf272";

		public const string CalendarPlus = "\uf271";

		public const string CalendarStar = "\uf736";

		public const string CalendarTimes = "\uf273";

		public const string Camera = "\uf030";

		public const string CameraAlt = "\uf332";

		public const string CameraRetro = "\uf083";

		public const string Campfire = "\uf6ba";

		public const string Campground = "\uf6bb";

		public const string CandleHolder = "\uf6bc";

		public const string CandyCorn = "\uf6bd";

		public const string Cannabis = "\uf55f";

		public const string Capsules = "\uf46b";

		public const string Car = "\uf1b9";

		public const string CarAlt = "\uf5de";

		public const string CarBattery = "\uf5df";

		public const string CarBump = "\uf5e0";

		public const string CarCrash = "\uf5e1";

		public const string CarGarage = "\uf5e2";

		public const string CarMechanic = "\uf5e3";

		public const string CarSide = "\uf5e4";

		public const string CarTilt = "\uf5e5";

		public const string CarWash = "\uf5e6";

		public const string CaretCircleDown = "\uf32d";

		public const string CaretCircleLeft = "\uf32e";

		public const string CaretCircleRight = "\uf330";

		public const string CaretCircleUp = "\uf331";

		public const string CaretDown = "\uf0d7";

		public const string CaretLeft = "\uf0d9";

		public const string CaretRight = "\uf0da";

		public const string CaretSquareDown = "\uf150";

		public const string CaretSquareLeft = "\uf191";

		public const string CaretSquareRight = "\uf152";

		public const string CaretSquareUp = "\uf151";

		public const string CaretUp = "\uf0d8";

		public const string CartArrowDown = "\uf218";

		public const string CartPlus = "\uf217";

		public const string Cat = "\uf6be";

		public const string Cauldron = "\uf6bf";

		public const string CcAmazonPay = "\uf42d";

		public const string CcAmex = "\uf1f3";

		public const string CcApplePay = "\uf416";

		public const string CcDinersClub = "\uf24c";

		public const string CcDiscover = "\uf1f2";

		public const string CcJcb = "\uf24b";

		public const string CcMastercard = "\uf1f1";

		public const string CcPaypal = "\uf1f4";

		public const string CcStripe = "\uf1f5";

		public const string CcVisa = "\uf1f0";

		public const string Centercode = "\uf380";

		public const string Certificate = "\uf0a3";

		public const string Chair = "\uf6c0";

		public const string ChairOffice = "\uf6c1";

		public const string Chalkboard = "\uf51b";

		public const string ChalkboardTeacher = "\uf51c";

		public const string ChargingStation = "\uf5e7";

		public const string ChartArea = "\uf1fe";

		public const string ChartBar = "\uf080";

		public const string ChartLine = "\uf201";

		public const string ChartLineDown = "\uf64d";

		public const string ChartPie = "\uf200";

		public const string ChartPieAlt = "\uf64e";

		public const string Check = "\uf00c";

		public const string CheckCircle = "\uf058";

		public const string CheckDouble = "\uf560";

		public const string CheckSquare = "\uf14a";

		public const string Chess = "\uf439";

		public const string ChessBishop = "\uf43a";

		public const string ChessBishopAlt = "\uf43b";

		public const string ChessBoard = "\uf43c";

		public const string ChessClock = "\uf43d";

		public const string ChessClockAlt = "\uf43e";

		public const string ChessKing = "\uf43f";

		public const string ChessKingAlt = "\uf440";

		public const string ChessKnight = "\uf441";

		public const string ChessKnightAlt = "\uf442";

		public const string ChessPawn = "\uf443";

		public const string ChessPawnAlt = "\uf444";

		public const string ChessQueen = "\uf445";

		public const string ChessQueenAlt = "\uf446";

		public const string ChessRook = "\uf447";

		public const string ChessRookAlt = "\uf448";

		public const string ChevronCircleDown = "\uf13a";

		public const string ChevronCircleLeft = "\uf137";

		public const string ChevronCircleRight = "\uf138";

		public const string ChevronCircleUp = "\uf139";

		public const string ChevronDoubleDown = "\uf322";

		public const string ChevronDoubleLeft = "\uf323";

		public const string ChevronDoubleRight = "\uf324";

		public const string ChevronDoubleUp = "\uf325";

		public const string ChevronDown = "\uf078";

		public const string ChevronLeft = "\uf053";

		public const string ChevronRight = "\uf054";

		public const string ChevronSquareDown = "\uf329";

		public const string ChevronSquareLeft = "\uf32a";

		public const string ChevronSquareRight = "\uf32b";

		public const string ChevronSquareUp = "\uf32c";

		public const string ChevronUp = "\uf077";

		public const string Child = "\uf1ae";

		public const string Chrome = "\uf268";

		public const string Church = "\uf51d";

		public const string Circle = "\uf111";

		public const string CircleNotch = "\uf1ce";

		public const string City = "\uf64f";

		public const string ClawMarks = "\uf6c2";

		public const string Clipboard = "\uf328";

		public const string ClipboardCheck = "\uf46c";

		public const string ClipboardList = "\uf46d";

		public const string ClipboardListCheck = "\uf737";

		public const string ClipboardPrescription = "\uf5e8";

		public const string Clock = "\uf017";

		public const string Clone = "\uf24d";

		public const string ClosedCaptioning = "\uf20a";

		public const string Cloud = "\uf0c2";

		public const string CloudDownload = "\uf0ed";

		public const string CloudDownloadAlt = "\uf381";

		public const string CloudDrizzle = "\uf738";

		public const string CloudHail = "\uf739";

		public const string CloudHailMixed = "\uf73a";

		public const string CloudMeatball = "\uf73b";

		public const string CloudMoon = "\uf6c3";

		public const string CloudMoonRain = "\uf73c";

		public const string CloudRain = "\uf73d";

		public const string CloudRainbow = "\uf73e";

		public const string CloudShowers = "\uf73f";

		public const string CloudShowersHeavy = "\uf740";

		public const string CloudSleet = "\uf741";

		public const string CloudSnow = "\uf742";

		public const string CloudSun = "\uf6c4";

		public const string CloudSunRain = "\uf743";

		public const string CloudUpload = "\uf0ee";

		public const string CloudUploadAlt = "\uf382";

		public const string Clouds = "\uf744";

		public const string CloudsMoon = "\uf745";

		public const string CloudsSun = "\uf746";

		public const string Cloudscale = "\uf383";

		public const string Cloudsmith = "\uf384";

		public const string Cloudversify = "\uf385";

		public const string Club = "\uf327";

		public const string Cocktail = "\uf561";

		public const string Code = "\uf121";

		public const string CodeBranch = "\uf126";

		public const string CodeCommit = "\uf386";

		public const string CodeMerge = "\uf387";

		public const string Codepen = "\uf1cb";

		public const string Codiepie = "\uf284";

		public const string Coffee = "\uf0f4";

		public const string CoffeeTogo = "\uf6c5";

		public const string Coffin = "\uf6c6";

		public const string Cog = "\uf013";

		public const string Cogs = "\uf085";

		public const string Coins = "\uf51e";

		public const string Columns = "\uf0db";

		public const string Comment = "\uf075";

		public const string CommentAlt = "\uf27a";

		public const string CommentAltCheck = "\uf4a2";

		public const string CommentAltDollar = "\uf650";

		public const string CommentAltDots = "\uf4a3";

		public const string CommentAltEdit = "\uf4a4";

		public const string CommentAltExclamation = "\uf4a5";

		public const string CommentAltLines = "\uf4a6";

		public const string CommentAltMinus = "\uf4a7";

		public const string CommentAltPlus = "\uf4a8";

		public const string CommentAltSlash = "\uf4a9";

		public const string CommentAltSmile = "\uf4aa";

		public const string CommentAltTimes = "\uf4ab";

		public const string CommentCheck = "\uf4ac";

		public const string CommentDollar = "\uf651";

		public const string CommentDots = "\uf4ad";

		public const string CommentEdit = "\uf4ae";

		public const string CommentExclamation = "\uf4af";

		public const string CommentLines = "\uf4b0";

		public const string CommentMinus = "\uf4b1";

		public const string CommentPlus = "\uf4b2";

		public const string CommentSlash = "\uf4b3";

		public const string CommentSmile = "\uf4b4";

		public const string CommentTimes = "\uf4b5";

		public const string Comments = "\uf086";

		public const string CommentsAlt = "\uf4b6";

		public const string CommentsAltDollar = "\uf652";

		public const string CommentsDollar = "\uf653";

		public const string CompactDisc = "\uf51f";

		public const string Compass = "\uf14e";

		public const string CompassSlash = "\uf5e9";

		public const string Compress = "\uf066";

		public const string CompressAlt = "\uf422";

		public const string CompressWide = "\uf326";

		public const string ConciergeBell = "\uf562";

		public const string Connectdevelop = "\uf20e";

		public const string ContainerStorage = "\uf4b7";

		public const string Contao = "\uf26d";

		public const string ConveyorBelt = "\uf46e";

		public const string ConveyorBeltAlt = "\uf46f";

		public const string Cookie = "\uf563";

		public const string CookieBite = "\uf564";

		public const string Copy = "\uf0c5";

		public const string Copyright = "\uf1f9";

		public const string Corn = "\uf6c7";

		public const string Couch = "\uf4b8";

		public const string Cow = "\uf6c8";

		public const string Cpanel = "\uf388";

		public const string CreativeCommons = "\uf25e";

		public const string CreativeCommonsBy = "\uf4e7";

		public const string CreativeCommonsNc = "\uf4e8";

		public const string CreativeCommonsNcEu = "\uf4e9";

		public const string CreativeCommonsNcJp = "\uf4ea";

		public const string CreativeCommonsNd = "\uf4eb";

		public const string CreativeCommonsPd = "\uf4ec";

		public const string CreativeCommonsPdAlt = "\uf4ed";

		public const string CreativeCommonsRemix = "\uf4ee";

		public const string CreativeCommonsSa = "\uf4ef";

		public const string CreativeCommonsSampling = "\uf4f0";

		public const string CreativeCommonsSamplingPlus = "\uf4f1";

		public const string CreativeCommonsShare = "\uf4f2";

		public const string CreativeCommonsZero = "\uf4f3";

		public const string CreditCard = "\uf09d";

		public const string CreditCardBlank = "\uf389";

		public const string CreditCardFront = "\uf38a";

		public const string Cricket = "\uf449";

		public const string CriticalRole = "\uf6c9";

		public const string Crop = "\uf125";

		public const string CropAlt = "\uf565";

		public const string Cross = "\uf654";

		public const string Crosshairs = "\uf05b";

		public const string Crow = "\uf520";

		public const string Crown = "\uf521";

		public const string Css3 = "\uf13c";

		public const string Css3Alt = "\uf38b";

		public const string Cube = "\uf1b2";

		public const string Cubes = "\uf1b3";

		public const string Curling = "\uf44a";

		public const string Cut = "\uf0c4";

		public const string Cuttlefish = "\uf38c";

		public const string DAndD = "\uf38d";

		public const string DAndDBeyond = "\uf6ca";

		public const string Dagger = "\uf6cb";

		public const string Dashcube = "\uf210";

		public const string Database = "\uf1c0";

		public const string Deaf = "\uf2a4";

		public const string Delicious = "\uf1a5";

		public const string Democrat = "\uf747";

		public const string Deploydog = "\uf38e";

		public const string Deskpro = "\uf38f";

		public const string Desktop = "\uf108";

		public const string DesktopAlt = "\uf390";

		public const string Dev = "\uf6cc";

		public const string Deviantart = "\uf1bd";

		public const string Dewpoint = "\uf748";

		public const string Dharmachakra = "\uf655";

		public const string Diagnoses = "\uf470";

		public const string Diamond = "\uf219";

		public const string Dice = "\uf522";

		public const string DiceD10 = "\uf6cd";

		public const string DiceD12 = "\uf6ce";

		public const string DiceD20 = "\uf6cf";

		public const string DiceD4 = "\uf6d0";

		public const string DiceD6 = "\uf6d1";

		public const string DiceD8 = "\uf6d2";

		public const string DiceFive = "\uf523";

		public const string DiceFour = "\uf524";

		public const string DiceOne = "\uf525";

		public const string DiceSix = "\uf526";

		public const string DiceThree = "\uf527";

		public const string DiceTwo = "\uf528";

		public const string Digg = "\uf1a6";

		public const string DigitalOcean = "\uf391";

		public const string DigitalTachograph = "\uf566";

		public const string Diploma = "\uf5ea";

		public const string Directions = "\uf5eb";

		public const string Discord = "\uf392";

		public const string Discourse = "\uf393";

		public const string Divide = "\uf529";

		public const string Dizzy = "\uf567";

		public const string Dna = "\uf471";

		public const string DoNotEnter = "\uf5ec";

		public const string Dochub = "\uf394";

		public const string Docker = "\uf395";

		public const string Dog = "\uf6d3";

		public const string DogLeashed = "\uf6d4";

		public const string DollarSign = "\uf155";

		public const string Dolly = "\uf472";

		public const string DollyEmpty = "\uf473";

		public const string DollyFlatbed = "\uf474";

		public const string DollyFlatbedAlt = "\uf475";

		public const string DollyFlatbedEmpty = "\uf476";

		public const string Donate = "\uf4b9";

		public const string DoorClosed = "\uf52a";

		public const string DoorOpen = "\uf52b";

		public const string DotCircle = "\uf192";

		public const string Dove = "\uf4ba";

		public const string Download = "\uf019";

		public const string Draft2digital = "\uf396";

		public const string DraftingCompass = "\uf568";

		public const string Dragon = "\uf6d5";

		public const string DrawCircle = "\uf5ed";

		public const string DrawPolygon = "\uf5ee";

		public const string DrawSquare = "\uf5ef";

		public const string Dribbble = "\uf17d";

		public const string DribbbleSquare = "\uf397";

		public const string Dropbox = "\uf16b";

		public const string Drum = "\uf569";

		public const string DrumSteelpan = "\uf56a";

		public const string Drumstick = "\uf6d6";

		public const string DrumstickBite = "\uf6d7";

		public const string Drupal = "\uf1a9";

		public const string Duck = "\uf6d8";

		public const string Dumbbell = "\uf44b";

		public const string Dungeon = "\uf6d9";

		public const string Dyalog = "\uf399";

		public const string Ear = "\uf5f0";

		public const string Earlybirds = "\uf39a";

		public const string Ebay = "\uf4f4";

		public const string Eclipse = "\uf749";

		public const string EclipseAlt = "\uf74a";

		public const string Edge = "\uf282";

		public const string Edit = "\uf044";

		public const string Eject = "\uf052";

		public const string Elementor = "\uf430";

		public const string Elephant = "\uf6da";

		public const string EllipsisH = "\uf141";

		public const string EllipsisHAlt = "\uf39b";

		public const string EllipsisV = "\uf142";

		public const string EllipsisVAlt = "\uf39c";

		public const string Ello = "\uf5f1";

		public const string Ember = "\uf423";

		public const string Empire = "\uf1d1";

		public const string EmptySet = "\uf656";

		public const string EngineWarning = "\uf5f2";

		public const string Envelope = "\uf0e0";

		public const string EnvelopeOpen = "\uf2b6";

		public const string EnvelopeOpenDollar = "\uf657";

		public const string EnvelopeOpenText = "\uf658";

		public const string EnvelopeSquare = "\uf199";

		public const string Envira = "\uf299";

		public const string Equal = "\uf52c";

		public const string Eraser = "\uf12d";

		public const string Erlang = "\uf39d";

		public const string Ethereum = "\uf42e";

		public const string Etsy = "\uf2d7";

		public const string EuroSign = "\uf153";

		public const string Exchange = "\uf0ec";

		public const string ExchangeAlt = "\uf362";

		public const string Exclamation = "\uf12a";

		public const string ExclamationCircle = "\uf06a";

		public const string ExclamationSquare = "\uf321";

		public const string ExclamationTriangle = "\uf071";

		public const string Expand = "\uf065";

		public const string ExpandAlt = "\uf424";

		public const string ExpandArrows = "\uf31d";

		public const string ExpandArrowsAlt = "\uf31e";

		public const string ExpandWide = "\uf320";

		public const string Expeditedssl = "\uf23e";

		public const string ExternalLink = "\uf08e";

		public const string ExternalLinkAlt = "\uf35d";

		public const string ExternalLinkSquare = "\uf14c";

		public const string ExternalLinkSquareAlt = "\uf360";

		public const string Eye = "\uf06e";

		public const string EyeDropper = "\uf1fb";

		public const string EyeEvil = "\uf6db";

		public const string EyeSlash = "\uf070";

		public const string Facebook = "\uf09a";

		public const string FacebookF = "\uf39e";

		public const string FacebookMessenger = "\uf39f";

		public const string FacebookSquare = "\uf082";

		public const string FantasyFlightGames = "\uf6dc";

		public const string FastBackward = "\uf049";

		public const string FastForward = "\uf050";

		public const string Fax = "\uf1ac";

		public const string Feather = "\uf52d";

		public const string FeatherAlt = "\uf56b";

		public const string Female = "\uf182";

		public const string FieldHockey = "\uf44c";

		public const string FighterJet = "\uf0fb";

		public const string File = "\uf15b";

		public const string FileAlt = "\uf15c";

		public const string FileArchive = "\uf1c6";

		public const string FileAudio = "\uf1c7";

		public const string FileCertificate = "\uf5f3";

		public const string FileChartLine = "\uf659";

		public const string FileChartPie = "\uf65a";

		public const string FileCheck = "\uf316";

		public const string FileCode = "\uf1c9";

		public const string FileContract = "\uf56c";

		public const string FileCsv = "\uf6dd";

		public const string FileDownload = "\uf56d";

		public const string FileEdit = "\uf31c";

		public const string FileExcel = "\uf1c3";

		public const string FileExclamation = "\uf31a";

		public const string FileExport = "\uf56e";

		public const string FileImage = "\uf1c5";

		public const string FileImport = "\uf56f";

		public const string FileInvoice = "\uf570";

		public const string FileInvoiceDollar = "\uf571";

		public const string FileMedical = "\uf477";

		public const string FileMedicalAlt = "\uf478";

		public const string FileMinus = "\uf318";

		public const string FilePdf = "\uf1c1";

		public const string FilePlus = "\uf319";

		public const string FilePowerpoint = "\uf1c4";

		public const string FilePrescription = "\uf572";

		public const string FileSignature = "\uf573";

		public const string FileSpreadsheet = "\uf65b";

		public const string FileTimes = "\uf317";

		public const string FileUpload = "\uf574";

		public const string FileUser = "\uf65c";

		public const string FileVideo = "\uf1c8";

		public const string FileWord = "\uf1c2";

		public const string Fill = "\uf575";

		public const string FillDrip = "\uf576";

		public const string Film = "\uf008";

		public const string FilmAlt = "\uf3a0";

		public const string Filter = "\uf0b0";

		public const string Fingerprint = "\uf577";

		public const string Fire = "\uf06d";

		public const string FireExtinguisher = "\uf134";

		public const string FireSmoke = "\uf74b";

		public const string Firefox = "\uf269";

		public const string FirstAid = "\uf479";

		public const string FirstOrder = "\uf2b0";

		public const string FirstOrderAlt = "\uf50a";

		public const string Firstdraft = "\uf3a1";

		public const string Fish = "\uf578";

		public const string FistRaised = "\uf6de";

		public const string Flag = "\uf024";

		public const string FlagAlt = "\uf74c";

		public const string FlagCheckered = "\uf11e";

		public const string FlagUsa = "\uf74d";

		public const string Flame = "\uf6df";

		public const string Flask = "\uf0c3";

		public const string FlaskPoison = "\uf6e0";

		public const string FlaskPotion = "\uf6e1";

		public const string Flickr = "\uf16e";

		public const string Flipboard = "\uf44d";

		public const string Flushed = "\uf579";

		public const string Fly = "\uf417";

		public const string Fog = "\uf74e";

		public const string Folder = "\uf07b";

		public const string FolderMinus = "\uf65d";

		public const string FolderOpen = "\uf07c";

		public const string FolderPlus = "\uf65e";

		public const string FolderTimes = "\uf65f";

		public const string Folders = "\uf660";

		public const string Font = "\uf031";

		public const string FontAwesome = "\uf2b4";

		public const string FontAwesomeAlt = "\uf35c";

		public const string FontAwesomeFlag = "\uf425";

		public const string Fonticons = "\uf280";

		public const string FonticonsFi = "\uf3a2";

		public const string FootballBall = "\uf44e";

		public const string FootballHelmet = "\uf44f";

		public const string Forklift = "\uf47a";

		public const string FortAwesome = "\uf286";

		public const string FortAwesomeAlt = "\uf3a3";

		public const string Forumbee = "\uf211";

		public const string Forward = "\uf04e";

		public const string Foursquare = "\uf180";

		public const string Fragile = "\uf4bb";

		public const string FreeCodeCamp = "\uf2c5";

		public const string Freebsd = "\uf3a4";

		public const string Frog = "\uf52e";

		public const string Frown = "\uf119";

		public const string FrownOpen = "\uf57a";

		public const string Fulcrum = "\uf50b";

		public const string Function = "\uf661";

		public const string FunnelDollar = "\uf662";

		public const string Futbol = "\uf1e3";

		public const string GalacticRepublic = "\uf50c";

		public const string GalacticSenate = "\uf50d";

		public const string Gamepad = "\uf11b";

		public const string GasPump = "\uf52f";

		public const string GasPumpSlash = "\uf5f4";

		public const string Gavel = "\uf0e3";

		public const string Gem = "\uf3a5";

		public const string Genderless = "\uf22d";

		public const string GetPocket = "\uf265";

		public const string Gg = "\uf260";

		public const string GgCircle = "\uf261";

		public const string Ghost = "\uf6e2";

		public const string Gift = "\uf06b";

		public const string GiftCard = "\uf663";

		public const string Git = "\uf1d3";

		public const string GitSquare = "\uf1d2";

		public const string Github = "\uf09b";

		public const string GithubAlt = "\uf113";

		public const string GithubSquare = "\uf092";

		public const string Gitkraken = "\uf3a6";

		public const string Gitlab = "\uf296";

		public const string Gitter = "\uf426";

		public const string GlassMartini = "\uf000";

		public const string GlassMartiniAlt = "\uf57b";

		public const string Glasses = "\uf530";

		public const string GlassesAlt = "\uf5f5";

		public const string Glide = "\uf2a5";

		public const string GlideG = "\uf2a6";

		public const string Globe = "\uf0ac";

		public const string GlobeAfrica = "\uf57c";

		public const string GlobeAmericas = "\uf57d";

		public const string GlobeAsia = "\uf57e";

		public const string GlobeStand = "\uf5f6";

		public const string Gofore = "\uf3a7";

		public const string GolfBall = "\uf450";

		public const string GolfClub = "\uf451";

		public const string Goodreads = "\uf3a8";

		public const string GoodreadsG = "\uf3a9";

		public const string Google = "\uf1a0";

		public const string GoogleDrive = "\uf3aa";

		public const string GooglePlay = "\uf3ab";

		public const string GooglePlus = "\uf2b3";

		public const string GooglePlusG = "\uf0d5";

		public const string GooglePlusSquare = "\uf0d4";

		public const string GoogleWallet = "\uf1ee";

		public const string Gopuram = "\uf664";

		public const string GraduationCap = "\uf19d";

		public const string Gratipay = "\uf184";

		public const string Grav = "\uf2d6";

		public const string GreaterThan = "\uf531";

		public const string GreaterThanEqual = "\uf532";

		public const string Grimace = "\uf57f";

		public const string Grin = "\uf580";

		public const string GrinAlt = "\uf581";

		public const string GrinBeam = "\uf582";

		public const string GrinBeamSweat = "\uf583";

		public const string GrinHearts = "\uf584";

		public const string GrinSquint = "\uf585";

		public const string GrinSquintTears = "\uf586";

		public const string GrinStars = "\uf587";

		public const string GrinTears = "\uf588";

		public const string GrinTongue = "\uf589";

		public const string GrinTongueSquint = "\uf58a";

		public const string GrinTongueWink = "\uf58b";

		public const string GrinWink = "\uf58c";

		public const string GripHorizontal = "\uf58d";

		public const string GripVertical = "\uf58e";

		public const string Gripfire = "\uf3ac";

		public const string Grunt = "\uf3ad";

		public const string Gulp = "\uf3ae";

		public const string HSquare = "\uf0fd";

		public const string H1 = "\uf313";

		public const string H2 = "\uf314";

		public const string H3 = "\uf315";

		public const string HackerNews = "\uf1d4";

		public const string HackerNewsSquare = "\uf3af";

		public const string Hackerrank = "\uf5f7";

		public const string Hammer = "\uf6e3";

		public const string HammerWar = "\uf6e4";

		public const string Hamsa = "\uf665";

		public const string HandHeart = "\uf4bc";

		public const string HandHolding = "\uf4bd";

		public const string HandHoldingBox = "\uf47b";

		public const string HandHoldingHeart = "\uf4be";

		public const string HandHoldingMagic = "\uf6e5";

		public const string HandHoldingSeedling = "\uf4bf";

		public const string HandHoldingUsd = "\uf4c0";

		public const string HandHoldingWater = "\uf4c1";

		public const string HandLizard = "\uf258";

		public const string HandPaper = "\uf256";

		public const string HandPeace = "\uf25b";

		public const string HandPointDown = "\uf0a7";

		public const string HandPointLeft = "\uf0a5";

		public const string HandPointRight = "\uf0a4";

		public const string HandPointUp = "\uf0a6";

		public const string HandPointer = "\uf25a";

		public const string HandReceiving = "\uf47c";

		public const string HandRock = "\uf255";

		public const string HandScissors = "\uf257";

		public const string HandSpock = "\uf259";

		public const string Hands = "\uf4c2";

		public const string HandsHeart = "\uf4c3";

		public const string HandsHelping = "\uf4c4";

		public const string HandsUsd = "\uf4c5";

		public const string Handshake = "\uf2b5";

		public const string HandshakeAlt = "\uf4c6";

		public const string Hanukiah = "\uf6e6";

		public const string Hashtag = "\uf292";

		public const string HatWitch = "\uf6e7";

		public const string HatWizard = "\uf6e8";

		public const string Haykal = "\uf666";

		public const string Hdd = "\uf0a0";

		public const string HeadSide = "\uf6e9";

		public const string HeadVr = "\uf6ea";

		public const string Heading = "\uf1dc";

		public const string Headphones = "\uf025";

		public const string HeadphonesAlt = "\uf58f";

		public const string Headset = "\uf590";

		public const string Heart = "\uf004";

		public const string HeartCircle = "\uf4c7";

		public const string HeartRate = "\uf5f8";

		public const string HeartSquare = "\uf4c8";

		public const string Heartbeat = "\uf21e";

		public const string Helicopter = "\uf533";

		public const string HelmetBattle = "\uf6eb";

		public const string Hexagon = "\uf312";

		public const string Highlighter = "\uf591";

		public const string Hiking = "\uf6ec";

		public const string Hippo = "\uf6ed";

		public const string Hips = "\uf452";

		public const string HireAHelper = "\uf3b0";

		public const string History = "\uf1da";

		public const string HockeyMask = "\uf6ee";

		public const string HockeyPuck = "\uf453";

		public const string HockeySticks = "\uf454";

		public const string Home = "\uf015";

		public const string HomeHeart = "\uf4c9";

		public const string HoodCloak = "\uf6ef";

		public const string Hooli = "\uf427";

		public const string Hornbill = "\uf592";

		public const string Horse = "\uf6f0";

		public const string Hospital = "\uf0f8";

		public const string HospitalAlt = "\uf47d";

		public const string HospitalSymbol = "\uf47e";

		public const string HotTub = "\uf593";

		public const string Hotel = "\uf594";

		public const string Hotjar = "\uf3b1";

		public const string Hourglass = "\uf254";

		public const string HourglassEnd = "\uf253";

		public const string HourglassHalf = "\uf252";

		public const string HourglassStart = "\uf251";

		public const string HouseDamage = "\uf6f1";

		public const string HouseFlood = "\uf74f";

		public const string Houzz = "\uf27c";

		public const string Hryvnia = "\uf6f2";

		public const string Html5 = "\uf13b";

		public const string Hubspot = "\uf3b2";

		public const string Humidity = "\uf750";

		public const string Hurricane = "\uf751";

		public const string ICursor = "\uf246";

		public const string IdBadge = "\uf2c1";

		public const string IdCard = "\uf2c2";

		public const string IdCardAlt = "\uf47f";

		public const string Image = "\uf03e";

		public const string Images = "\uf302";

		public const string Imdb = "\uf2d8";

		public const string Inbox = "\uf01c";

		public const string InboxIn = "\uf310";

		public const string InboxOut = "\uf311";

		public const string Indent = "\uf03c";

		public const string Industry = "\uf275";

		public const string IndustryAlt = "\uf3b3";

		public const string Infinity = "\uf534";

		public const string Info = "\uf129";

		public const string InfoCircle = "\uf05a";

		public const string InfoSquare = "\uf30f";

		public const string Inhaler = "\uf5f9";

		public const string Instagram = "\uf16d";

		public const string Integral = "\uf667";

		public const string InternetExplorer = "\uf26b";

		public const string Intersection = "\uf668";

		public const string Inventory = "\uf480";

		public const string Ioxhost = "\uf208";

		public const string Italic = "\uf033";

		public const string Itunes = "\uf3b4";

		public const string ItunesNote = "\uf3b5";

		public const string JackOLantern = "\uf30e";

		public const string Java = "\uf4e4";

		public const string Jedi = "\uf669";

		public const string JediOrder = "\uf50e";

		public const string Jenkins = "\uf3b6";

		public const string Joget = "\uf3b7";

		public const string Joint = "\uf595";

		public const string Joomla = "\uf1aa";

		public const string JournalWhills = "\uf66a";

		public const string Js = "\uf3b8";

		public const string JsSquare = "\uf3b9";

		public const string Jsfiddle = "\uf1cc";

		public const string Kaaba = "\uf66b";

		public const string Kaggle = "\uf5fa";

		public const string Key = "\uf084";

		public const string KeySkeleton = "\uf6f3";

		public const string Keybase = "\uf4f5";

		public const string Keyboard = "\uf11c";

		public const string Keycdn = "\uf3ba";

		public const string Keynote = "\uf66c";

		public const string Khanda = "\uf66d";

		public const string Kickstarter = "\uf3bb";

		public const string KickstarterK = "\uf3bc";

		public const string Kidneys = "\uf5fb";

		public const string Kiss = "\uf596";

		public const string KissBeam = "\uf597";

		public const string KissWinkHeart = "\uf598";

		public const string Kite = "\uf6f4";

		public const string KiwiBird = "\uf535";

		public const string KnifeKitchen = "\uf6f5";

		public const string Korvue = "\uf42f";

		public const string Lambda = "\uf66e";

		public const string Lamp = "\uf4ca";

		public const string Landmark = "\uf66f";

		public const string LandmarkAlt = "\uf752";

		public const string Language = "\uf1ab";

		public const string Laptop = "\uf109";

		public const string LaptopCode = "\uf5fc";

		public const string Laravel = "\uf3bd";

		public const string Lastfm = "\uf202";

		public const string LastfmSquare = "\uf203";

		public const string Laugh = "\uf599";

		public const string LaughBeam = "\uf59a";

		public const string LaughSquint = "\uf59b";

		public const string LaughWink = "\uf59c";

		public const string LayerGroup = "\uf5fd";

		public const string LayerMinus = "\uf5fe";

		public const string LayerPlus = "\uf5ff";

		public const string Leaf = "\uf06c";

		public const string LeafHeart = "\uf4cb";

		public const string LeafMaple = "\uf6f6";

		public const string LeafOak = "\uf6f7";

		public const string Leanpub = "\uf212";

		public const string Lemon = "\uf094";

		public const string Less = "\uf41d";

		public const string LessThan = "\uf536";

		public const string LessThanEqual = "\uf537";

		public const string LevelDown = "\uf149";

		public const string LevelDownAlt = "\uf3be";

		public const string LevelUp = "\uf148";

		public const string LevelUpAlt = "\uf3bf";

		public const string LifeRing = "\uf1cd";

		public const string Lightbulb = "\uf0eb";

		public const string LightbulbDollar = "\uf670";

		public const string LightbulbExclamation = "\uf671";

		public const string LightbulbOn = "\uf672";

		public const string LightbulbSlash = "\uf673";

		public const string Line = "\uf3c0";

		public const string Link = "\uf0c1";

		public const string Linkedin = "\uf08c";

		public const string LinkedinIn = "\uf0e1";

		public const string Linode = "\uf2b8";

		public const string Linux = "\uf17c";

		public const string Lips = "\uf600";

		public const string LiraSign = "\uf195";

		public const string List = "\uf03a";

		public const string ListAlt = "\uf022";

		public const string ListOl = "\uf0cb";

		public const string ListUl = "\uf0ca";

		public const string Location = "\uf601";

		public const string LocationArrow = "\uf124";

		public const string LocationCircle = "\uf602";

		public const string LocationSlash = "\uf603";

		public const string Lock = "\uf023";

		public const string LockAlt = "\uf30d";

		public const string LockOpen = "\uf3c1";

		public const string LockOpenAlt = "\uf3c2";

		public const string LongArrowAltDown = "\uf309";

		public const string LongArrowAltLeft = "\uf30a";

		public const string LongArrowAltRight = "\uf30b";

		public const string LongArrowAltUp = "\uf30c";

		public const string LongArrowDown = "\uf175";

		public const string LongArrowLeft = "\uf177";

		public const string LongArrowRight = "\uf178";

		public const string LongArrowUp = "\uf176";

		public const string Loveseat = "\uf4cc";

		public const string LowVision = "\uf2a8";

		public const string Luchador = "\uf455";

		public const string LuggageCart = "\uf59d";

		public const string Lungs = "\uf604";

		public const string Lyft = "\uf3c3";

		public const string Mace = "\uf6f8";

		public const string Magento = "\uf3c4";

		public const string Magic = "\uf0d0";

		public const string Magnet = "\uf076";

		public const string MailBulk = "\uf674";

		public const string Mailchimp = "\uf59e";

		public const string Male = "\uf183";

		public const string Mandalorian = "\uf50f";

		public const string Mandolin = "\uf6f9";

		public const string Map = "\uf279";

		public const string MapMarked = "\uf59f";

		public const string MapMarkedAlt = "\uf5a0";

		public const string MapMarker = "\uf041";

		public const string MapMarkerAlt = "\uf3c5";

		public const string MapMarkerAltSlash = "\uf605";

		public const string MapMarkerCheck = "\uf606";

		public const string MapMarkerEdit = "\uf607";

		public const string MapMarkerExclamation = "\uf608";

		public const string MapMarkerMinus = "\uf609";

		public const string MapMarkerPlus = "\uf60a";

		public const string MapMarkerQuestion = "\uf60b";

		public const string MapMarkerSlash = "\uf60c";

		public const string MapMarkerSmile = "\uf60d";

		public const string MapMarkerTimes = "\uf60e";

		public const string MapPin = "\uf276";

		public const string MapSigns = "\uf277";

		public const string Markdown = "\uf60f";

		public const string Marker = "\uf5a1";

		public const string Mars = "\uf222";

		public const string MarsDouble = "\uf227";

		public const string MarsStroke = "\uf229";

		public const string MarsStrokeH = "\uf22b";

		public const string MarsStrokeV = "\uf22a";

		public const string Mask = "\uf6fa";

		public const string Mastodon = "\uf4f6";

		public const string Maxcdn = "\uf136";

		public const string Medal = "\uf5a2";

		public const string Medapps = "\uf3c6";

		public const string Medium = "\uf23a";

		public const string MediumM = "\uf3c7";

		public const string Medkit = "\uf0fa";

		public const string Medrt = "\uf3c8";

		public const string Meetup = "\uf2e0";

		public const string Megaphone = "\uf675";

		public const string Megaport = "\uf5a3";

		public const string Meh = "\uf11a";

		public const string MehBlank = "\uf5a4";

		public const string MehRollingEyes = "\uf5a5";

		public const string Memory = "\uf538";

		public const string Menorah = "\uf676";

		public const string Mercury = "\uf223";

		public const string Meteor = "\uf753";

		public const string Microchip = "\uf2db";

		public const string Microphone = "\uf130";

		public const string MicrophoneAlt = "\uf3c9";

		public const string MicrophoneAltSlash = "\uf539";

		public const string MicrophoneSlash = "\uf131";

		public const string Microscope = "\uf610";

		public const string Microsoft = "\uf3ca";

		public const string MindShare = "\uf677";

		public const string Minus = "\uf068";

		public const string MinusCircle = "\uf056";

		public const string MinusHexagon = "\uf307";

		public const string MinusOctagon = "\uf308";

		public const string MinusSquare = "\uf146";

		public const string Mix = "\uf3cb";

		public const string Mixcloud = "\uf289";

		public const string Mizuni = "\uf3cc";

		public const string Mobile = "\uf10b";

		public const string MobileAlt = "\uf3cd";

		public const string MobileAndroid = "\uf3ce";

		public const string MobileAndroidAlt = "\uf3cf";

		public const string Modx = "\uf285";

		public const string Monero = "\uf3d0";

		public const string MoneyBill = "\uf0d6";

		public const string MoneyBillAlt = "\uf3d1";

		public const string MoneyBillWave = "\uf53a";

		public const string MoneyBillWaveAlt = "\uf53b";

		public const string MoneyCheck = "\uf53c";

		public const string MoneyCheckAlt = "\uf53d";

		public const string MonitorHeartRate = "\uf611";

		public const string Monkey = "\uf6fb";

		public const string Monument = "\uf5a6";

		public const string Moon = "\uf186";

		public const string MoonCloud = "\uf754";

		public const string MoonStars = "\uf755";

		public const string MortarPestle = "\uf5a7";

		public const string Mosque = "\uf678";

		public const string Motorcycle = "\uf21c";

		public const string Mountain = "\uf6fc";

		public const string Mountains = "\uf6fd";

		public const string MousePointer = "\uf245";

		public const string Music = "\uf001";

		public const string Napster = "\uf3d2";

		public const string Narwhal = "\uf6fe";

		public const string Neos = "\uf612";

		public const string NetworkWired = "\uf6ff";

		public const string Neuter = "\uf22c";

		public const string Newspaper = "\uf1ea";

		public const string Nimblr = "\uf5a8";

		public const string NintendoSwitch = "\uf418";

		public const string Node = "\uf419";

		public const string NodeJs = "\uf3d3";

		public const string NotEqual = "\uf53e";

		public const string NotesMedical = "\uf481";

		public const string Npm = "\uf3d4";

		public const string Ns8 = "\uf3d5";

		public const string Nutritionix = "\uf3d6";

		public const string ObjectGroup = "\uf247";

		public const string ObjectUngroup = "\uf248";

		public const string Octagon = "\uf306";

		public const string Odnoklassniki = "\uf263";

		public const string OdnoklassnikiSquare = "\uf264";

		public const string OilCan = "\uf613";

		public const string OilTemp = "\uf614";

		public const string OldRepublic = "\uf510";

		public const string Om = "\uf679";

		public const string Omega = "\uf67a";

		public const string Opencart = "\uf23d";

		public const string Openid = "\uf19b";

		public const string Opera = "\uf26a";

		public const string OptinMonster = "\uf23c";

		public const string Osi = "\uf41a";

		public const string Otter = "\uf700";

		public const string Outdent = "\uf03b";

		public const string Page4 = "\uf3d7";

		public const string Pagelines = "\uf18c";

		public const string PaintBrush = "\uf1fc";

		public const string PaintBrushAlt = "\uf5a9";

		public const string PaintRoller = "\uf5aa";

		public const string Palette = "\uf53f";

		public const string Palfed = "\uf3d8";

		public const string Pallet = "\uf482";

		public const string PalletAlt = "\uf483";

		public const string PaperPlane = "\uf1d8";

		public const string Paperclip = "\uf0c6";

		public const string ParachuteBox = "\uf4cd";

		public const string Paragraph = "\uf1dd";

		public const string Parking = "\uf540";

		public const string ParkingCircle = "\uf615";

		public const string ParkingCircleSlash = "\uf616";

		public const string ParkingSlash = "\uf617";

		public const string Passport = "\uf5ab";

		public const string Pastafarianism = "\uf67b";

		public const string Paste = "\uf0ea";

		public const string Patreon = "\uf3d9";

		public const string Pause = "\uf04c";

		public const string PauseCircle = "\uf28b";

		public const string Paw = "\uf1b0";

		public const string PawAlt = "\uf701";

		public const string PawClaws = "\uf702";

		public const string Paypal = "\uf1ed";

		public const string Peace = "\uf67c";

		public const string Pegasus = "\uf703";

		public const string Pen = "\uf304";

		public const string PenAlt = "\uf305";

		public const string PenFancy = "\uf5ac";

		public const string PenNib = "\uf5ad";

		public const string PenSquare = "\uf14b";

		public const string Pencil = "\uf040";

		public const string PencilAlt = "\uf303";

		public const string PencilPaintbrush = "\uf618";

		public const string PencilRuler = "\uf5ae";

		public const string Pennant = "\uf456";

		public const string PennyArcade = "\uf704";

		public const string PeopleCarry = "\uf4ce";

		public const string Percent = "\uf295";

		public const string Percentage = "\uf541";

		public const string Periscope = "\uf3da";

		public const string PersonBooth = "\uf756";

		public const string PersonCarry = "\uf4cf";

		public const string PersonDolly = "\uf4d0";

		public const string PersonDollyEmpty = "\uf4d1";

		public const string PersonSign = "\uf757";

		public const string Phabricator = "\uf3db";

		public const string PhoenixFramework = "\uf3dc";

		public const string PhoenixSquadron = "\uf511";

		public const string Phone = "\uf095";

		public const string PhoneOffice = "\uf67d";

		public const string PhonePlus = "\uf4d2";

		public const string PhoneSlash = "\uf3dd";

		public const string PhoneSquare = "\uf098";

		public const string PhoneVolume = "\uf2a0";

		public const string Php = "\uf457";

		public const string Pi = "\uf67e";

		public const string Pie = "\uf705";

		public const string PiedPiper = "\uf2ae";

		public const string PiedPiperAlt = "\uf1a8";

		public const string PiedPiperHat = "\uf4e5";

		public const string PiedPiperPp = "\uf1a7";

		public const string Pig = "\uf706";

		public const string PiggyBank = "\uf4d3";

		public const string Pills = "\uf484";

		public const string Pinterest = "\uf0d2";

		public const string PinterestP = "\uf231";

		public const string PinterestSquare = "\uf0d3";

		public const string PlaceOfWorship = "\uf67f";

		public const string Plane = "\uf072";

		public const string PlaneAlt = "\uf3de";

		public const string PlaneArrival = "\uf5af";

		public const string PlaneDeparture = "\uf5b0";

		public const string Play = "\uf04b";

		public const string PlayCircle = "\uf144";

		public const string Playstation = "\uf3df";

		public const string Plug = "\uf1e6";

		public const string Plus = "\uf067";

		public const string PlusCircle = "\uf055";

		public const string PlusHexagon = "\uf300";

		public const string PlusOctagon = "\uf301";

		public const string PlusSquare = "\uf0fe";

		public const string Podcast = "\uf2ce";

		public const string Chromecast = "\uf838";

		public const string Podium = "\uf680";

		public const string PodiumStar = "\uf758";

		public const string Poll = "\uf681";

		public const string PollH = "\uf682";

		public const string PollPeople = "\uf759";

		public const string Poo = "\uf2fe";

		public const string PooStorm = "\uf75a";

		public const string Poop = "\uf619";

		public const string Portrait = "\uf3e0";

		public const string PoundSign = "\uf154";

		public const string PowerOff = "\uf011";

		public const string Pray = "\uf683";

		public const string PrayingHands = "\uf684";

		public const string Prescription = "\uf5b1";

		public const string PrescriptionBottle = "\uf485";

		public const string PrescriptionBottleAlt = "\uf486";

		public const string Presentation = "\uf685";

		public const string Print = "\uf02f";

		public const string PrintSlash = "\uf686";

		public const string Procedures = "\uf487";

		public const string ProductHunt = "\uf288";

		public const string ProjectDiagram = "\uf542";

		public const string Pumpkin = "\uf707";

		public const string Pushed = "\uf3e1";

		public const string PuzzlePiece = "\uf12e";

		public const string Python = "\uf3e2";

		public const string Qq = "\uf1d6";

		public const string Qrcode = "\uf029";

		public const string Question = "\uf128";

		public const string QuestionCircle = "\uf059";

		public const string QuestionSquare = "\uf2fd";

		public const string Quidditch = "\uf458";

		public const string Quinscape = "\uf459";

		public const string Quora = "\uf2c4";

		public const string QuoteLeft = "\uf10d";

		public const string QuoteRight = "\uf10e";

		public const string Quran = "\uf687";

		public const string RProject = "\uf4f7";

		public const string Rabbit = "\uf708";

		public const string RabbitFast = "\uf709";

		public const string Racquet = "\uf45a";

		public const string Rainbow = "\uf75b";

		public const string Raindrops = "\uf75c";

		public const string Ram = "\uf70a";

		public const string RampLoading = "\uf4d4";

		public const string Random = "\uf074";

		public const string Ravelry = "\uf2d9";

		public const string React = "\uf41b";

		public const string Reacteurope = "\uf75d";

		public const string Readme = "\uf4d5";

		public const string Rebel = "\uf1d0";

		public const string Receipt = "\uf543";

		public const string RectangleLandscape = "\uf2fa";

		public const string RectanglePortrait = "\uf2fb";

		public const string RectangleWide = "\uf2fc";

		public const string Recycle = "\uf1b8";

		public const string RedRiver = "\uf3e3";

		public const string Reddit = "\uf1a1";

		public const string RedditAlien = "\uf281";

		public const string RedditSquare = "\uf1a2";

		public const string Redo = "\uf01e";

		public const string RedoAlt = "\uf2f9";

		public const string Registered = "\uf25d";

		public const string Renren = "\uf18b";

		public const string Repeat = "\uf363";

		public const string Repeat1 = "\uf365";

		public const string Repeat1Alt = "\uf366";

		public const string RepeatAlt = "\uf364";

		public const string Reply = "\uf3e5";

		public const string ReplyAll = "\uf122";

		public const string Replyd = "\uf3e6";

		public const string Republican = "\uf75e";

		public const string Researchgate = "\uf4f8";

		public const string Resolving = "\uf3e7";

		public const string Retweet = "\uf079";

		public const string RetweetAlt = "\uf361";

		public const string Rev = "\uf5b2";

		public const string Ribbon = "\uf4d6";

		public const string Ring = "\uf70b";

		public const string Road = "\uf018";

		public const string Robot = "\uf544";

		public const string Rocket = "\uf135";

		public const string Rocketchat = "\uf3e8";

		public const string Rockrms = "\uf3e9";

		public const string Route = "\uf4d7";

		public const string RouteHighway = "\uf61a";

		public const string RouteInterstate = "\uf61b";

		public const string Rss = "\uf09e";

		public const string RssSquare = "\uf143";

		public const string RubleSign = "\uf158";

		public const string Ruler = "\uf545";

		public const string RulerCombined = "\uf546";

		public const string RulerHorizontal = "\uf547";

		public const string RulerTriangle = "\uf61c";

		public const string RulerVertical = "\uf548";

		public const string Running = "\uf70c";

		public const string RupeeSign = "\uf156";

		public const string SadCry = "\uf5b3";

		public const string SadTear = "\uf5b4";

		public const string Safari = "\uf267";

		public const string Sass = "\uf41e";

		public const string Save = "\uf0c7";

		public const string Scalpel = "\uf61d";

		public const string ScalpelPath = "\uf61e";

		public const string Scanner = "\uf488";

		public const string ScannerKeyboard = "\uf489";

		public const string ScannerTouchscreen = "\uf48a";

		public const string Scarecrow = "\uf70d";

		public const string Schlix = "\uf3ea";

		public const string School = "\uf549";

		public const string Screwdriver = "\uf54a";

		public const string Scribd = "\uf28a";

		public const string Scroll = "\uf70e";

		public const string ScrollOld = "\uf70f";

		public const string Scrubber = "\uf2f8";

		public const string Scythe = "\uf710";

		public const string Search = "\uf002";

		public const string SearchDollar = "\uf688";

		public const string SearchLocation = "\uf689";

		public const string SearchMinus = "\uf010";

		public const string SearchPlus = "\uf00e";

		public const string Searchengin = "\uf3eb";

		public const string Seedling = "\uf4d8";

		public const string Sellcast = "\uf2da";

		public const string Sellsy = "\uf213";

		public const string Server = "\uf233";

		public const string Servicestack = "\uf3ec";

		public const string Shapes = "\uf61f";

		public const string Share = "\uf064";

		public const string ShareAll = "\uf367";

		public const string ShareAlt = "\uf1e0";

		public const string ShareAltSquare = "\uf1e1";

		public const string ShareSquare = "\uf14d";

		public const string Sheep = "\uf711";

		public const string ShekelSign = "\uf20b";

		public const string Shield = "\uf132";

		public const string ShieldAlt = "\uf3ed";

		public const string ShieldCheck = "\uf2f7";

		public const string ShieldCross = "\uf712";

		public const string Ship = "\uf21a";

		public const string ShippingFast = "\uf48b";

		public const string ShippingTimed = "\uf48c";

		public const string Shirtsinbulk = "\uf214";

		public const string ShoePrints = "\uf54b";

		public const string ShoppingBag = "\uf290";

		public const string ShoppingBasket = "\uf291";

		public const string ShoppingCart = "\uf07a";

		public const string Shopware = "\uf5b5";

		public const string Shovel = "\uf713";

		public const string Shower = "\uf2cc";

		public const string Shredder = "\uf68a";

		public const string ShuttleVan = "\uf5b6";

		public const string Shuttlecock = "\uf45b";

		public const string Sigma = "\uf68b";

		public const string Sign = "\uf4d9";

		public const string SignIn = "\uf090";

		public const string SignInAlt = "\uf2f6";

		public const string SignLanguage = "\uf2a7";

		public const string SignOut = "\uf08b";

		public const string SignOutAlt = "\uf2f5";

		public const string Signal = "\uf012";

		public const string Signal1 = "\uf68c";

		public const string Signal2 = "\uf68d";

		public const string Signal3 = "\uf68e";

		public const string Signal4 = "\uf68f";

		public const string SignalAlt = "\uf690";

		public const string SignalAlt1 = "\uf691";

		public const string SignalAlt2 = "\uf692";

		public const string SignalAlt3 = "\uf693";

		public const string SignalAltSlash = "\uf694";

		public const string SignalSlash = "\uf695";

		public const string Signature = "\uf5b7";

		public const string Simplybuilt = "\uf215";

		public const string Sistrix = "\uf3ee";

		public const string Sitemap = "\uf0e8";

		public const string Sith = "\uf512";

		public const string Skeleton = "\uf620";

		public const string Skull = "\uf54c";

		public const string SkullCrossbones = "\uf714";

		public const string Skyatlas = "\uf216";

		public const string Skype = "\uf17e";

		public const string Slack = "\uf198";

		public const string SlackHash = "\uf3ef";

		public const string Slash = "\uf715";

		public const string SlidersH = "\uf1de";

		public const string SlidersHSquare = "\uf3f0";

		public const string SlidersV = "\uf3f1";

		public const string SlidersVSquare = "\uf3f2";

		public const string Slideshare = "\uf1e7";

		public const string Smile = "\uf118";

		public const string SmileBeam = "\uf5b8";

		public const string SmilePlus = "\uf5b9";

		public const string SmileWink = "\uf4da";

		public const string Smog = "\uf75f";

		public const string Smoke = "\uf760";

		public const string Smoking = "\uf48d";

		public const string SmokingBan = "\uf54d";

		public const string Snake = "\uf716";

		public const string Snapchat = "\uf2ab";

		public const string SnapchatGhost = "\uf2ac";

		public const string SnapchatSquare = "\uf2ad";

		public const string SnowBlowing = "\uf761";

		public const string Snowflake = "\uf2dc";

		public const string Socks = "\uf696";

		public const string SolarPanel = "\uf5ba";

		public const string Sort = "\uf0dc";

		public const string SortAlphaDown = "\uf15d";

		public const string SortAlphaUp = "\uf15e";

		public const string SortAmountDown = "\uf160";

		public const string SortAmountUp = "\uf161";

		public const string SortDown = "\uf0dd";

		public const string SortNumericDown = "\uf162";

		public const string SortNumericUp = "\uf163";

		public const string SortUp = "\uf0de";

		public const string Soundcloud = "\uf1be";

		public const string Spa = "\uf5bb";

		public const string SpaceShuttle = "\uf197";

		public const string Spade = "\uf2f4";

		public const string Speakap = "\uf3f3";

		public const string Spider = "\uf717";

		public const string SpiderBlackWidow = "\uf718";

		public const string SpiderWeb = "\uf719";

		public const string Spinner = "\uf110";

		public const string SpinnerThird = "\uf3f4";

		public const string Splotch = "\uf5bc";

		public const string Spotify = "\uf1bc";

		public const string SprayCan = "\uf5bd";

		public const string Square = "\uf0c8";

		public const string SquareFull = "\uf45c";

		public const string SquareRoot = "\uf697";

		public const string SquareRootAlt = "\uf698";

		public const string Squarespace = "\uf5be";

		public const string Squirrel = "\uf71a";

		public const string StackExchange = "\uf18d";

		public const string StackOverflow = "\uf16c";

		public const string Staff = "\uf71b";

		public const string Stamp = "\uf5bf";

		public const string Star = "\uf005";

		public const string StarAndCrescent = "\uf699";

		public const string StarExclamation = "\uf2f3";

		public const string StarHalf = "\uf089";

		public const string StarHalfAlt = "\uf5c0";

		public const string StarOfDavid = "\uf69a";

		public const string StarOfLife = "\uf621";

		public const string Stars = "\uf762";

		public const string Staylinked = "\uf3f5";

		public const string Steam = "\uf1b6";

		public const string SteamSquare = "\uf1b7";

		public const string SteamSymbol = "\uf3f6";

		public const string SteeringWheel = "\uf622";

		public const string StepBackward = "\uf048";

		public const string StepForward = "\uf051";

		public const string Stethoscope = "\uf0f1";

		public const string StickerMule = "\uf3f7";

		public const string StickyNote = "\uf249";

		public const string Stomach = "\uf623";

		public const string Stop = "\uf04d";

		public const string StopCircle = "\uf28d";

		public const string Stopwatch = "\uf2f2";

		public const string Store = "\uf54e";

		public const string StoreAlt = "\uf54f";

		public const string Strava = "\uf428";

		public const string Stream = "\uf550";

		public const string StreetView = "\uf21d";

		public const string Strikethrough = "\uf0cc";

		public const string Stripe = "\uf429";

		public const string StripeS = "\uf42a";

		public const string Stroopwafel = "\uf551";

		public const string Studiovinari = "\uf3f8";

		public const string Stumbleupon = "\uf1a4";

		public const string StumbleuponCircle = "\uf1a3";

		public const string Subscript = "\uf12c";

		public const string Subway = "\uf239";

		public const string Suitcase = "\uf0f2";

		public const string SuitcaseRolling = "\uf5c1";

		public const string Sun = "\uf185";

		public const string SunCloud = "\uf763";

		public const string SunDust = "\uf764";

		public const string SunHaze = "\uf765";

		public const string Sunrise = "\uf766";

		public const string Sunset = "\uf767";

		public const string Superpowers = "\uf2dd";

		public const string Superscript = "\uf12b";

		public const string Supple = "\uf3f9";

		public const string Surprise = "\uf5c2";

		public const string Swatchbook = "\uf5c3";

		public const string Swimmer = "\uf5c4";

		public const string SwimmingPool = "\uf5c5";

		public const string Sword = "\uf71c";

		public const string Swords = "\uf71d";

		public const string Synagogue = "\uf69b";

		public const string Sync = "\uf021";

		public const string SyncAlt = "\uf2f1";

		public const string Syringe = "\uf48e";

		public const string Table = "\uf0ce";

		public const string TableTennis = "\uf45d";

		public const string Tablet = "\uf10a";

		public const string TabletAlt = "\uf3fa";

		public const string TabletAndroid = "\uf3fb";

		public const string TabletAndroidAlt = "\uf3fc";

		public const string TabletRugged = "\uf48f";

		public const string Tablets = "\uf490";

		public const string Tachometer = "\uf0e4";

		public const string TachometerAlt = "\uf3fd";

		public const string TachometerAltAverage = "\uf624";

		public const string TachometerAltFast = "\uf625";

		public const string TachometerAltFastest = "\uf626";

		public const string TachometerAltSlow = "\uf627";

		public const string TachometerAltSlowest = "\uf628";

		public const string TachometerAverage = "\uf629";

		public const string TachometerFast = "\uf62a";

		public const string TachometerFastest = "\uf62b";

		public const string TachometerSlow = "\uf62c";

		public const string TachometerSlowest = "\uf62d";

		public const string Tag = "\uf02b";

		public const string Tags = "\uf02c";

		public const string Tally = "\uf69c";

		public const string Tape = "\uf4db";

		public const string Tasks = "\uf0ae";

		public const string Taxi = "\uf1ba";

		public const string Teamspeak = "\uf4f9";

		public const string Teeth = "\uf62e";

		public const string TeethOpen = "\uf62f";

		public const string Telegram = "\uf2c6";

		public const string TelegramPlane = "\uf3fe";

		public const string TemperatureFrigid = "\uf768";

		public const string TemperatureHigh = "\uf769";

		public const string TemperatureHot = "\uf76a";

		public const string TemperatureLow = "\uf76b";

		public const string TencentWeibo = "\uf1d5";

		public const string TennisBall = "\uf45e";

		public const string Terminal = "\uf120";

		public const string TextHeight = "\uf034";

		public const string TextWidth = "\uf035";

		public const string Th = "\uf00a";

		public const string ThLarge = "\uf009";

		public const string ThList = "\uf00b";

		public const string TheRedYeti = "\uf69d";

		public const string TheaterMasks = "\uf630";

		public const string Themeco = "\uf5c6";

		public const string Themeisle = "\uf2b2";

		public const string Thermometer = "\uf491";

		public const string ThermometerEmpty = "\uf2cb";

		public const string ThermometerFull = "\uf2c7";

		public const string ThermometerHalf = "\uf2c9";

		public const string ThermometerQuarter = "\uf2ca";

		public const string ThermometerThreeQuarters = "\uf2c8";

		public const string Theta = "\uf69e";

		public const string ThinkPeaks = "\uf731";

		public const string ThumbsDown = "\uf165";

		public const string ThumbsUp = "\uf164";

		public const string Thumbtack = "\uf08d";

		public const string Thunderstorm = "\uf76c";

		public const string ThunderstormMoon = "\uf76d";

		public const string ThunderstormSun = "\uf76e";

		public const string Ticket = "\uf145";

		public const string TicketAlt = "\uf3ff";

		public const string Tilde = "\uf69f";

		public const string Times = "\uf00d";

		public const string TimesCircle = "\uf057";

		public const string TimesHexagon = "\uf2ee";

		public const string TimesOctagon = "\uf2f0";

		public const string TimesSquare = "\uf2d3";

		public const string Tint = "\uf043";

		public const string TintSlash = "\uf5c7";

		public const string Tire = "\uf631";

		public const string TireFlat = "\uf632";

		public const string TirePressureWarning = "\uf633";

		public const string TireRugged = "\uf634";

		public const string Tired = "\uf5c8";

		public const string ToggleOff = "\uf204";

		public const string ToggleOn = "\uf205";

		public const string ToiletPaper = "\uf71e";

		public const string ToiletPaperAlt = "\uf71f";

		public const string Tombstone = "\uf720";

		public const string TombstoneAlt = "\uf721";

		public const string Toolbox = "\uf552";

		public const string Tooth = "\uf5c9";

		public const string Toothbrush = "\uf635";

		public const string Torah = "\uf6a0";

		public const string ToriiGate = "\uf6a1";

		public const string Tornado = "\uf76f";

		public const string Tractor = "\uf722";

		public const string TradeFederation = "\uf513";

		public const string Trademark = "\uf25c";

		public const string TrafficCone = "\uf636";

		public const string TrafficLight = "\uf637";

		public const string TrafficLightGo = "\uf638";

		public const string TrafficLightSlow = "\uf639";

		public const string TrafficLightStop = "\uf63a";

		public const string Train = "\uf238";

		public const string Transgender = "\uf224";

		public const string TransgenderAlt = "\uf225";

		public const string Trash = "\uf1f8";

		public const string TrashAlt = "\uf2ed";

		public const string TreasureChest = "\uf723";

		public const string Tree = "\uf1bb";

		public const string TreeAlt = "\uf400";

		public const string Trees = "\uf724";

		public const string Trello = "\uf181";

		public const string Triangle = "\uf2ec";

		public const string Tripadvisor = "\uf262";

		public const string Trophy = "\uf091";

		public const string TrophyAlt = "\uf2eb";

		public const string Truck = "\uf0d1";

		public const string TruckContainer = "\uf4dc";

		public const string TruckCouch = "\uf4dd";

		public const string TruckLoading = "\uf4de";

		public const string TruckMonster = "\uf63b";

		public const string TruckMoving = "\uf4df";

		public const string TruckPickup = "\uf63c";

		public const string TruckRamp = "\uf4e0";

		public const string Tshirt = "\uf553";

		public const string Tty = "\uf1e4";

		public const string Tumblr = "\uf173";

		public const string TumblrSquare = "\uf174";

		public const string Turkey = "\uf725";

		public const string Turtle = "\uf726";

		public const string Tv = "\uf26c";

		public const string TvRetro = "\uf401";

		public const string Twitch = "\uf1e8";

		public const string Twitter = "\uf099";

		public const string TwitterSquare = "\uf081";

		public const string Typo3 = "\uf42b";

		public const string Uber = "\uf402";

		public const string Uikit = "\uf403";

		public const string Umbrella = "\uf0e9";

		public const string UmbrellaBeach = "\uf5ca";

		public const string Underline = "\uf0cd";

		public const string Undo = "\uf0e2";

		public const string UndoAlt = "\uf2ea";

		public const string Unicorn = "\uf727";

		public const string Union = "\uf6a2";

		public const string Uniregistry = "\uf404";

		public const string UniversalAccess = "\uf29a";

		public const string University = "\uf19c";

		public const string Unlink = "\uf127";

		public const string Unlock = "\uf09c";

		public const string UnlockAlt = "\uf13e";

		public const string Untappd = "\uf405";

		public const string Upload = "\uf093";

		public const string Usb = "\uf287";

		public const string UsdCircle = "\uf2e8";

		public const string UsdSquare = "\uf2e9";

		public const string User = "\uf007";

		public const string UserAlt = "\uf406";

		public const string UserAltSlash = "\uf4fa";

		public const string UserAstronaut = "\uf4fb";

		public const string UserChart = "\uf6a3";

		public const string UserCheck = "\uf4fc";

		public const string UserCircle = "\uf2bd";

		public const string UserClock = "\uf4fd";

		public const string UserCog = "\uf4fe";

		public const string UserCrown = "\uf6a4";

		public const string UserEdit = "\uf4ff";

		public const string UserFriends = "\uf500";

		public const string UserGraduate = "\uf501";

		public const string UserInjured = "\uf728";

		public const string UserLock = "\uf502";

		public const string UserMd = "\uf0f0";

		public const string UserMinus = "\uf503";

		public const string UserNinja = "\uf504";

		public const string UserPlus = "\uf234";

		public const string UserSecret = "\uf21b";

		public const string UserShield = "\uf505";

		public const string UserSlash = "\uf506";

		public const string UserTag = "\uf507";

		public const string UserTie = "\uf508";

		public const string UserTimes = "\uf235";

		public const string Users = "\uf0c0";

		public const string UsersClass = "\uf63d";

		public const string UsersCog = "\uf509";

		public const string UsersCrown = "\uf6a5";

		public const string Ussunnah = "\uf407";

		public const string UtensilFork = "\uf2e3";

		public const string UtensilKnife = "\uf2e4";

		public const string UtensilSpoon = "\uf2e5";

		public const string Utensils = "\uf2e7";

		public const string UtensilsAlt = "\uf2e6";

		public const string Vaadin = "\uf408";

		public const string ValueAbsolute = "\uf6a6";

		public const string VectorSquare = "\uf5cb";

		public const string Venus = "\uf221";

		public const string VenusDouble = "\uf226";

		public const string VenusMars = "\uf228";

		public const string Viacoin = "\uf237";

		public const string Viadeo = "\uf2a9";

		public const string ViadeoSquare = "\uf2aa";

		public const string Vial = "\uf492";

		public const string Vials = "\uf493";

		public const string Viber = "\uf409";

		public const string Video = "\uf03d";

		public const string VideoPlus = "\uf4e1";

		public const string VideoSlash = "\uf4e2";

		public const string Vihara = "\uf6a7";

		public const string Vimeo = "\uf40a";

		public const string VimeoSquare = "\uf194";

		public const string VimeoV = "\uf27d";

		public const string Vine = "\uf1ca";

		public const string Vk = "\uf189";

		public const string Vnv = "\uf40b";

		public const string Volcano = "\uf770";

		public const string VolleyballBall = "\uf45f";

		public const string Volume = "\uf6a8";

		public const string VolumeDown = "\uf027";

		public const string VolumeMute = "\uf6a9";

		public const string VolumeOff = "\uf026";

		public const string VolumeSlash = "\uf2e2";

		public const string VolumeUp = "\uf028";

		public const string VoteNay = "\uf771";

		public const string VoteYea = "\uf772";

		public const string VrCardboard = "\uf729";

		public const string Vuejs = "\uf41f";

		public const string Walking = "\uf554";

		public const string Wallet = "\uf555";

		public const string Wand = "\uf72a";

		public const string WandMagic = "\uf72b";

		public const string Warehouse = "\uf494";

		public const string WarehouseAlt = "\uf495";

		public const string Watch = "\uf2e1";

		public const string WatchFitness = "\uf63e";

		public const string Water = "\uf773";

		public const string WaterLower = "\uf774";

		public const string WaterRise = "\uf775";

		public const string Weebly = "\uf5cc";

		public const string Weibo = "\uf18a";

		public const string Weight = "\uf496";

		public const string WeightHanging = "\uf5cd";

		public const string Weixin = "\uf1d7";

		public const string Whale = "\uf72c";

		public const string Whatsapp = "\uf232";

		public const string WhatsappSquare = "\uf40c";

		public const string Wheat = "\uf72d";

		public const string Wheelchair = "\uf193";

		public const string Whistle = "\uf460";

		public const string Whmcs = "\uf40d";

		public const string Wifi = "\uf1eb";

		public const string Wifi1 = "\uf6aa";

		public const string Wifi2 = "\uf6ab";

		public const string WifiSlash = "\uf6ac";

		public const string WikipediaW = "\uf266";

		public const string Wind = "\uf72e";

		public const string WindWarning = "\uf776";

		public const string Window = "\uf40e";

		public const string WindowAlt = "\uf40f";

		public const string WindowClose = "\uf410";

		public const string WindowMaximize = "\uf2d0";

		public const string WindowMinimize = "\uf2d1";

		public const string WindowRestore = "\uf2d2";

		public const string Windows = "\uf17a";

		public const string Windsock = "\uf777";

		public const string WineBottle = "\uf72f";

		public const string WineGlass = "\uf4e3";

		public const string WineGlassAlt = "\uf5ce";

		public const string Wix = "\uf5cf";

		public const string WizardsOfTheCoast = "\uf730";

		public const string WolfPackBattalion = "\uf514";

		public const string WonSign = "\uf159";

		public const string Wordpress = "\uf19a";

		public const string WordpressSimple = "\uf411";

		public const string Wpbeginner = "\uf297";

		public const string Wpexplorer = "\uf2de";

		public const string Wpforms = "\uf298";

		public const string Wpressr = "\uf3e4";

		public const string Wrench = "\uf0ad";

		public const string XRay = "\uf497";

		public const string Xbox = "\uf412";

		public const string Xing = "\uf168";

		public const string XingSquare = "\uf169";

		public const string YCombinator = "\uf23b";

		public const string Yahoo = "\uf19e";

		public const string Yandex = "\uf413";

		public const string YandexInternational = "\uf414";

		public const string Yelp = "\uf1e9";

		public const string YenSign = "\uf157";

		public const string YinYang = "\uf6ad";

		public const string Yoast = "\uf2b1";

		public const string Youtube = "\uf167";

		public const string YoutubeSquare = "\uf431";

		public const string Zhihu = "\uf63f";
	}
}
namespace LibVLCSharp.Shared
{
	internal static class Constants
	{
		internal const string LibraryName = "libvlc";

		internal const string CoreLibraryName = "libvlccore";

		internal const string LibrariesRepositoryFolderName = "libvlc";

		internal const string Msvcrt = "msvcrt";

		internal const string UcrtStdio = "api-ms-win-crt-stdio-l1-1-0.dll";

		internal const string Libc = "libc";

		internal const string LibSystem = "libSystem";

		internal const string Kernel32 = "kernel32";

		internal const string WindowsLibraryExtension = ".dll";

		internal const string MacLibraryExtension = ".dylib";

		internal const string Lib = "lib";

		internal const string LibVLC = "libvlc";
	}
	internal static class ArchitectureNames
	{
		internal const string WinArm64 = "win-arm64";

		internal const string Win64 = "win-x64";

		internal const string Win86 = "win-x86";

		internal const string MacOS64 = "osx-x64";
	}
	[Flags]
	internal enum ErrorModes : uint
	{
		SYSTEM_DEFAULT = 0u,
		SEM_FAILCRITICALERRORS = 1u,
		SEM_NOALIGNMENTFAULTEXCEPT = 4u,
		SEM_NOGPFAULTERRORBOX = 2u,
		SEM_NOOPENFILEERRORBOX = 0x8000u
	}
	public static class Core
	{
		[StructLayout(LayoutKind.Sequential, Size = 1)]
		private struct Native
		{
			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_get_version")]
			internal static extern IntPtr LibVLCVersion();

			[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
			internal static extern IntPtr LoadLibraryW(string dllToLoad);

			[DllImport("libSystem", EntryPoint = "dlopen")]
			internal static extern IntPtr Dlopen(string libraryPath, int mode = 1);

			[DllImport("kernel32", SetLastError = true)]
			internal static extern ErrorModes SetErrorMode(ErrorModes uMode);
		}

		private static bool _libvlcLoaded;

		private static IntPtr LibvlcHandle;

		private static IntPtr LibvlccoreHandle;

		private static string LibraryExtension
		{
			get
			{
				if (!PlatformHelper.IsWindows)
				{
					return ".dylib";
				}
				return ".dll";
			}
		}

		internal static bool LibVLCLoaded
		{
			get
			{
				if (!_libvlcLoaded)
				{
					return LibvlcHandle != IntPtr.Zero;
				}
				return true;
			}
			set
			{
				_libvlcLoaded = value;
			}
		}

		private static void EnsureVersionsMatch()
		{
			int num = int.Parse(Native.LibVLCVersion().FromUtf8()?.Split(new char[1] { '.' }).FirstOrDefault() ?? "0");
			int? num2 = Assembly.GetExecutingAssembly().GetName().Version?.Major;
			if (num != num2)
			{
				throw new VLCException($"Version mismatch between LibVLC {num} and LibVLCSharp {num2}. " + "They must share the same major version number");
			}
		}

		private static string LibVLCPath(string dir)
		{
			return Path.Combine(dir, "libvlc" + LibraryExtension);
		}

		private static string LibVLCCorePath(string dir)
		{
			return Path.Combine(dir, "libvlccore" + LibraryExtension);
		}

		private static void Log(string message)
		{
			Trace.WriteLine(message);
		}

		private static List<(string libvlccore, string libvlc)> ComputeLibVLCSearchPaths()
		{
			List<(string, string)> list = new List<(string, string)>();
			string text = (PlatformHelper.IsMac ? Path.Combine("osx-x64", "lib") : ((!PlatformHelper.IsWindows) ? (PlatformHelper.IsX64BitProcess ? "win-x64" : "win-x86") : (RuntimeInformation.ProcessArchitecture switch
			{
				Architecture.X64 => "win-x64", 
				Architecture.X86 => "win-x86", 
				Architecture.Arm64 => "win-arm64", 
				_ => PlatformHelper.IsX64BitProcess ? "win-x64" : "win-x86", 
			})));
			string text2 = typeof(LibVLC).Assembly.Location;
			if (string.IsNullOrEmpty(text2))
			{
				text2 = AppContext.BaseDirectory;
			}
			string dir = Path.Combine(Path.GetDirectoryName(text2), "libvlc", text);
			string item = LibVLCCorePath(dir);
			string item2 = LibVLCPath(dir);
			list.Add((item, item2));
			string text3 = Assembly.GetEntryAssembly()?.Location ?? Assembly.GetExecutingAssembly()?.Location;
			if (!string.IsNullOrEmpty(text3))
			{
				string dir2 = Path.Combine(Path.GetDirectoryName(text3), "libvlc", text);
				string item3 = string.Empty;
				if (PlatformHelper.IsWindows)
				{
					item3 = LibVLCCorePath(dir2);
				}
				string item4 = LibVLCPath(dir2);
				list.Add((item3, item4));
			}
			string item5 = LibVLCPath(Path.GetDirectoryName(text2));
			list.Add((string.Empty, item5));
			if (text == "win-arm64")
			{
				string dir3 = Path.Combine(Path.GetDirectoryName(text2), "libvlc", "win-x64");
				string item6 = LibVLCCorePath(dir3);
				string item7 = LibVLCPath(dir3);
				list.Add((item6, item7));
				if (!string.IsNullOrEmpty(text3))
				{
					string dir4 = Path.Combine(Path.GetDirectoryName(text3), "libvlc", "win-x64");
					string item8 = LibVLCCorePath(dir4);
					string item9 = LibVLCPath(dir4);
					list.Add((item8, item9));
				}
			}
			if (PlatformHelper.IsMac)
			{
				string item10 = Path.Combine(Path.Combine(Path.GetDirectoryName(text2), "lib"), "libvlc" + LibraryExtension);
				string item11 = LibVLCCorePath(Path.Combine(Path.GetDirectoryName(text2), "lib"));
				list.Add((item11, item10));
			}
			return list;
		}

		private static void LoadLibVLC(string? libvlcDirectoryPath = null)
		{
			if (!string.IsNullOrEmpty(libvlcDirectoryPath))
			{
				string text = LibVLCCorePath(libvlcDirectoryPath);
				if (!LoadNativeLibrary(text, out LibvlccoreHandle))
				{
					Log("Failed to load required native libraries at " + text);
					return;
				}
				string text2 = LibVLCPath(libvlcDirectoryPath);
				if (!LoadNativeLibrary(text2, out LibvlcHandle))
				{
					Log("Failed to load required native libraries at " + text2);
				}
				return;
			}
			List<(string, string)> list = ComputeLibVLCSearchPaths();
			foreach (var (nativeLibraryPath, nativeLibraryPath2) in list)
			{
				LoadNativeLibrary(nativeLibraryPath, out LibvlccoreHandle);
				if (LoadNativeLibrary(nativeLibraryPath2, out LibvlcHandle))
				{
					break;
				}
			}
			if (LibVLCLoaded)
			{
				return;
			}
			throw new VLCException("Failed to load required native libraries. " + Environment.NewLine + "Have you installed the latest LibVLC package from nuget for your target platform?" + Environment.NewLine + "Search paths include " + string.Join("; ", list.Select<(string, string), string>(((string libvlccore, string libvlc) p) => p.libvlc + "," + p.libvlccore)));
		}

		internal static void EnsureLoaded()
		{
			if (!LibVLCLoaded)
			{
				Initialize();
			}
		}

		private static bool LoadNativeLibrary(string nativeLibraryPath, out IntPtr handle)
		{
			handle = IntPtr.Zero;
			Log("Loading " + nativeLibraryPath);
			if (!File.Exists(nativeLibraryPath))
			{
				Log("Cannot find " + nativeLibraryPath);
				return false;
			}
			if (PlatformHelper.IsMac)
			{
				handle = Native.Dlopen(nativeLibraryPath);
			}
			else
			{
				handle = Native.LoadLibraryW(nativeLibraryPath);
			}
			return handle != IntPtr.Zero;
		}

		public static void Initialize(string? libvlcDirectoryPath = null)
		{
			DisableMessageErrorBox();
			InitializeDesktop(libvlcDirectoryPath);
			EnsureVersionsMatch();
			LibVLCLoaded = true;
		}

		private static void DisableMessageErrorBox()
		{
			if (PlatformHelper.IsWindows)
			{
				Native.SetErrorMode(Native.SetErrorMode(ErrorModes.SYSTEM_DEFAULT) | ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOOPENFILEERRORBOX);
			}
		}

		private static void InitializeDesktop(string? libvlcDirectoryPath = null)
		{
			if (PlatformHelper.IsLinux)
			{
				if (!string.IsNullOrEmpty(libvlcDirectoryPath))
				{
					throw new InvalidOperationException("Using libvlcDirectoryPath is not supported on the Linux platform. The recommended way is to have the libvlc librairies in /usr/lib. Use LD_LIBRARY_PATH if you need more customization");
				}
			}
			else
			{
				LoadLibVLC(libvlcDirectoryPath);
			}
		}
	}
	public class Dialog
	{
		[StructLayout(LayoutKind.Sequential, Size = 1)]
		private struct Native
		{
			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_dialog_post_login")]
			internal static extern int LibVLCDialogPostLogin(IntPtr dialogId, IntPtr username, IntPtr password, bool store);

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_dialog_post_action")]
			internal static extern int LibVLCDialogPostAction(IntPtr dialogId, int actionIndex);

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_dialog_dismiss")]
			internal static extern int LibVLCDialogDismiss(IntPtr dialogId);
		}

		private IntPtr _id;

		private Dialog(IntPtr id)
		{
			if (id == IntPtr.Zero)
			{
				throw new ArgumentNullException("id");
			}
			_id = id;
		}

		internal Dialog(DialogId id)
			: this(id.NativeReference)
		{
		}

		public bool PostLogin(string? username, string? password, bool store)
		{
			if (_id == IntPtr.Zero)
			{
				throw new VLCException("Calling method on dismissed Dialog instance");
			}
			if (username == null)
			{
				username = string.Empty;
			}
			if (password == null)
			{
				password = string.Empty;
			}
			IntPtr usernamePtr = username.ToUtf8();
			IntPtr passwordPtr = password.ToUtf8();
			bool result = MarshalUtils.PerformInteropAndFree(() => Native.LibVLCDialogPostLogin(_id, usernamePtr, passwordPtr, store), usernamePtr, passwordPtr) == 0;
			_id = IntPtr.Zero;
			return result;
		}

		public bool PostAction(int actionIndex)
		{
			if (_id == IntPtr.Zero)
			{
				throw new VLCException("Calling method on dismissed Dialog instance");
			}
			bool result = Native.LibVLCDialogPostAction(_id, actionIndex) == 0;
			_id = IntPtr.Zero;
			return result;
		}

		public bool Dismiss()
		{
			if (_id == IntPtr.Zero)
			{
				return false;
			}
			bool result = Native.LibVLCDialogDismiss(_id) == 0;
			_id = IntPtr.Zero;
			return result;
		}
	}
	internal readonly struct DialogId
	{
		internal IntPtr NativeReference { get; }

		internal DialogId(IntPtr nativeReference)
		{
			NativeReference = nativeReference;
		}
	}
	public enum DialogQuestionType
	{
		Normal,
		Warning,
		Critical
	}
	public delegate Task DisplayError(string? title, string? text);
	public delegate Task DisplayLogin(Dialog dialog, string? title, string? text, string? defaultUsername, bool askStore, CancellationToken token);
	public delegate Task DisplayQuestion(Dialog dialog, string? title, string? text, DialogQuestionType type, string? cancelText, string? firstActionText, string? secondActionText, CancellationToken token);
	public delegate Task DisplayProgress(Dialog dialog, string? title, string? text, bool indeterminate, float position, string? cancelText, CancellationToken token);
	public delegate Task UpdateProgress(Dialog dialog, float position, string? text);
	public class Equalizer : Internal
	{
		[StructLayout(LayoutKind.Sequential, Size = 1)]
		private struct Native
		{
			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_new")]
			internal static extern IntPtr LibVLCAudioEqualizerNew();

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_release")]
			internal static extern void LibVLCAudioEqualizerRelease(IntPtr equalizer);

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_new_from_preset")]
			internal static extern IntPtr LibVLCAudioEqualizerNewFromPreset(uint index);

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_set_preamp")]
			internal static extern int LibVLCAudioEqualizerSetPreamp(IntPtr equalizer, float preamp);

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_get_preamp")]
			internal static extern float LibVLCAudioEqualizerGetPreamp(IntPtr equalizer);

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_set_amp_at_index")]
			internal static extern int LibVLCAudioEqualizerSetAmpAtIndex(IntPtr equalizer, float amp, uint band);

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_get_amp_at_index")]
			internal static extern float LibVLCAudioEqualizerGetAmpAtIndex(IntPtr equalizer, uint band);

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_get_preset_count")]
			internal static extern uint LibVLCAudioEqualizerGetPresetCount();

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_get_preset_name")]
			internal static extern IntPtr LibVLCAudioEqualizerGetPresetName(uint index);

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_get_band_count")]
			internal static extern uint LibVLCAudioEqualizerGetBandCount();

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_audio_equalizer_get_band_frequency")]
			internal static extern float LibVLCAudioEqualizerGetBandFrequency(uint index);
		}

		public float Preamp => Native.LibVLCAudioEqualizerGetPreamp(base.NativeReference);

		public uint PresetCount => Native.LibVLCAudioEqualizerGetPresetCount();

		public uint BandCount => Native.LibVLCAudioEqualizerGetBandCount();

		public Equalizer()
			: base(Native.LibVLCAudioEqualizerNew, Native.LibVLCAudioEqualizerRelease)
		{
		}

		public Equalizer(uint index)
			: base(() => Native.LibVLCAudioEqualizerNewFromPreset(index), Native.LibVLCAudioEqualizerRelease)
		{
		}

		public bool SetPreamp(float preamp)
		{
			return Native.LibVLCAudioEqualizerSetPreamp(base.NativeReference, preamp) == 0;
		}

		public bool SetAmp(float amp, uint band)
		{
			return Native.LibVLCAudioEqualizerSetAmpAtIndex(base.NativeReference, amp, band) == 0;
		}

		public float Amp(uint band)
		{
			return Native.LibVLCAudioEqualizerGetAmpAtIndex(base.NativeReference, band);
		}

		public string? PresetName(uint index)
		{
			return Native.LibVLCAudioEqualizerGetPresetName(index).FromUtf8();
		}

		public float BandFrequency(uint index)
		{
			return Native.LibVLCAudioEqualizerGetBandFrequency(index);
		}
	}
	internal abstract class EventManager
	{
		[StructLayout(LayoutKind.Sequential, Size = 1)]
		internal readonly struct Native
		{
			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_event_attach")]
			internal static extern int LibVLCEventAttach(IntPtr eventManager, EventType eventType, InternalEventCallback eventCallback, IntPtr userData);

			[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "libvlc_event_detach")]
			internal static extern void LibVLCEventDetach(IntPtr eventManager, EventType eventType, InternalEventCallback eventCallback, IntPtr userData);
		}

		internal class EventTypeManager : IDisposable
		{
			internal Action<IntPtr> EventHandler { get; }

			internal GCHandle Handle { get; }

			internal int HandlerCount { get; set; }

			internal EventTypeManager(Action<IntPtr> eventHandler)
			{
				EventHandler = eventHandler;
				Handle = GCHandle.Alloc(this);
			}

			public void Dispose()
			{
				Handle.Free();
			}
		}

		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
		internal delegate void InternalEventCallback(IntPtr evt, IntPtr userData);

		internal IntPtr NativeReference;

		private readonly Dictionary<EventType, EventTypeManager> _eventManagers = new Dictionary<EventType, EventTypeManager>();

		private static readonly InternalEventCallback EventCallbackHandle = EventCallback;

		protected internal EventManager(IntPtr ptr)
		{
			if (ptr == IntPtr.Zero)
			{
				throw new NullReferenceException("ptr");
			}
			NativeReference = ptr;
		}

		private bool AttachNativeEvent(EventType eventType, EventTypeManager eventManager)
		{
			return Native.LibVLCEventAttach(NativeReference, eventType, EventCallbackHandle, GCHandle.ToIntPtr(eventManager.Handle)) == 0;
		}

		private void DetachNativeEvent(EventType eventType, EventTypeManager eventManager)
		{
			Native.LibVLCEventDetach(NativeReference, eventType, EventCallbackHandle, GCHandle.ToIntPtr(eventManager.Handle));
		}

		protected void Attach(EventType eventType, Action<IntPtr> eventHandler)
		{
			lock (_eventManagers)
			{
				if (!_eventManagers.TryGetValue(eventType, out EventTypeManager value))
				{
					value = new EventTypeManager(eventHandler);
					if (!AttachNativeEvent(eventType, value))
					{
						value.Dispose();
						throw new VLCException($"Could not attach event {eventType}");
					}
					_eventManagers.Add(eventType, value);
				}
				value.HandlerCount++;
			}
		}

		protected void Detach(EventType eventType)
		{
			lock (_eventManagers)
			{
				if (_eventManagers.TryGetValue(eventType, out EventTypeManager value))
				{
					value.HandlerCount--;
					if (value.HandlerCount == 0)
					{
						DetachNativeEvent(eventType, value);
						value.Dispose();
						_eventManagers.Remove(eventType);
					}
				}
			}
		}

		[MonoPInvokeCallback(typeof(InternalEventCallback))]
		private static void EventCallback(IntPtr evt, IntPtr userDa

BepInEx/plugins/OdinOnDemand.dll

Decompiled 3 days ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using JetBrains.Annotations;
using Jotunn;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Managers;
using Jotunn.Utils;
using LibVLCSharp.Shared;
using Microsoft.CodeAnalysis;
using Microsoft.Win32;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using OdinOnDemand.Components;
using OdinOnDemand.Dynamic;
using OdinOnDemand.Interfaces;
using OdinOnDemand.MPlayer;
using OdinOnDemand.Patches;
using OdinOnDemand.Utils;
using OdinOnDemand.Utils.Config;
using OdinOnDemand.Utils.Net;
using OdinOnDemand.Utils.Net.Explode;
using OdinOnDemand.Utils.UI;
using SoundCloudExplode;
using SoundCloudExplode.Tracks;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.UI;
using UnityEngine.Video;
using YoutubeDLSharp;
using YoutubeDLSharp.Options;
using YoutubeExplode;
using YoutubeExplode.Common;
using YoutubeExplode.Playlists;
using YoutubeExplode.Videos;
using YoutubeExplode.Videos.Streams;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = "")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace OdinOnDemand
{
	[BepInPlugin("com.valmedia.odinondemand", "OdinOnDemand", "1.2.5")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	internal class OdinOnDemandPlugin : BaseUnityPlugin
	{
		public const string PluginGUID = "com.valmedia.odinondemand";

		public const string PluginName = "OdinOnDemand";

		public const string PluginVersion = "1.2.5";

		private static readonly CustomLocalization Localization = LocalizationManager.Instance.GetLocalization();

		public static readonly RpcHandler RPCHandlers = new RpcHandler();

		public static Material MainScreenMat;

		public static Dictionary<string, Sprite> UISprites;

		private AssetBundle _valMediaAssets;

		private static Harmony _harmony;

		private static string _pieceRecipeFile;

		private static string _itemRecipeFile;

		private static readonly string OdinConfigFolder = Paths.ConfigPath + "/OdinOnDemand/";

		public static ConfigFile OdinConfig { get; private set; } = new ConfigFile(OdinConfigFolder + "config.cfg", true);

		public StationManager StationManager { get; private set; }

		private void Awake()
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Expected O, but got Unknown
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Expected O, but got Unknown
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Expected O, but got Unknown
			OODConfig.Bind(OdinConfig);
			_pieceRecipeFile = OdinConfigFolder + "/recipes.json";
			_itemRecipeFile = OdinConfigFolder + "/recipes_item.json";
			OODConfig.SyncManager();
			RPCHandlers.Create();
			GameObject val = new GameObject("OODStationMan");
			StationManager = val.AddComponent<StationManager>();
			Object.DontDestroyOnLoad((Object)(object)val);
			AddLocalizations();
			LoadAssets();
			PrefabManager.OnVanillaPrefabsAvailable += AddCartVariant;
			ConfigFile val2 = new ConfigFile(Path.Combine(OdinConfigFolder, "com.ood.valmedia.keyconfig.cfg"), true);
			SynchronizationManager.Instance.RegisterCustomConfig(val2);
			KeyConfig.SetupKeyConfig(val2);
			_harmony = new Harmony("Harmony.ValMedia.OOD");
			_harmony.PatchAll();
			Logger.LogDebug((object)"** OdinOnDemand Initialized **");
		}

		private static void AddCartVariant()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Expected O, but got Unknown
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected O, but got Unknown
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Expected O, but got Unknown
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Expected O, but got Unknown
			PieceConfig val = new PieceConfig();
			val.Name = "Bard's Wagon";
			val.Description = "A mobile media player on wheels, controlled by a remote.";
			val.PieceTable = "Hammer";
			val.Category = "OOD";
			val.AddRequirement(new RequirementConfig("Wood", 26, 0, true));
			val.AddRequirement(new RequirementConfig("Bronze", 2, 0, true));
			val.AddRequirement(new RequirementConfig("BronzeNails", 14, 0, true));
			AssetBundle val2 = AssetUtils.LoadAssetBundleFromResources("videoplayers", typeof(OdinOnDemandPlugin).Assembly);
			GameObject val3 = val2.LoadAsset<GameObject>("assets/cartplayer_attach.prefab");
			val.Icon = val2.LoadAsset<Sprite>("assets/MOD ICONS/cartplayericon.png");
			CustomPiece val4 = new CustomPiece("cartplayer", "Cart", val);
			if (PieceManager.Instance.AddPiece(val4))
			{
				PieceCategoryPatch.Apply(val4.Piece);
				GameObject prefab = PrefabManager.Instance.GetPrefab("cartplayer");
				Object.Instantiate<GameObject>(val3, prefab.transform, true);
				((Component)prefab.transform.Find("cartplayer_attach(Clone)")).gameObject.AddComponent<CartPlayerComponent>();
			}
			val2.Unload(false);
			PrefabManager.OnVanillaPrefabsAvailable -= AddCartVariant;
		}

		private void LoadAssets()
		{
			_valMediaAssets = AssetUtils.LoadAssetBundleFromResources("videoplayers", typeof(OdinOnDemandPlugin).Assembly);
			Logger.LogDebug((object)"Loading OdinOnDemand Assets");
			AddRecipes();
			MainScreenMat = _valMediaAssets.LoadAsset<Material>("assets/MOD MATS/screenmaterial.mat");
			UISprites = new Dictionary<string, Sprite>();
			string[] allAssetNames = _valMediaAssets.GetAllAssetNames();
			foreach (string text in allAssetNames)
			{
				if (text.Contains("modui"))
				{
					Sprite val = _valMediaAssets.LoadAsset<Sprite>(text);
					UISprites.Add(((Object)val).name, val);
				}
			}
			_valMediaAssets.Unload(false);
		}

		private void AddRecipes()
		{
			if (!File.Exists(_pieceRecipeFile))
			{
				WriteDefaultPieceConfig("default.json");
				Logger.LogDebug((object)("Did not find recipe json, loading and writing default recipes to: " + _pieceRecipeFile));
			}
			if (!File.Exists(_itemRecipeFile))
			{
				WriteDefaultItemConfig("default_items.json");
				Logger.LogDebug((object)("Did not find item recipe json, loading and writing default recipes to: " + _itemRecipeFile));
			}
			string text = File.ReadAllText(_pieceRecipeFile);
			if (!IsValidJson(text))
			{
				WriteDefaultPieceConfig("default.json");
				Logger.LogWarning((object)"JSON in com.ood.valmedia.recipes.json is invalid. Setting to default recipes. If you wish to edit recipes please use a JSON validator or delete your recipe file and restart the game for a new default file.");
			}
			string text2 = File.ReadAllText(_itemRecipeFile);
			if (!IsValidJson(text2))
			{
				WriteDefaultItemConfig("default_items.json");
				Logger.LogWarning((object)"JSON in com.ood.valmedia.recipes_item.json is invalid. Setting to default recipes. If you wish to edit recipes please use a JSON validator or delete your recipe file and restart the game for a new default file.");
			}
			if ((!text.Contains("receiver") || !text.Contains("theater") || !text.Contains("speaker")) && OODConfig.AutoUpdateRecipes.Value)
			{
				Logger.LogDebug((object)"Old recipe file detected. Updating to new recipes.");
				List<PieceConfig> oldRecipes = PieceConfig.ListFromJson(text);
				string newRecipes = FileFromManifest("OdinOnDemand.Assets.default.json");
				UpdateRecipeFile(newRecipes, oldRecipes, _pieceRecipeFile);
			}
			else if (!OODConfig.AutoUpdateRecipes.Value)
			{
				Logger.LogWarning((object)"Auto recipe update disabled. Skipping recipe update.");
			}
			LoadPieceConfigList(PieceConfig.ListFromJson(text));
			LoadItemConfigList(ItemConfig.ListFromJson(text2));
		}

		private void UpdateRecipeFile(string newRecipes, List<PieceConfig> oldRecipes, string file)
		{
			if (newRecipes != "")
			{
				List<PieceConfig> recipesToMerge = PieceConfig.ListFromJson(newRecipes);
				MergeRecipes(oldRecipes, recipesToMerge);
				try
				{
					string contents = JsonConvert.SerializeObject((object)PieceConfigDTO.ToDTOList(oldRecipes), (Formatting)1);
					File.WriteAllText(file, contents);
					return;
				}
				catch (Exception ex)
				{
					Logger.LogError((object)"Failed to write new recipes to file. Check log for details.");
					Logger.LogWarning((object)ex);
					return;
				}
			}
			Logger.LogError((object)"FATAL Failed to load default recipes.");
		}

		private static void MergeRecipes(List<PieceConfig> mergeRecipe, List<PieceConfig> recipesToMerge)
		{
			foreach (PieceConfig newRecipe in recipesToMerge)
			{
				if (!mergeRecipe.Any((PieceConfig r) => r.Name == newRecipe.Name))
				{
					mergeRecipe.Add(newRecipe);
				}
			}
		}

		private void WriteDefaultPieceConfig(string fileName)
		{
			try
			{
				string pieceRecipeFile = _pieceRecipeFile;
				string value = FileFromManifest("OdinOnDemand.Assets." + fileName);
				StreamWriter streamWriter = File.CreateText(pieceRecipeFile);
				streamWriter.Write(value);
				streamWriter.Close();
				streamWriter.Dispose();
			}
			catch (Exception ex)
			{
				Logger.LogError((object)"Exception when handling default recipe file. Check log for details.");
				Logger.LogWarning((object)ex);
			}
		}

		private void WriteDefaultItemConfig(string fileName)
		{
			try
			{
				string itemRecipeFile = _itemRecipeFile;
				string value = FileFromManifest("OdinOnDemand.Assets." + fileName);
				StreamWriter streamWriter = File.CreateText(itemRecipeFile);
				streamWriter.Write(value);
				streamWriter.Close();
				streamWriter.Dispose();
			}
			catch (Exception ex)
			{
				Logger.LogError((object)"Exception when handling default recipe file. Check log for details.");
				Logger.LogWarning((object)ex);
			}
		}

		private static string FileFromManifest(string file)
		{
			string result = "";
			using Stream stream = typeof(OdinOnDemandPlugin).Assembly.GetManifestResourceStream(file);
			if (stream != null)
			{
				using StreamReader streamReader = new StreamReader(stream);
				result = streamReader.ReadToEnd();
			}
			return result;
		}

		private void LoadPieceConfigList(List<PieceConfig> pieceConfigs)
		{
			pieceConfigs.ForEach(delegate(PieceConfig c)
			{
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: 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_008f: Expected O, but got Unknown
				string text = LocalizationManager.Instance.TryTranslate(c.Name).ToLower().Replace(" ", "")
					.Replace("'", "");
				Texture2D val = _valMediaAssets.LoadAsset<Texture2D>("assets/MOD ICONS/" + text + "icon.png");
				Sprite icon = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), Vector2.zero);
				c.Icon = icon;
				CustomPiece val2 = new CustomPiece(_valMediaAssets, text, false, c);
				if (PieceManager.Instance.AddPiece(val2))
				{
					PieceCategoryPatch.Apply(val2.Piece);
				}
			});
		}

		private void LoadItemConfigList(List<ItemConfig> itemConfigs)
		{
			itemConfigs.ForEach(delegate(ItemConfig c)
			{
				//IL_0058: Unknown result type (might be due to invalid IL or missing references)
				//IL_0062: Expected O, but got Unknown
				string text = LocalizationManager.Instance.TryTranslate(c.Name).ToLower().Replace(" ", "")
					.Replace("'", "");
				((BaseUnityPlugin)this).Logger.LogDebug((object)("Adding item: " + text));
				ItemManager.Instance.AddItem(new CustomItem(_valMediaAssets, text, false, c));
			});
		}

		private void AddLocalizations()
		{
			CustomLocalization localization = Localization;
			string text = "English";
			localization.AddTranslation(ref text, new Dictionary<string, string>
			{
				{ "tag_odinondemand", "OdinOnDemand" },
				{ "piece_flatscreen", "Flatscreen" },
				{ "piece_tabletv", "Table TV" },
				{ "piece_boombox", "Boombox" },
				{ "piece_oldtv", "Old TV" },
				{ "piece_laptop", "Laptop" },
				{ "piece_monitor", "Monitor" },
				{ "piece_gramophone", "Gramophone" },
				{ "piece_theaterscreen", "Theater Screen" },
				{ "piece_receiver", "Receiver" },
				{ "piece_studiospeaker", "Studio Speaker" },
				{ "piece_radio", "Radio" },
				{ "piece_standingspeaker", "Standing Speaker" },
				{ "item_remote", "Remote Control" },
				{ "item_skaldsgirdle", "Skald's Girdle" },
				{ "remote_usehint", "Use Screen" },
				{ "remote_linkhint", "Link/Unlink" },
				{ "skaldsgirdle_hint", "Consult Skald" },
				{ "remote_changelinkmodehint", "Change Link Mode" },
				{ "item_remote_description", "Allows you to use media-players from a distance." },
				{ "item_skaldsgirdle_description", "Allows you to commune with Skald while traveling." }
			});
		}

		private static bool IsValidJson(string strInput)
		{
			//IL_0057: Expected O, but got Unknown
			if (string.IsNullOrWhiteSpace(strInput))
			{
				return false;
			}
			strInput = strInput.Trim();
			if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || (strInput.StartsWith("[") && strInput.EndsWith("]")))
			{
				try
				{
					JToken.Parse(strInput);
					return true;
				}
				catch (JsonReaderException ex)
				{
					Logger.LogWarning((object)((Exception)ex).Message);
					return false;
				}
				catch (Exception ex2)
				{
					Logger.LogWarning((object)ex2.ToString());
					return false;
				}
			}
			return false;
		}
	}
}
namespace OdinOnDemand.Patches
{
	[HarmonyPatch(typeof(Trader), "GetAvailableItems")]
	public class HaldorCustomPatch
	{
		private static void Postfix(ref List<TradeItem> __result)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//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_0059: Expected O, but got Unknown
			List<TradeItem> list = new List<TradeItem>();
			if (OODConfig.SkaldsGirdleEnabled.Value)
			{
				GameObject prefab = PrefabManager.Instance.GetPrefab("skaldsgirdle");
				if ((Object)(object)prefab != (Object)null)
				{
					list.Add(new TradeItem
					{
						m_prefab = prefab.GetComponent<ItemDrop>(),
						m_stack = 1,
						m_price = OODConfig.SkaldsGirdleCost.Value
					});
				}
			}
			__result = __result.Concat(list).ToList();
		}
	}
	public class PlacePiecePatch
	{
		[HarmonyPatch(typeof(Player), "PlacePiece", new Type[]
		{
			typeof(Piece),
			typeof(Vector3),
			typeof(Quaternion),
			typeof(bool),
			typeof(bool)
		})]
		private static class PlacePiece_Patch
		{
			private static bool Prefix(Piece piece)
			{
				if (Pieces.Contains(((Object)((Component)piece).gameObject).name) && OODConfig.VipMode.Value)
				{
					RankSystem.PlayerRank rank = RankSystem.GetRank();
					if (rank != RankSystem.PlayerRank.Admin && rank != RankSystem.PlayerRank.Vip)
					{
						RankSystem.DisplayBlockMenu();
						return false;
					}
				}
				return true;
			}
		}

		private static readonly string[] Pieces = new string[9] { "flatscreen", "theaterscreen", "tabletv", "monitor", "oldtv", "laptop", "radio", "boombox", "gramophone" };
	}
	public static class PieceCategoryPatch
	{
		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		private static class ByUsagePieceListPatch
		{
			private static void Postfix(ByUsagePieceList __instance)
			{
				FieldInfo fieldInfo = AccessTools.Field(typeof(ByUsagePieceList), "m_usageTags");
				FieldInfo fieldInfo2 = AccessTools.Field(typeof(ByUsagePieceList), "m_usageTagDisplayNames");
				if (fieldInfo == null || fieldInfo2 == null)
				{
					return;
				}
				UsageTagFlags[] array = (UsageTagFlags[])fieldInfo.GetValue(__instance);
				string[] array2 = (string[])fieldInfo2.GetValue(__instance);
				if (array == null || array2 == null || array.Length != array2.Length)
				{
					return;
				}
				UsageTagFlags[] array3 = array;
				for (int i = 0; i < array3.Length; i++)
				{
					if ((int)array3[i] == 1048576)
					{
						return;
					}
				}
				UsageTagFlags[] array4 = (UsageTagFlags[])(object)new UsageTagFlags[array.Length + 1];
				string[] array5 = new string[array2.Length + 1];
				array.CopyTo(array4, 0);
				array2.CopyTo(array5, 0);
				array4[array.Length] = (UsageTagFlags)1048576;
				array5[array2.Length] = "$tag_odinondemand";
				fieldInfo.SetValue(__instance, array4);
				fieldInfo2.SetValue(__instance, array5);
				Logger.LogDebug((object)string.Format("Added build menu usage tag {0} at index {1}", "$tag_odinondemand", array.Length));
			}
		}

		internal const UsageTagFlags OodUsage = (UsageTagFlags)1048576;

		private const string UsageDisplayToken = "$tag_odinondemand";

		internal static void Apply(Piece piece)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)piece == (Object)null))
			{
				piece.m_usage = (UsageTagFlags)(piece.m_usage | 0x100000);
				piece.m_category = (PieceCategory)4;
			}
		}
	}
	[HarmonyPatch(typeof(Player), "RemovePiece")]
	public class RemovePiecePatch
	{
		private static readonly string[] Pieces = new string[9] { "flatscreen", "theaterscreen", "tabletv", "monitor", "oldtv", "laptop", "radio", "boombox", "gramophone" };

		[HarmonyPrefix]
		public static bool PrefixRemovePiece(ref Player __instance)
		{
			//IL_0018: 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_0043: 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)
			if (!OODConfig.VipMode.Value)
			{
				return true;
			}
			RaycastHit val = default(RaycastHit);
			if (!Physics.Raycast(((Component)GameCamera.instance).transform.position, ((Component)GameCamera.instance).transform.forward, ref val, 50f, __instance.m_removeRayMask) || (double)Vector3.Distance(((RaycastHit)(ref val)).point, ((Character)__instance).m_eye.position) >= (double)__instance.m_maxPlaceDistance)
			{
				return false;
			}
			Piece componentInParent = ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<Piece>();
			if (!Object.op_Implicit((Object)(object)componentInParent) || !componentInParent.m_canBeRemoved)
			{
				return false;
			}
			if (Pieces.Contains(((Object)((Component)componentInParent).gameObject).name.Replace("(Clone)", "")) && OODConfig.VipMode.Value)
			{
				RankSystem.PlayerRank rank = RankSystem.GetRank();
				if (rank != RankSystem.PlayerRank.Admin && rank != RankSystem.PlayerRank.Vip)
				{
					RankSystem.DisplayBlockMenu();
					return false;
				}
			}
			return true;
		}
	}
}
namespace OdinOnDemand.MPlayer
{
	internal sealed class ChunkedHttpMediaInput : MediaInput
	{
		private const int FirstChunkSize = 262144;

		private const int MaxChunkSize = 4194304;

		private const int RequestTimeoutMs = 30000;

		private const int MaxAttempts = 3;

		private readonly string url;

		private readonly IDictionary<string, string> headers;

		private byte[] chunk;

		private long chunkStart;

		private int chunkLength;

		private int chunkSize = 262144;

		private long position;

		private long totalLength = -1L;

		public ChunkedHttpMediaInput(string url, IDictionary<string, string> headers)
		{
			this.url = url;
			this.headers = headers;
		}

		public override bool Open(out ulong size)
		{
			size = 0uL;
			try
			{
				if (!FetchChunk(0L))
				{
					return false;
				}
				if (totalLength < 0)
				{
					return false;
				}
				position = 0L;
				size = (ulong)totalLength;
				return true;
			}
			catch (Exception ex)
			{
				Logger.LogWarning((object)("Could not open the media stream: " + ex.Message));
				return false;
			}
		}

		public override int Read(IntPtr buf, uint len)
		{
			if (len == 0)
			{
				return 0;
			}
			try
			{
				if (totalLength >= 0 && position >= totalLength)
				{
					return 0;
				}
				if (!EnsureChunkContains(position))
				{
					return -1;
				}
				int num = (int)(position - chunkStart);
				int num2 = chunkLength - num;
				if (num2 <= 0)
				{
					return 0;
				}
				int num3 = Math.Min(num2, (int)len);
				Marshal.Copy(chunk, num, buf, num3);
				position += num3;
				return num3;
			}
			catch (Exception ex)
			{
				Logger.LogWarning((object)("Media stream read failed: " + ex.Message));
				return -1;
			}
		}

		public override bool Seek(ulong offset)
		{
			if (totalLength >= 0 && (long)offset > totalLength)
			{
				return false;
			}
			position = (long)offset;
			return true;
		}

		public override void Close()
		{
			chunk = null;
			chunkLength = 0;
			chunkStart = 0L;
			chunkSize = 262144;
			position = 0L;
		}

		private bool EnsureChunkContains(long offset)
		{
			if (chunk != null && offset >= chunkStart && offset < chunkStart + chunkLength)
			{
				return true;
			}
			return FetchChunk(offset);
		}

		private bool FetchChunk(long offset)
		{
			long num = offset + chunkSize - 1;
			if (totalLength >= 0 && num > totalLength - 1)
			{
				num = totalLength - 1;
			}
			if (num < offset)
			{
				return false;
			}
			for (int i = 1; i <= 3; i++)
			{
				try
				{
					HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
					httpWebRequest.Method = "GET";
					httpWebRequest.Timeout = 30000;
					httpWebRequest.ReadWriteTimeout = 30000;
					httpWebRequest.AllowAutoRedirect = true;
					httpWebRequest.KeepAlive = true;
					ApplyHeaders(httpWebRequest);
					httpWebRequest.AddRange(offset, num);
					using HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
					using Stream stream = httpWebResponse.GetResponseStream();
					if (stream == null)
					{
						return false;
					}
					ReadTotalLength(httpWebResponse);
					int num2 = (int)(num - offset + 1);
					byte[] buffer = ((chunk != null && chunk.Length >= num2) ? chunk : new byte[num2]);
					int j;
					int num3;
					for (j = 0; j < num2; j += num3)
					{
						num3 = stream.Read(buffer, j, num2 - j);
						if (num3 <= 0)
						{
							break;
						}
					}
					if (j <= 0)
					{
						return false;
					}
					chunk = buffer;
					chunkStart = offset;
					chunkLength = j;
					if (chunkSize < 4194304)
					{
						chunkSize = Math.Min(chunkSize * 4, 4194304);
					}
					return true;
				}
				catch (WebException ex)
				{
					Logger.LogWarning((object)$"Media chunk {offset}-{num} failed (attempt {i}/{3}): {ex.Message}");
					if (i == 3)
					{
						return false;
					}
				}
			}
			return false;
		}

		private void ReadTotalLength(HttpWebResponse response)
		{
			if (totalLength >= 0)
			{
				return;
			}
			string text = response.Headers["Content-Range"];
			if (!string.IsNullOrEmpty(text))
			{
				int num = text.LastIndexOf('/');
				if (num >= 0 && long.TryParse(text.Substring(num + 1), NumberStyles.Integer, CultureInfo.InvariantCulture, out var result))
				{
					totalLength = result;
					return;
				}
			}
			if (response.StatusCode == HttpStatusCode.OK && response.ContentLength >= 0)
			{
				totalLength = response.ContentLength;
			}
		}

		private void ApplyHeaders(HttpWebRequest request)
		{
			request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36";
			if (headers == null)
			{
				return;
			}
			foreach (KeyValuePair<string, string> header in headers)
			{
				string key = header.Key;
				if (!key.Equals("Range", StringComparison.OrdinalIgnoreCase) && !key.Equals("Connection", StringComparison.OrdinalIgnoreCase) && !key.Equals("Host", StringComparison.OrdinalIgnoreCase) && !key.Equals("Content-Length", StringComparison.OrdinalIgnoreCase) && !key.Equals("Accept-Encoding", StringComparison.OrdinalIgnoreCase))
				{
					if (key.Equals("User-Agent", StringComparison.OrdinalIgnoreCase))
					{
						request.UserAgent = header.Value;
					}
					else if (key.Equals("Accept", StringComparison.OrdinalIgnoreCase))
					{
						request.Accept = header.Value;
					}
					else if (key.Equals("Referer", StringComparison.OrdinalIgnoreCase))
					{
						request.Referer = header.Value;
					}
					else
					{
						request.Headers[key] = header.Value;
					}
				}
			}
		}
	}
	public abstract class BasePlayer : MonoBehaviour, IPlayer
	{
		private enum NetworkStreamKind
		{
			Media,
			Live,
			Website
		}

		private YoutubeDecoder youtubeDecoder;

		private int playbackGeneration;

		private double pendingPlaybackTime;

		private bool hasPendingPlaybackTime;

		private bool youtubeBackendActive;

		private bool youtubeLoading;

		private CancellationTokenSource networkCancellation;

		private float indicatorHoldUntil;

		private Coroutine videoOutputWatch;

		private const float VideoOutputWatchSeconds = 3f;

		internal HashSet<SpeakerComponent> mSpeakers = new HashSet<SpeakerComponent>();

		private Transform centerAudioSphere;

		protected SphereCollider triggerCollider;

		public VideoPlayer mScreen { get; set; }

		public AudioSource mAudio { get; set; }

		public Piece mPiece { get; internal set; }

		public Animator Animator { get; set; }

		protected GameObject ScreenPlaneObj { get; set; }

		protected internal GameObject ScreenUICanvasObj { get; set; }

		protected GameObject RadioPanelObj { get; set; }

		protected Coroutine DynamicStationCoroutine { get; set; }

		protected internal GameObject LoadingCircleObj { get; set; }

		protected Material TargetTexMat { get; set; }

		public string mName { get; set; }

		public string MediaPlayerID { get; set; }

		public string UnparsedURL { get; set; }

		public Uri DownloadURL { get; set; }

		public int PlaylistPosition { get; set; }

		public string PlaylistString { get; set; }

		public List<VideoInfo> CurrentPlaylist { get; set; }

		public List<VideoInfo> PreShufflePlaylist { get; set; }

		public string PlaylistURL { get; set; }

		public PlayerSettings PlayerSettings { get; set; }

		public UIController UIController { get; set; }

		protected static AudioFader AudioFaderComp { get; set; }

		protected ParticleSystem WaveParticleSystem { get; set; }

		public URLGrab URLGrab { get; set; }

		public DLSharp Ytdl { get; set; }

		public RpcHandler RPC { get; set; }

		public ZNetView ZNetView { get; set; }

		public double PlaybackTime
		{
			get
			{
				if (youtubeBackendActive && (Object)(object)youtubeDecoder != (Object)null)
				{
					return youtubeDecoder.Time;
				}
				if (UsesVlcBackend())
				{
					if (!hasPendingPlaybackTime)
					{
						return 0.0;
					}
					return pendingPlaybackTime;
				}
				if (IsVideoLink())
				{
					if (!((Object)(object)mScreen != (Object)null))
					{
						return 0.0;
					}
					return mScreen.time;
				}
				if ((Object)(object)mAudio != (Object)null && (Object)(object)mAudio.clip != (Object)null)
				{
					return mAudio.time;
				}
				if (!hasPendingPlaybackTime)
				{
					return 0.0;
				}
				return pendingPlaybackTime;
			}
		}

		public double PlaybackDuration
		{
			get
			{
				if (youtubeBackendActive && (Object)(object)youtubeDecoder != (Object)null)
				{
					return youtubeDecoder.Length;
				}
				if (UsesVlcBackend())
				{
					return 0.0;
				}
				if (IsVideoLink())
				{
					if (!((Object)(object)mScreen != (Object)null))
					{
						return 0.0;
					}
					return mScreen.length;
				}
				if (!((Object)(object)mAudio != (Object)null) || !((Object)(object)mAudio.clip != (Object)null))
				{
					return 0.0;
				}
				return mAudio.clip.length;
			}
		}

		public bool IsVideoPlaying
		{
			get
			{
				if (IsVideoLink())
				{
					return IsPlaybackPlaying();
				}
				return false;
			}
		}

		public void Awake()
		{
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Expected O, but got Unknown
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Expected O, but got Unknown
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Expected O, but got Unknown
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Expected O, but got Unknown
			ComponentLists.MediaComponentLists[((object)this).GetType()].Add(this);
			UIController = new UIController(this);
			PlayerSettings = new PlayerSettings();
			ZNetView = ((Component)this).GetComponent<ZNetView>();
			UIController.Initialize();
			RPC = OdinOnDemandPlugin.RPCHandlers;
			URLGrab = new URLGrab();
			ZNetView = ((Component)this).gameObject.GetComponentInParent<ZNetView>();
			mScreen = ((Component)this).gameObject.GetComponentInChildren<VideoPlayer>();
			mScreen.prepareCompleted += new EventHandler(ScreenPrepareCompleted);
			mScreen.loopPointReached += new EventHandler(EndReached);
			mScreen.errorReceived += new ErrorEventHandler(ScreenErrorReceived);
			SetupAudio();
			((MonoBehaviour)this).InvokeRepeating("UpdateLoadingIndicator", 0.5f, 0.5f);
			((MonoBehaviour)this).InvokeRepeating("UpdateChecks", 1f, 1f);
			((MonoBehaviour)this).InvokeRepeating("SyncTime", OODConfig.SyncTime.Value + 30f, OODConfig.SyncTime.Value);
			Ytdl = ((Component)this).gameObject.AddComponent<DLSharp>();
			((MonoBehaviour)this).StartCoroutine(Ytdl.Setup());
			ZDO zDO = ZNetView.GetZDO();
			if (Object.op_Implicit((Object)(object)ZNetScene.instance) && zDO != null)
			{
				if (!zDO.GetString("MediaPlayerID", "").Equals(""))
				{
					RequestOwnership(zDO);
					string text = GenerateUniqueID();
					zDO.Set("MediaPlayerID", text);
					SendUpdateZDO_RPC();
				}
				MediaPlayerID = zDO.GetString("MediaPlayerID", "");
			}
			if (OODConfig.AudioFadeType.Value != OODConfig.FadeType.None && (Object)(object)AudioFader.Instance == (Object)null && (Object)(object)GameObject.Find("OODAudioFader") == (Object)null)
			{
				GameObject val = new GameObject("OODAudioFader");
				AudioFaderComp = val.AddComponent<AudioFader>();
				Object.DontDestroyOnLoad((Object)val);
			}
		}

		public void OnDestroy()
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			//IL_004c: 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_006d: Expected O, but got Unknown
			playbackGeneration++;
			CancelNetworkPreparation();
			DestroyYoutubeBackend();
			if ((Object)(object)mScreen != (Object)null)
			{
				mScreen.prepareCompleted -= new EventHandler(ScreenPrepareCompleted);
				mScreen.loopPointReached -= new EventHandler(EndReached);
				mScreen.errorReceived -= new ErrorEventHandler(ScreenErrorReceived);
			}
			ComponentLists.RemoveComponent(((object)this).GetType(), this);
		}

		private void EndReached(VideoPlayer source)
		{
			if (!UsesVlcBackend())
			{
				HandlePlaybackEnded();
			}
		}

		private void YoutubeEnded()
		{
			if (youtubeBackendActive)
			{
				HandlePlaybackEnded();
			}
		}

		private void HandlePlaybackEnded()
		{
			if (PlayerSettings.IsPlayingPlaylist)
			{
				if (PlaylistPosition < CurrentPlaylist.Count - 1)
				{
					SetLooping(looping: false);
					PlaylistPosition++;
					SetURL(CurrentPlaylist[PlaylistPosition].Url);
					return;
				}
				if (PlayerSettings.IsLooping)
				{
					SetLooping(looping: false);
					PlaylistPosition = 0;
					SetURL(CurrentPlaylist[PlaylistPosition].Url);
					return;
				}
			}
			if (IsPlaybackLooping())
			{
				PlayerSettings.IsPlaying = true;
				PlayerSettings.IsPaused = false;
				return;
			}
			if (PlayerSettings.PlayerType == CinemaPackage.MediaPlayers.Radio && Object.op_Implicit((Object)(object)Animator) && !IsPlaybackLooping() && !PlayerSettings.IsPlayingPlaylist)
			{
				Animator.SetBool(PlayerSettings.Playing, false);
			}
			PlayerSettings.IsPlaying = IsPlaybackPlaying();
			PlayerSettings.IsPaused = false;
		}

		private void ScreenPrepareCompleted(VideoPlayer source)
		{
			if (!UsesVlcBackend())
			{
				CompletePreparation();
			}
		}

		private void YoutubePrepared()
		{
			if (youtubeBackendActive && !((Object)(object)youtubeDecoder == (Object)null))
			{
				CompletePreparation();
			}
		}

		private void CompletePreparation()
		{
			youtubeLoading = false;
			if (PlayerSettings.PlayerType == CinemaPackage.MediaPlayers.CinemaScreen && Object.op_Implicit((Object)(object)ScreenPlaneObj))
			{
				ScreenPlaneObj.SetActive(true);
			}
			if (Object.op_Implicit((Object)(object)UIController.LoadingIndicatorObj))
			{
				UIController.LoadingIndicatorObj.SetActive(false);
			}
			if (Object.op_Implicit((Object)(object)ScreenUICanvasObj) && Object.op_Implicit((Object)(object)LoadingCircleObj))
			{
				ScreenUICanvasObj.SetActive(false);
				LoadingCircleObj.SetActive(false);
			}
			ApplyPendingPlaybackTime();
			((MonoBehaviour)this).StartCoroutine(DelayedExecution(0.5f, SendRequestTimeSync_RPC));
			PlayerSettings.IsPlaying = true;
			if (PlayerSettings.IsPaused)
			{
				PauseCurrentBackend();
				if (Object.op_Implicit((Object)(object)Animator))
				{
					Animator.SetBool(PlayerSettings.Playing, false);
				}
				if (Object.op_Implicit((Object)(object)WaveParticleSystem))
				{
					WaveParticleSystem.Stop();
				}
				return;
			}
			PlayCurrentBackend();
			if (Object.op_Implicit((Object)(object)Animator))
			{
				Animator.SetBool(PlayerSettings.Playing, true);
			}
			if (Object.op_Implicit((Object)(object)WaveParticleSystem) && OODConfig.MobilePlayerVisuals.Value)
			{
				WaveParticleSystem.Play();
			}
			UpdateRadioPanel();
			if (videoOutputWatch != null)
			{
				((MonoBehaviour)this).StopCoroutine(videoOutputWatch);
			}
			videoOutputWatch = ((MonoBehaviour)this).StartCoroutine(WatchForVideoOutput(playbackGeneration));
		}

		private IEnumerator WatchForVideoOutput(int generation)
		{
			float deadline = Time.time + 3f;
			while (Time.time < deadline)
			{
				yield return (object)new WaitForSeconds(0.25f);
				if (generation != playbackGeneration)
				{
					break;
				}
				if (HasVideoContent())
				{
					if (Object.op_Implicit((Object)(object)RadioPanelObj))
					{
						RadioPanelObj.SetActive(false);
					}
					break;
				}
			}
		}

		private void ScreenErrorReceived(VideoPlayer source, string message)
		{
			if (!UsesVlcBackend())
			{
				HandlePlaybackError(message);
			}
		}

		private void YoutubeError(string message)
		{
			if (youtubeBackendActive)
			{
				HandlePlaybackError(message);
				DestroyYoutubeBackend();
			}
		}

		private void HandlePlaybackError(string message)
		{
			youtubeLoading = false;
			Logger.LogError((object)("Media playback failed: " + message));
			PlayerSettings.IsPlaying = false;
			PlayerSettings.IsPaused = false;
			if (Object.op_Implicit((Object)(object)Animator))
			{
				Animator.SetBool(PlayerSettings.Playing, false);
			}
			if (Object.op_Implicit((Object)(object)WaveParticleSystem))
			{
				WaveParticleSystem.Stop();
			}
			if (Object.op_Implicit((Object)(object)ScreenUICanvasObj) && Object.op_Implicit((Object)(object)LoadingCircleObj))
			{
				ScreenUICanvasObj.SetActive(false);
				LoadingCircleObj.SetActive(false);
			}
			if (Object.op_Implicit((Object)(object)UIController.LoadingIndicatorObj))
			{
				UIController.SetLoadingIndicatorText("Failed to load media");
				HoldLoadingIndicator();
				((MonoBehaviour)this).StartCoroutine(ResetLoadingIndicatorAfterDelay(playbackGeneration));
			}
		}

		internal void HoldLoadingIndicator()
		{
			indicatorHoldUntil = Time.time + 8f;
			UIController.SetLoadingIndicatorActive(active: true);
		}

		private static string LiveChannelTitle(string service, Uri uri)
		{
			string text = uri.AbsolutePath.Trim(new char[1] { '/' });
			int num = text.IndexOf('/');
			if (num > 0)
			{
				text = text.Substring(0, num);
			}
			if (text.Length != 0)
			{
				return service + ": " + text;
			}
			return service;
		}

		public void SetLooping(bool looping)
		{
			if (youtubeBackendActive && (Object)(object)youtubeDecoder != (Object)null)
			{
				youtubeDecoder.IsLooping = looping && !PlayerSettings.IsPlayingPlaylist;
			}
			else if (!UsesVlcBackend())
			{
				if ((Object)(object)mScreen != (Object)null)
				{
					mScreen.isLooping = looping && !PlayerSettings.IsPlayingPlaylist;
				}
				if ((Object)(object)mAudio != (Object)null)
				{
					mAudio.loop = looping;
				}
			}
		}

		private bool UsesVlcBackend()
		{
			if (PlayerSettings.PlayerLinkType != PlayerSettings.LinkType.Youtube && PlayerSettings.PlayerLinkType != PlayerSettings.LinkType.NetworkStream)
			{
				return PlayerSettings.PlayerLinkType == PlayerSettings.LinkType.LiveChannel;
			}
			return true;
		}

		private bool IsVideoLink()
		{
			if (!UsesVlcBackend() && PlayerSettings.PlayerLinkType != PlayerSettings.LinkType.RelativeVideo)
			{
				return PlayerSettings.PlayerLinkType == PlayerSettings.LinkType.Video;
			}
			return true;
		}

		private bool HasVideoContent()
		{
			if (youtubeBackendActive && (Object)(object)youtubeDecoder != (Object)null)
			{
				return youtubeDecoder.HasVideoTrack;
			}
			return IsVideoLink();
		}

		private bool IsPlaybackPlaying()
		{
			if (youtubeBackendActive && (Object)(object)youtubeDecoder != (Object)null)
			{
				return youtubeDecoder.IsPlaying;
			}
			if (UsesVlcBackend())
			{
				return false;
			}
			if (IsVideoLink())
			{
				if ((Object)(object)mScreen != (Object)null)
				{
					return mScreen.isPlaying;
				}
				return false;
			}
			if ((Object)(object)mAudio != (Object)null)
			{
				return mAudio.isPlaying;
			}
			return false;
		}

		private bool IsPlaybackPrepared()
		{
			if (youtubeBackendActive && (Object)(object)youtubeDecoder != (Object)null)
			{
				return youtubeDecoder.IsPrepared;
			}
			if (UsesVlcBackend())
			{
				return false;
			}
			if (IsVideoLink())
			{
				if ((Object)(object)mScreen != (Object)null)
				{
					return mScreen.isPrepared;
				}
				return false;
			}
			if ((Object)(object)mAudio != (Object)null)
			{
				return (Object)(object)mAudio.clip != (Object)null;
			}
			return false;
		}

		private bool IsPlaybackLooping()
		{
			if (youtubeBackendActive && (Object)(object)youtubeDecoder != (Object)null)
			{
				return youtubeDecoder.IsLooping;
			}
			if (UsesVlcBackend())
			{
				return PlayerSettings.IsLooping;
			}
			if (IsVideoLink())
			{
				if ((Object)(object)mScreen != (Object)null)
				{
					return mScreen.isLooping;
				}
				return false;
			}
			if ((Object)(object)mAudio != (Object)null)
			{
				return mAudio.loop;
			}
			return false;
		}

		private void PlayCurrentBackend()
		{
			if (youtubeBackendActive && (Object)(object)youtubeDecoder != (Object)null)
			{
				if (youtubeDecoder.IsPrepared)
				{
					youtubeDecoder.Play();
				}
			}
			else
			{
				if (UsesVlcBackend())
				{
					return;
				}
				if (IsVideoLink())
				{
					if ((Object)(object)mScreen != (Object)null)
					{
						mScreen.Play();
					}
				}
				else if (!((Object)(object)mAudio == (Object)null) && !((Object)(object)mAudio.clip == (Object)null))
				{
					mAudio.UnPause();
					if (!mAudio.isPlaying)
					{
						mAudio.Play();
					}
				}
			}
		}

		private void PauseCurrentBackend()
		{
			if (youtubeBackendActive && (Object)(object)youtubeDecoder != (Object)null)
			{
				if (youtubeDecoder.IsPrepared)
				{
					youtubeDecoder.Pause();
				}
			}
			else
			{
				if (UsesVlcBackend())
				{
					return;
				}
				if (IsVideoLink())
				{
					if ((Object)(object)mScreen != (Object)null)
					{
						mScreen.Pause();
					}
				}
				else if ((Object)(object)mAudio != (Object)null)
				{
					mAudio.Pause();
				}
			}
		}

		private void ApplyPendingPlaybackTime()
		{
			if (!hasPendingPlaybackTime)
			{
				return;
			}
			if (youtubeBackendActive && (Object)(object)youtubeDecoder != (Object)null)
			{
				if (!youtubeDecoder.IsPrepared)
				{
					return;
				}
				youtubeDecoder.Time = pendingPlaybackTime;
			}
			else
			{
				if (UsesVlcBackend())
				{
					return;
				}
				if (IsVideoLink())
				{
					if ((Object)(object)mScreen == (Object)null || !mScreen.isPrepared)
					{
						return;
					}
					mScreen.time = pendingPlaybackTime;
				}
				else
				{
					if (!((Object)(object)mAudio != (Object)null) || !((Object)(object)mAudio.clip != (Object)null))
					{
						return;
					}
					mAudio.time = Mathf.Clamp((float)pendingPlaybackTime, 0f, mAudio.clip.length);
				}
			}
			hasPendingPlaybackTime = false;
		}

		private int BeginSourceSwitch(double initialTime)
		{
			playbackGeneration++;
			CancelNetworkPreparation();
			DestroyYoutubeBackend();
			if (DynamicStationCoroutine != null)
			{
				((MonoBehaviour)this).StopCoroutine(DynamicStationCoroutine);
				DynamicStationCoroutine = null;
			}
			if ((Object)(object)mScreen != (Object)null)
			{
				mScreen.Stop();
				mScreen.url = "";
				mScreen.isLooping = false;
				mScreen.audioOutputMode = (VideoAudioOutputMode)1;
				if ((Object)(object)mAudio != (Object)null)
				{
					mScreen.SetTargetAudioSource((ushort)0, mAudio);
				}
			}
			if ((Object)(object)mAudio != (Object)null)
			{
				mAudio.Stop();
				mAudio.clip = null;
				mAudio.loop = false;
			}
			pendingPlaybackTime = Math.Max(0.0, initialTime);
			hasPendingPlaybackTime = true;
			return playbackGeneration;
		}

		private void DestroyYoutubeBackend()
		{
			youtubeLoading = false;
			youtubeBackendActive = false;
			if (!((Object)(object)youtubeDecoder == (Object)null))
			{
				youtubeDecoder.Prepared -= YoutubePrepared;
				youtubeDecoder.Ended -= YoutubeEnded;
				youtubeDecoder.Error -= YoutubeError;
				youtubeDecoder.Stop();
				((Behaviour)youtubeDecoder).enabled = false;
				Object.Destroy((Object)(object)youtubeDecoder);
				youtubeDecoder = null;
			}
		}

		private void PrepareVlcBackend(string videoUrl, string audioUrl, int generation, IDictionary<string, string> headers = null, bool useChunkedInput = true, bool isLive = false)
		{
			if (generation != playbackGeneration || !UsesVlcBackend())
			{
				return;
			}
			DestroyYoutubeBackend();
			youtubeLoading = true;
			if ((Object)(object)mScreen != (Object)null)
			{
				mScreen.Stop();
				mScreen.url = "";
			}
			if ((Object)(object)mAudio != (Object)null)
			{
				mAudio.Stop();
				mAudio.clip = null;
				mAudio.loop = false;
			}
			youtubeDecoder = ((Component)this).gameObject.AddComponent<YoutubeDecoder>();
			youtubeBackendActive = true;
			youtubeDecoder.Prepared += YoutubePrepared;
			youtubeDecoder.Ended += YoutubeEnded;
			youtubeDecoder.Error += YoutubeError;
			youtubeDecoder.IsLooping = PlayerSettings.IsLooping && !PlayerSettings.IsPlayingPlaylist;
			try
			{
				youtubeDecoder.Prepare(videoUrl, audioUrl, mAudio, ((Object)(object)mScreen != (Object)null) ? mScreen.targetTexture : null, headers, useChunkedInput, isLive);
			}
			catch (Exception ex)
			{
				HandlePlaybackError(ex.Message);
				DestroyYoutubeBackend();
			}
		}

		private void CancelNetworkPreparation()
		{
			networkCancellation?.Cancel();
			networkCancellation = null;
		}

		private IEnumerator PlayLiveChannel(string url, string service, int generation)
		{
			youtubeLoading = true;
			UIController.SetLoadingIndicatorText("Resolving " + service);
			if (Object.op_Implicit((Object)(object)UIController.LoadingIndicatorObj))
			{
				UIController.LoadingIndicatorObj.SetActive(true);
			}
			using CancellationTokenSource cancellation = new CancellationTokenSource();
			networkCancellation = cancellation;
			Task<string> resolution = StreamlinkRuntime.ResolveAsync(url, OODConfig.MaxVideoHeight.Value, cancellation.Token);
			yield return (object)new WaitUntil((Func<bool>)(() => resolution.IsCompleted));
			if (networkCancellation == cancellation)
			{
				networkCancellation = null;
			}
			Exception ex = resolution.Exception?.GetBaseException();
			if (generation != playbackGeneration || resolution.IsCanceled)
			{
				yield break;
			}
			if (ex != null)
			{
				HandlePlaybackError(ex.Message);
				if (Object.op_Implicit((Object)(object)UIController.LoadingIndicatorObj))
				{
					UIController.SetLoadingIndicatorText(ex.Message);
				}
				yield break;
			}
			PrepareVlcBackend(resolution.Result, null, generation, null, useChunkedInput: false, isLive: true);
		}

		private IEnumerator PrepareNetworkStream(string url, int generation)
		{
			youtubeLoading = true;
			CancellationTokenSource cancellation = new CancellationTokenSource();
			try
			{
				networkCancellation = cancellation;
				cancellation.CancelAfter(TimeSpan.FromSeconds(10.0));
				Task<NetworkStreamKind> probe = Task.Run(() => ProbeNetworkStream(url, cancellation.Token));
				yield return (object)new WaitUntil((Func<bool>)(() => probe.IsCompleted));
				if (networkCancellation == cancellation)
				{
					networkCancellation = null;
				}
				Exception ex = probe.Exception?.GetBaseException();
				if (generation == playbackGeneration)
				{
					if (ex != null || probe.IsCanceled)
					{
						HandlePlaybackError(ex?.Message ?? "Network stream classification timed out.");
					}
					else if (probe.Result == NetworkStreamKind.Website)
					{
						PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.Youtube;
						PlayYoutube(url, generation);
					}
					else
					{
						PrepareVlcBackend(url, null, generation, null, useChunkedInput: false, probe.Result == NetworkStreamKind.Live);
					}
				}
			}
			finally
			{
				if (cancellation != null)
				{
					((IDisposable)cancellation).Dispose();
				}
			}
		}

		private static NetworkStreamKind ProbeNetworkStream(string url, CancellationToken cancellationToken)
		{
			Uri result = new Uri(url);
			for (int i = 0; i < 4; i++)
			{
				cancellationToken.ThrowIfCancellationRequested();
				HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(result);
				httpWebRequest.Timeout = 10000;
				httpWebRequest.ReadWriteTimeout = 10000;
				httpWebRequest.MaximumAutomaticRedirections = 4;
				httpWebRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
				using (cancellationToken.Register(httpWebRequest.Abort))
				{
					using HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
					string text = httpWebResponse.ContentType ?? "";
					if (text.StartsWith("text/html", StringComparison.OrdinalIgnoreCase) || text.StartsWith("application/xhtml+xml", StringComparison.OrdinalIgnoreCase))
					{
						return NetworkStreamKind.Website;
					}
					if (httpWebResponse.Headers["icy-metaint"] != null || httpWebResponse.Headers["icy-name"] != null || httpWebResponse.Headers["icy-br"] != null)
					{
						return NetworkStreamKind.Live;
					}
					using Stream stream = httpWebResponse.GetResponseStream();
					byte[] array = new byte[10];
					int j;
					int num;
					for (j = 0; j < array.Length; j += num)
					{
						cancellationToken.ThrowIfCancellationRequested();
						num = stream.Read(array, j, array.Length - j);
						if (num == 0)
						{
							break;
						}
					}
					if (!Encoding.UTF8.GetString(array, 0, j).TrimStart(new char[1] { '\ufeff' }).StartsWith("#EXTM3U", StringComparison.Ordinal))
					{
						return NetworkStreamKind.Media;
					}
					string s;
					using (MemoryStream memoryStream = new MemoryStream())
					{
						memoryStream.Write(array, 0, j);
						byte[] array2 = new byte[4096];
						int num2;
						while ((num2 = stream.Read(array2, 0, array2.Length)) > 0)
						{
							cancellationToken.ThrowIfCancellationRequested();
							if (memoryStream.Length + num2 > 262144)
							{
								throw new InvalidDataException("HLS playlist exceeds the classification limit.");
							}
							memoryStream.Write(array2, 0, num2);
						}
						s = Encoding.UTF8.GetString(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
					}
					bool flag = false;
					bool flag2 = false;
					bool flag3 = false;
					string text2 = null;
					string text3 = null;
					using (StringReader stringReader = new StringReader(s))
					{
						string text4;
						while ((text4 = stringReader.ReadLine()) != null)
						{
							text4 = text4.Trim();
							if (text4 == "#EXT-X-ENDLIST" || text4 == "#EXT-X-PLAYLIST-TYPE:VOD")
							{
								flag2 = true;
							}
							if (text4.StartsWith("#EXT-X-TARGETDURATION:", StringComparison.Ordinal))
							{
								flag = true;
							}
							if (text4.StartsWith("#EXT-X-STREAM-INF:", StringComparison.Ordinal))
							{
								flag3 = true;
							}
							else if (flag3 && text4.Length > 0 && text4[0] != '#')
							{
								if (text2 == null)
								{
									text2 = text4;
								}
								flag3 = false;
							}
							else if (text3 == null && text4.StartsWith("#EXT-X-MEDIA:", StringComparison.Ordinal))
							{
								Match match = Regex.Match(text4, "[:,]URI=\"([^\"]+)\"");
								if (match.Success)
								{
									text3 = match.Groups[1].Value;
								}
							}
						}
					}
					if (flag)
					{
						return (!flag2) ? NetworkStreamKind.Live : NetworkStreamKind.Media;
					}
					string text5 = text2 ?? text3;
					if (text5 == null || !Uri.TryCreate(httpWebResponse.ResponseUri, text5, out result) || (result.Scheme != Uri.UriSchemeHttp && result.Scheme != Uri.UriSchemeHttps))
					{
						throw new InvalidDataException("HLS playlist has no supported media variant.");
					}
				}
			}
			throw new InvalidDataException("HLS playlist nesting exceeds the classification limit.");
		}

		private void UpdateChecks()
		{
			float num = default(float);
			mAudio.outputAudioMixerGroup.audioMixer.GetFloat("MasterVolume", ref num);
			if (PlayerSettings.PlayerType == CinemaPackage.MediaPlayers.CinemaScreen)
			{
				if (num != OODConfig.MasterVolumeScreen.Value)
				{
					mAudio.outputAudioMixerGroup.audioMixer.SetFloat("MasterVolume", OODConfig.MasterVolumeScreen.Value);
				}
			}
			else if (PlayerSettings.PlayerType == CinemaPackage.MediaPlayers.BeltPlayer || PlayerSettings.PlayerType == CinemaPackage.MediaPlayers.CartPlayer)
			{
				if (num != OODConfig.MasterVolumeTransport.Value)
				{
					mAudio.outputAudioMixerGroup.audioMixer.SetFloat("MasterVolume", OODConfig.MasterVolumeTransport.Value);
				}
			}
			else if (num != OODConfig.MasterVolumeMusicplayer.Value)
			{
				mAudio.outputAudioMixerGroup.audioMixer.SetFloat("MasterVolume", OODConfig.MasterVolumeMusicplayer.Value);
			}
			UIController.UpdateMediaInfo();
			if (!IsPlaybackPlaying() && !IsPlaybackLooping() && (!IsVideoLink() || !IsPlaybackPrepared()) && (Object)(object)Animator != (Object)null)
			{
				Animator.SetBool(PlayerSettings.Playing, false);
			}
			if (Object.op_Implicit((Object)(object)triggerCollider) && triggerCollider.radius != mAudio.maxDistance)
			{
				triggerCollider.radius = mAudio.maxDistance;
			}
		}

		public void SetURL(string url)
		{
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			Encoding uTF = Encoding.UTF8;
			byte[] bytes = uTF.GetBytes(url);
			url = StreamlinkRuntime.NormalizeChannelUrl(uTF.GetString(bytes));
			UnparsedURL = url;
			if (UnparsedURL == "")
			{
				Stop(isRPC: true);
			}
			else
			{
				if (!Object.op_Implicit((Object)(object)((IPlayer)this).mScreen) && !Object.op_Implicit((Object)(object)mAudio))
				{
					return;
				}
				if (url.Contains("youtube.com/watch?v=") || url.Contains("youtube.com/shorts/") || url.Contains("youtu.be") || url.Contains("youtube.com/playlist"))
				{
					UIController.UpdatePlaylistInfo();
					if (url.Contains("?list=") || url.Contains("&list="))
					{
						SetPlaylist(UnparsedURL);
						return;
					}
				}
				UpdatePlayerTime(0f);
				PlayerSettings.IsPaused = false;
				PlayerSettings.IsPlaying = true;
				RPC.SendData(0L, CinemaPackage.RPCDataType.SetVideoUrl, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, 0f, UnparsedURL, CinemaPackage.PlayerStatus.Playing);
				SaveZDO();
			}
		}

		private void SetPlaylist(string url)
		{
			((MonoBehaviour)this).StartCoroutine(URLGrab.GetYouTubePlaylistCoroutine(url, delegate(List<VideoInfo> videoInfos)
			{
				if (videoInfos != null)
				{
					CurrentPlaylist = videoInfos;
					PlayerSettings.IsPlayingPlaylist = true;
					PlaylistPosition = 0;
					if (OODConfig.DebugEnabled.Value)
					{
						Logger.LogDebug((object)"Playlist info");
						Logger.LogDebug((object)("Count: " + CurrentPlaylist.Count));
						Logger.LogDebug((object)CurrentPlaylist.ToString());
						Logger.LogDebug((object)("Playing first url of " + CurrentPlaylist.ElementAt(PlaylistPosition).Url));
					}
					PlaylistURL = url;
					SetURL(CurrentPlaylist.ElementAt(PlaylistPosition).Url);
					if (Object.op_Implicit((Object)(object)UIController.URLPanelObj))
					{
						UIController.UpdatePlaylistUI();
						UIController.ToggleShuffleObj.GetComponentInChildren<Text>().text = "N";
						UIController.ToggleShuffleObj.SetActive(true);
						UIController.ToggleShuffleTextObj.SetActive(true);
					}
				}
				else
				{
					Logger.LogError((object)"Failed to load playlist");
				}
			}));
		}

		public void Play(bool isRPC = false)
		{
			//IL_009a: 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)
			if (PlayerSettings.CurrentMode == PlayerSettings.PlayerMode.Dynamic && !isRPC)
			{
				if (PlayerSettings.DynamicStation != null)
				{
					RPC.SendData(0L, CinemaPackage.RPCDataType.RequestStation, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, 0f, PlayerSettings.DynamicStation.Title);
				}
				return;
			}
			if (!isRPC)
			{
				RPC.SendData(0L, CinemaPackage.RPCDataType.Play, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, GetTime());
				PlayerSettings.IsPlaying = true;
				PlayerSettings.IsPaused = false;
				SaveZDO();
				return;
			}
			if (PlayerSettings.PlayerType == CinemaPackage.MediaPlayers.CinemaScreen && Object.op_Implicit((Object)(object)ScreenPlaneObj))
			{
				ScreenPlaneObj.SetActive(true);
			}
			PlayCurrentBackend();
			PlayerSettings.IsPlaying = true;
			PlayerSettings.IsPaused = false;
			if (Object.op_Implicit((Object)(object)Animator))
			{
				Animator.SetBool(PlayerSettings.Playing, true);
			}
			if (Object.op_Implicit((Object)(object)WaveParticleSystem) && OODConfig.MobilePlayerVisuals.Value && (IsPlaybackPlaying() || IsPlaybackPrepared()))
			{
				WaveParticleSystem.Play();
			}
		}

		public void PlayStation(string stationName)
		{
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			DynamicStation station = StationManager.Instance.GetStation(stationName);
			PlayerSettings.DynamicStation = station;
			PlayerSettings.IsPlaying = true;
			PlayerSettings.IsPaused = false;
			PlayerSettings.CurrentMode = PlayerSettings.PlayerMode.Dynamic;
			UnparsedURL = PlayerSettings.DynamicStation.Title;
			RPC.SendData(0L, CinemaPackage.RPCDataType.RequestStation, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, 0f, stationName);
			SaveZDO();
		}

		public void RPC_PlayStation(string dataURL, string trackTitle, float time)
		{
			DynamicStation station = StationManager.Instance.GetStation(dataURL);
			Track track = station?.Tracks.FirstOrDefault((Track x) => x.Title == trackTitle);
			if (track != null)
			{
				station.CurrentTrackIndex = station.Tracks.IndexOf(track);
				station.Tracks[station.CurrentTrackIndex].CurrentTime = time;
				PlayerSettings.CurrentMode = PlayerSettings.PlayerMode.Dynamic;
				PlayerSettings.DynamicStation = station;
				PlayerSettings.IsPlaying = true;
				PlayerSettings.IsPaused = false;
				InitiateDynamicStationPlayback();
				((MonoBehaviour)this).StartCoroutine(DelayedExecution(2f, SendRequestTimeSync_RPC));
			}
		}

		private void InitiateDynamicStationPlayback()
		{
			Track track = PlayerSettings.DynamicStation.Tracks[PlayerSettings.DynamicStation.CurrentTrackIndex];
			BeginSourceSwitch(track.CurrentTime);
			PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.Audio;
			mAudio.loop = PlayerSettings.IsLooping;
			mAudio.clip = track.AudioClip;
			ApplyPendingPlaybackTime();
			foreach (KeyValuePair<Type, IList> mediaComponentList in ComponentLists.MediaComponentLists)
			{
				foreach (BasePlayer item in mediaComponentList.Value)
				{
					if (!((Object)(object)item == (Object)(object)this) && Object.op_Implicit((Object)(object)item) && item.PlayerSettings.DynamicStation != null && item.PlayerSettings.CurrentMode == PlayerSettings.PlayerMode.Dynamic && item.PlayerSettings.DynamicStation.Title == PlayerSettings.DynamicStation.Title && item.PlayerSettings.IsPlaying && !item.PlayerSettings.IsPaused)
					{
						item.BeginSourceSwitch(track.CurrentTime);
						item.PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.Audio;
						item.mAudio.loop = item.PlayerSettings.IsLooping;
						item.mAudio.clip = track.AudioClip;
						item.ApplyPendingPlaybackTime();
						item.mAudio.Play();
						item.DynamicStationCoroutine = ((MonoBehaviour)item).StartCoroutine(item.AudioEndEvent(track.AudioClip.length - item.mAudio.time, item.PlayNextDynamicStationTrack));
					}
				}
			}
			mAudio.Play();
			PlayerSettings.IsPlaying = true;
			PlayerSettings.IsPaused = false;
			PlayerSettings.IsPlayingPlaylist = false;
			PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.Audio;
			PlayerSettings.CurrentMode = PlayerSettings.PlayerMode.Dynamic;
			UnparsedURL = PlayerSettings.DynamicStation.Title;
			PlayerSettings.MediaTitle = PlayerSettings.DynamicStation.Title;
			float time = track.AudioClip.length - mAudio.time;
			DynamicStationCoroutine = ((MonoBehaviour)this).StartCoroutine(AudioEndEvent(time, PlayNextDynamicStationTrack));
			if (Object.op_Implicit((Object)(object)WaveParticleSystem))
			{
				WaveParticleSystem.Play();
			}
			if (Object.op_Implicit((Object)(object)Animator))
			{
				Animator.SetBool(PlayerSettings.Playing, true);
			}
			UpdateRadioPanel();
		}

		private void PlayNextDynamicStationTrack()
		{
			if (PlayerSettings.DynamicStation == null)
			{
				return;
			}
			mAudio.Stop();
			mAudio.clip = null;
			((MonoBehaviour)this).StartCoroutine(DelayedExecution(0.35f, delegate
			{
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				if (PlayerSettings.CurrentMode == PlayerSettings.PlayerMode.Dynamic && PlayerSettings.DynamicStation != null)
				{
					RPC.SendData(0L, CinemaPackage.RPCDataType.RequestStation, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, 0f, PlayerSettings.DynamicStation.Title);
					((MonoBehaviour)this).StartCoroutine(DelayedExecution(2f, SendRequestTimeSync_RPC));
				}
			}));
		}

		private IEnumerator AudioEndEvent(float time, Action method)
		{
			yield return (object)new WaitForSeconds(time);
			method?.Invoke();
		}

		public void UpdateRadioPanel()
		{
			if (!Object.op_Implicit((Object)(object)RadioPanelObj) || !Object.op_Implicit((Object)(object)UIController.RadioPanelThumbnail) || (!IsPlaybackPlaying() && !IsPlaybackPrepared()))
			{
				return;
			}
			bool flag = PlayerSettings.DynamicStation != null && PlayerSettings.CurrentMode == PlayerSettings.PlayerMode.Dynamic;
			if (!flag && HasVideoContent())
			{
				RadioPanelObj.SetActive(false);
				return;
			}
			if (Object.op_Implicit((Object)(object)ScreenUICanvasObj))
			{
				ScreenUICanvasObj.SetActive(true);
			}
			if (Object.op_Implicit((Object)(object)ScreenPlaneObj))
			{
				ScreenPlaneObj.SetActive(true);
			}
			if ((Object)(object)mScreen != (Object)null)
			{
				ClearRenderTexture(mScreen.targetTexture);
			}
			RadioPanelObj.SetActive(true);
			UIController.RadioPanelThumbnail.sprite = (flag ? PlayerSettings.DynamicStation.Thumbnail : PlayerSettings.Thumbnail);
		}

		public void Pause(bool isRPC = false)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			if (!isRPC)
			{
				RPC.SendData(0L, CinemaPackage.RPCDataType.Pause, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, GetTime());
				PlayerSettings.IsPaused = true;
				SaveZDO();
				return;
			}
			PlayerSettings.IsPaused = true;
			PauseCurrentBackend();
			if (Object.op_Implicit((Object)(object)Animator))
			{
				Animator.SetBool(PlayerSettings.Playing, false);
			}
			if (Object.op_Implicit((Object)(object)WaveParticleSystem))
			{
				WaveParticleSystem.Stop();
			}
		}

		private void SetupAudio()
		{
			centerAudioSphere = ((Component)this).transform.Find("audio/centerSphere");
			mAudio = ((Component)this).gameObject.GetComponentInChildren<AudioSource>();
			mAudio.maxDistance = OODConfig.DefaultDistance.Value;
			PlayerSettings.Volume = OODConfig.DefaultAudioSourceVolume.Value;
			mAudio.spatialBlend = 1f;
			mAudio.spatialize = true;
			mAudio.spatializePostEffects = true;
			mAudio.volume = PlayerSettings.Volume;
			if ((Object)(object)mScreen != (Object)null)
			{
				mScreen.audioOutputMode = (VideoAudioOutputMode)1;
				mScreen.SetTargetAudioSource((ushort)0, mAudio);
			}
		}

		protected void SetupRadioPanel()
		{
			if (Object.op_Implicit((Object)(object)RadioPanelObj))
			{
				UIController.RadioPanelThumbnail = ((Component)RadioPanelObj.transform.Find("thumbnail")).GetComponent<Image>();
			}
			if (Object.op_Implicit((Object)(object)ScreenUICanvasObj))
			{
				Transform val = ScreenUICanvasObj.transform.Find("mainCanvas/radioPanel/waveformPanel");
				if (Object.op_Implicit((Object)(object)val))
				{
					((Component)val).gameObject.AddComponent<AudioWaveformVisualizer>().Setup(mAudio);
				}
			}
			if (Object.op_Implicit((Object)(object)UIController.RadioPanelThumbnail))
			{
				if (PlayerSettings.DynamicStation != null && PlayerSettings.CurrentMode == PlayerSettings.PlayerMode.Dynamic)
				{
					UIController.RadioPanelThumbnail.sprite = PlayerSettings.DynamicStation.Thumbnail;
				}
				if ((Object)(object)PlayerSettings.Thumbnail != (Object)null)
				{
					UIController.RadioPanelThumbnail.sprite = PlayerSettings.Thumbnail;
				}
				else
				{
					UIController.RadioPanelThumbnail.sprite = null;
				}
			}
		}

		protected void UpdateLoadingIndicator()
		{
			if ((URLGrab.LoadingBool || youtubeLoading) && !string.IsNullOrEmpty(UnparsedURL))
			{
				if (Object.op_Implicit((Object)(object)ScreenUICanvasObj) && Object.op_Implicit((Object)(object)LoadingCircleObj) && Object.op_Implicit((Object)(object)RadioPanelObj))
				{
					ScreenUICanvasObj.SetActive(true);
					RadioPanelObj.SetActive(false);
					LoadingCircleObj.SetActive(true);
				}
				UIController?.SetLoadingIndicatorActive(active: true);
				int num = PlayerSettings.LoadingCount % 4;
				if (UIController != null && (Object)(object)UIController.LoadingIndicatorObj != (Object)null)
				{
					UIController.LoadingIndicatorObj.GetComponent<Text>().text = UIController.LoadingMessages[num];
				}
				PlayerSettings.LoadingCount++;
			}
			else if (Time.time >= indicatorHoldUntil && Object.op_Implicit((Object)(object)UIController.LoadingIndicatorObj) && UIController.LoadingIndicatorObj.activeSelf)
			{
				UIController.SetLoadingIndicatorActive(active: false);
			}
		}

		public void Stop(bool isRPC = false)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			if (!isRPC)
			{
				RPC.SendData(0L, CinemaPackage.RPCDataType.Stop, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, GetTime());
				return;
			}
			PlayerSettings.DynamicStation = null;
			BeginSourceSwitch(0.0);
			hasPendingPlaybackTime = false;
			if (PlayerSettings.PlayerType == CinemaPackage.MediaPlayers.CinemaScreen)
			{
				ScreenPlaneObj.SetActive(false);
				if (Object.op_Implicit((Object)(object)ScreenUICanvasObj) && Object.op_Implicit((Object)(object)LoadingCircleObj))
				{
					ScreenUICanvasObj.SetActive(false);
					LoadingCircleObj.SetActive(false);
				}
			}
			if (Object.op_Implicit((Object)(object)Animator))
			{
				Animator.SetBool(PlayerSettings.Playing, false);
			}
			if (Object.op_Implicit((Object)(object)WaveParticleSystem))
			{
				WaveParticleSystem.Stop();
			}
			PlayerSettings.IsPlayingPlaylist = false;
			PlayerSettings.IsPlaying = false;
			PlayerSettings.IsPaused = false;
			CurrentPlaylist = null;
			URLGrab.Reset();
			ClearRenderTexture(mScreen.targetTexture);
			UnparsedURL = null;
			DownloadURL = null;
			PlaylistURL = null;
			PlaylistString = null;
			PlaylistPosition = 0;
			UIController.SetInputFieldText("");
			UIController.UpdatePlaylistUI();
			SaveZDO();
			SendUpdateZDO_RPC();
		}

		protected IEnumerator AudioWebRequest(Uri url, int generation)
		{
			DownloadHandlerAudioClip dh = new DownloadHandlerAudioClip(url, (AudioType)13)
			{
				compressed = false
			};
			UnityWebRequest wr = new UnityWebRequest(url, "GET", (DownloadHandler)(object)dh, (UploadHandler)null);
			try
			{
				yield return wr.SendWebRequest();
				if (generation != playbackGeneration)
				{
					yield break;
				}
				if ((int)wr.result == 3 || (int)wr.result == 2)
				{
					Logger.LogError((object)wr.error);
					yield break;
				}
				mAudio.clip = dh.audioClip;
				ApplyPendingPlaybackTime();
				if (!PlayerSettings.IsPaused)
				{
					mAudio.Play();
				}
				((MonoBehaviour)this).StartCoroutine(DelayedExecution(0.5f, SendRequestTimeSync_RPC));
				PlayerSettings.IsPlaying = true;
				if (Object.op_Implicit((Object)(object)Animator))
				{
					Animator.SetBool(PlayerSettings.Playing, !PlayerSettings.IsPaused);
				}
				if (Object.op_Implicit((Object)(object)WaveParticleSystem) && OODConfig.MobilePlayerVisuals.Value && !PlayerSettings.IsPaused)
				{
					WaveParticleSystem.Play();
				}
				if (Object.op_Implicit((Object)(object)ScreenUICanvasObj))
				{
					ScreenUICanvasObj.SetActive(true);
				}
				UpdateRadioPanel();
				UIController.ResetLoadingIndicator();
			}
			finally
			{
				((IDisposable)wr)?.Dispose();
			}
		}

		private IEnumerator CreateThumbnailFromURL(Uri url, int generation)
		{
			DownloadHandlerTexture val = new DownloadHandlerTexture(true);
			UnityWebRequest wr = new UnityWebRequest(url, "GET", (DownloadHandler)(object)val, (UploadHandler)null);
			try
			{
				yield return wr.SendWebRequest();
				if (generation == playbackGeneration)
				{
					if ((int)wr.result == 3 || (int)wr.result == 2)
					{
						Logger.LogError((object)("Error downloading image: " + wr.error));
						yield break;
					}
					Texture2D content = DownloadHandlerTexture.GetContent(wr);
					Rect val2 = default(Rect);
					((Rect)(ref val2))..ctor(0f, 0f, (float)((Texture)content).width, (float)((Texture)content).height);
					Vector2 val3 = default(Vector2);
					((Vector2)(ref val3))..ctor(0.5f, 0.5f);
					PlayerSettings.Thumbnail = Sprite.Create(content, val2, val3);
				}
			}
			finally
			{
				((IDisposable)wr)?.Dispose();
			}
		}

		public void PlaySoundcloud(string sentUrl, bool isRPC)
		{
			int generation = playbackGeneration;
			Uri url = URLGrab.CleanUrl(sentUrl);
			UIController.SetLoadingIndicatorText("Processing");
			UIController.SetLoadingIndicatorActive(active: true);
			if (sentUrl != null)
			{
				((MonoBehaviour)this).StartCoroutine(URLGrab.GetSoundcloudExplodeCoroutine(url, delegate(Uri resultUrl, Uri artworkUri, string title)
				{
					if (generation == playbackGeneration)
					{
						if (resultUrl != null)
						{
							if (artworkUri != null)
							{
								((MonoBehaviour)this).StartCoroutine(CreateThumbnailFromURL(artworkUri, generation));
							}
							else
							{
								PlayerSettings.Thumbnail = null;
							}
							if (!string.IsNullOrEmpty(title))
							{
								PlayerSettings.MediaTitle = title;
							}
							((MonoBehaviour)this).StartCoroutine(AudioWebRequest(resultUrl, generation));
						}
						else
						{
							UIController.SetLoadingIndicatorText("Null, check logs");
							Logger.LogWarning((object)"Failed to load Soundcloud");
							((MonoBehaviour)this).StartCoroutine(ResetLoadingIndicatorAfterDelay(generation));
						}
					}
				}));
			}
			else
			{
				Logger.LogInfo((object)"Soundcloud Null, check for exceptions");
				((MonoBehaviour)this).StartCoroutine(UIController.UnavailableIndicator("Soundcloud Null"));
			}
		}

		public void PlayYoutube(string url)
		{
			PlayYoutube(url, playbackGeneration);
		}

		private void PlayYoutube(string url, int generation)
		{
			if (URLGrab.LoadingBool || generation != playbackGeneration)
			{
				return;
			}
			if (!OODConfig.IsYtEnabled.Value)
			{
				youtubeLoading = false;
				PlayerSettings.IsPlaying = false;
				((MonoBehaviour)this).StartCoroutine(UIController.UnavailableIndicator("YouTube disabled"));
				return;
			}
			youtubeLoading = true;
			if (OODConfig.YoutubeAPI.Value == OODConfig.YouTubeAPI.YouTubeExplode)
			{
				StartYoutubeProcessing(url, generation);
			}
			else
			{
				((MonoBehaviour)this).StartCoroutine(YoutubeNodeQuery(url, generation));
			}
		}

		public void RPC_SetURL(string url, bool isPaused = false, float time = 0f)
		{
			if (url == null)
			{
				return;
			}
			Encoding uTF = Encoding.UTF8;
			byte[] bytes = uTF.GetBytes(url);
			url = StreamlinkRuntime.NormalizeChannelUrl(uTF.GetString(bytes));
			if (string.IsNullOrEmpty(url))
			{
				Stop(isRPC: true);
				return;
			}
			UnparsedURL = url;
			PlayerSettings.CurrentMode = PlayerSettings.PlayerMode.URL;
			PlayerSettings.DynamicStation = null;
			PlayerSettings.MediaTitle = null;
			PlayerSettings.IsPaused = isPaused;
			PlayerSettings.IsPlaying = true;
			URLGrab.Reset();
			int generation = BeginSourceSwitch(time);
			ClearRenderTexture(mScreen.targetTexture);
			if (Uri.TryCreate(url, UriKind.Absolute, out Uri result) && (result.Scheme == Uri.UriSchemeHttp || result.Scheme == Uri.UriSchemeHttps))
			{
				string host = result.Host;
				if (host.Equals("youtube.com", StringComparison.OrdinalIgnoreCase) || host.EndsWith(".youtube.com", StringComparison.OrdinalIgnoreCase) || host.Equals("youtu.be", StringComparison.OrdinalIgnoreCase) || host.Equals("youtube-nocookie.com", StringComparison.OrdinalIgnoreCase) || host.EndsWith(".youtube-nocookie.com", StringComparison.OrdinalIgnoreCase))
				{
					PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.Youtube;
					PlayYoutube(url, generation);
					return;
				}
				string text = StreamlinkRuntime.ServiceName(result);
				if (text != null)
				{
					PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.LiveChannel;
					PlayerSettings.MediaTitle = LiveChannelTitle(text, result);
					((MonoBehaviour)this).StartCoroutine(PlayLiveChannel(url, text, generation));
					return;
				}
				if (!host.Equals("soundcloud.com", StringComparison.OrdinalIgnoreCase) && !host.EndsWith(".soundcloud.com", StringComparison.OrdinalIgnoreCase))
				{
					PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.NetworkStream;
					DownloadURL = result;
					((MonoBehaviour)this).StartCoroutine(PrepareNetworkStream(url, generation));
					return;
				}
			}
			if (URLGrab.IsAudioFile(url))
			{
				string relativeURL = URLGrab.GetRelativeURL(url);
				if (relativeURL != "")
				{
					url = relativeURL;
					PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.RelativeAudio;
				}
				else
				{
					PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.Audio;
				}
				SetLooping(PlayerSettings.IsLooping);
				DownloadURL = URLGrab.CleanUrl(url);
				((MonoBehaviour)this).StartCoroutine(AudioWebRequest(DownloadURL, generation));
				return;
			}
			if (url.Contains("soundcloud.com/"))
			{
				PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.Soundcloud;
				SetLooping(PlayerSettings.IsLooping);
				PlaySoundcloud(url, isRPC: true);
				return;
			}
			string relativeURL2 = URLGrab.GetRelativeURL(url);
			if (relativeURL2 != "")
			{
				PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.RelativeVideo;
				SetLooping(PlayerSettings.IsLooping);
				mScreen.source = (VideoSource)1;
				mScreen.url = relativeURL2;
				if (OODConfig.DebugEnabled.Value)
				{
					Logger.LogDebug((object)("Playing: " + relativeURL2));
				}
				BeginLoadingPrepare();
			}
			else
			{
				PlayerSettings.PlayerLinkType = PlayerSettings.LinkType.Video;
				SetLooping(PlayerSettings.IsLooping);
				mScreen.source = (VideoSource)1;
				mScreen.url = url;
				BeginLoadingPrepare();
				if (OODConfig.DebugEnabled.Value)
				{
					Logger.LogDebug((object)("Playing: " + url));
				}
			}
		}

		private void BeginLoadingPrepare()
		{
			mScreen.Prepare();
			ClearRenderTexture(mScreen.targetTexture);
			if (Object.op_Implicit((Object)(object)ScreenUICanvasObj) && Object.op_Implicit((Object)(object)LoadingCircleObj))
			{
				ScreenUICanvasObj.SetActive(true);
				LoadingCircleObj.SetActive(true);
			}
		}

		public void StartYoutubeProcessing(string url)
		{
			StartYoutubeProcessing(url, playbackGeneration);
		}

		private void StartYoutubeProcessing(string url, int generation)
		{
			if (generation != playbackGeneration)
			{
				return;
			}
			youtubeLoading = true;
			if (Object.op_Implicit((Object)(object)UIController.LoadingIndicatorObj))
			{
				UIController.SetLoadingIndicatorText("Processing");
				UIController.LoadingIndicatorObj.SetActive(true);
			}
			if (Object.op_Implicit((Object)(object)ScreenUICanvasObj) && Object.op_Implicit((Object)(object)LoadingCircleObj))
			{
				ScreenUICanvasObj.SetActive(true);
				LoadingCircleObj.SetActive(true);
			}
			((MonoBehaviour)this).StartCoroutine(Ytdl.GetStreamsWithRetry(url, delegate(YoutubeStreams streams)
			{
				if (generation == playbackGeneration)
				{
					if (streams != null && !string.IsNullOrEmpty(streams.VideoUrl))
					{
						if (streams.Title != null)
						{
							PlayerSettings.MediaTitle = streams.Title;
						}
						PrepareVlcBackend(streams.VideoUrl, streams.AudioUrl, generation, streams.Headers);
					}
					else
					{
						HandlePlaybackError("Failed to get YouTube streams");
					}
				}
			}));
		}

		private IEnumerator ResetLoadingIndicatorAfterDelay(int generation)
		{
			yield return (object)new WaitForSeconds(8f);
			indicatorHoldUntil = 0f;
			if (generation == playbackGeneration)
			{
				UIController.ResetLoadingIndicator();
			}
		}

		private IEnumerator YoutubeNodeQuery(string youtubeUrl, int generation)
		{
			if (string.IsNullOrEmpty(youtubeUrl))
			{
				yield break;
			}
			youtubeLoading = true;
			string text = Uri.EscapeDataString(youtubeUrl);
			UnityWebRequest www = UnityWebRequest.Get(OODConfig.NodeUrl.Value + text + "/" + OODConfig.YtAuthCode.Value);
			try
			{
				www.timeout = 30;
				UIController.SetLoadingIndicatorText("Processing");
				if (Object.op_Implicit((Object)(object)UIController.LoadingIndicatorObj))
				{
					UIController.LoadingIndicatorObj.SetActive(true);
				}
				if (Object.op_Implicit((Object)(object)ScreenUICanvasObj) && Object.op_Implicit((Object)(object)LoadingCircleObj))
				{
					ScreenUICanvasObj.SetActive(true);
					LoadingCircleObj.SetActive(true);
				}
				yield return www.SendWebRequest();
				if (generation != playbackGeneration)
				{
					yield break;
				}
				if ((int)www.result != 1)
				{
					HandlePlaybackError("Node YouTube extraction failed: " + www.error);
					yield break;
				}
				if (www.downloadHandler.text.Contains("AUTH DENIED"))
				{
					HandlePlaybackError("Node YouTube extraction authentication denied");
					yield break;
				}
				string[] array = (from line in www.downloadHandler.text.Replace("\\n", "\n").Split(new string[3] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries)
					select line.Trim().Trim(new char[1] { '"' }) into line
					where !string.IsNullOrEmpty(line)
					select line).ToArray();
				if (array.Length == 0 || !Uri.TryCreate(array[0], UriKind.Absolute, out Uri result))
				{
					HandlePlaybackError("Node YouTube extraction returned an invalid video URL");
					yield break;
				}
				string audioUrl = null;
				if (array.Length > 1)
				{
					if (!Uri.TryCreate(array[1], UriKind.Absolute, out result))
					{
						HandlePlaybackError("Node YouTube extraction returned an invalid audio URL");
						yield break;
					}
					audioUrl = array[1];
				}
				PrepareVlcBackend(array[0], audioUrl, generation);
			}
			finally
			{
				((IDisposable)www)?.Dispose();
			}
		}

		public void UpdatePlayerTime(float time)
		{
			pendingPlaybackTime = Math.Max(0.0, time);
			hasPendingPlaybackTime = true;
			if (youtubeBackendActive)
			{
				if ((Object)(object)youtubeDecoder != (Object)null && youtubeDecoder.IsPrepared)
				{
					if (youtubeDecoder.IsPaused || Math.Abs(youtubeDecoder.Time - pendingPlaybackTime) > 0.05)
					{
						youtubeDecoder.Time = pendingPlaybackTime;
					}
					hasPendingPlaybackTime = false;
				}
			}
			else
			{
				if (UsesVlcBackend())
				{
					return;
				}
				if (IsVideoLink())
				{
					if ((Object)(object)mScreen != (Object)null && mScreen.isPrepared && Math.Abs(mScreen.time - pendingPlaybackTime) > 0.05)
					{
						mScreen.time = pendingPlaybackTime;
						hasPendingPlaybackTime = false;
					}
				}
				else if ((Object)(object)mAudio != (Object)null && (Object)(object)mAudio.clip != (Object)null)
				{
					mAudio.time = Mathf.Clamp((float)pendingPlaybackTime, 0f, mAudio.clip.length);
					hasPendingPlaybackTime = false;
				}
			}
		}

		public void SetLock(bool locked)
		{
			PlayerSettings.IsLocked = locked;
			if (Object.op_Implicit((Object)(object)UIController.URLPanelObj))
			{
				if (PlayerSettings.IsLocked)
				{
					UIController.LockedIconObj.SetActive(true);
					UIController.UnlockedIconObj.SetActive(false);
				}
				else
				{
					UIController.LockedIconObj.SetActive(false);
					UIController.UnlockedIconObj.SetActive(true);
				}
			}
		}

		public void SetDynamicStation(DynamicStation station)
		{
			PlayerSettings.DynamicStation = station;
		}

		public virtual void SaveZDO(bool saveTime = true)
		{
			ZDO zDO = ZNetView.GetZDO();
			if (zDO != null && !((Object)(object)mAudio == (Object)null))
			{
				RequestOwnership(zDO);
				zDO.Set("distance", mAudio.maxDistance);
				zDO.Set("adminOnly", PlayerSettings.AdminOnly);
				zDO.Set("isLooping", PlayerSettings.IsLooping);
				zDO.Set("isLocked", PlayerSettings.IsLocked);
				zDO.Set("isPlaying", PlayerSettings.IsPlaying);
				zDO.Set("isPaused", PlayerSettings.IsPaused);
				zDO.Set("currentMode", (int)PlayerSettings.CurrentMode);
				zDO.Set("url", UnparsedURL ?? "");
				if (saveTime)
				{
					SaveTimeZDO();
				}
				zDO.Set("speakers", SpeakerHelper.CompressSpeakerList(mSpeakers));
				zDO.Set("speakerCount", mSpeakers.Count);
			}
		}

		public void SaveTimeZDO()
		{
			ZDO zDO = ZNetView.GetZDO();
			if (zDO != null)
			{
				zDO.Set("time", (float)PlaybackTime);
			}
		}

		public virtual void LoadZDO()
		{
			ZDO zDO = ZNetView.GetZDO();
			if (zDO == null)
			{
				return;
			}
			PlayerSettings.AdminOnly = zDO.GetBool("adminOnly", false);
			float num = zDO.GetFloat("distance", 0f);
			if (num != 0f)
			{
				mAudio.maxDistance = num;
			}
			PlayerSettings.IsLocked = zDO.GetBool("isLocked", false);
			UnparsedURL = zDO.GetString("url", "");
			PlayerSettings.IsLooping = zDO.GetBool("isLooping", false);
			SetLooping(PlayerSettings.IsLooping);
			mSpeakers = SpeakerHelper.DecompressSpeakerList(zDO.GetByteArray("speakers", (byte[])null));
			UpdateSpeakerCenter();
			PlayerSettings.IsPlaying = zDO.GetBool("isPlaying", false);
			PlayerSettings.IsPaused = zDO.GetBool("isPaused", false);
			PlayerSettings.CurrentMode = (PlayerSettings.PlayerMode)zDO.GetInt("currentMode", 0);
			if (PlayerSettings.CurrentMode == PlayerSettings.PlayerMode.Dynamic)
			{
				PlayerSettings.DynamicStation = StationManager.Instance.GetStation(UnparsedURL);
				if (PlayerSettings.DynamicStation != null)
				{
					((MonoBehaviour)this).StartCoroutine(DelayedExecution(1f, delegate
					{
						//IL_0029: Unknown result type (might be due to invalid IL or missing references)
						RPC.SendData(0L, CinemaPackage.RPCDataType.RequestStation, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, GetTimeZDO(), PlayerSettings.DynamicStation.Title);
					}));
					((MonoBehaviour)this).StartCoroutine(DelayedExecution(2f, SendRequestTimeSync_RPC));
				}
			}
			else
			{
				if (string.IsNullOrEmpty(UnparsedURL))
				{
					return;
				}
				string loadedUrl = UnparsedURL;
				bool loadedPaused = PlayerSettings.IsPaused;
				float loadedTime = GetTimeZDO();
				((MonoBehaviour)this).StartCoroutine(DelayedExecution(3f, delegate
				{
					if (UnparsedURL == loadedUrl)
					{
						RPC_SetURL(loadedUrl, loadedPaused, loadedTime);
					}
				}));
			}
		}

		public virtual void UpdateZDO()
		{
			ZDO zDO = ZNetView.GetZDO();
			if (zDO == null)
			{
				return;
			}
			PlayerSettings.AdminOnly = zDO.GetBool("adminOnly", false);
			float num = zDO.GetFloat("distance", 0f);
			if (num != 0f)
			{
				mAudio.maxDistance = num;
			}
			PlayerSettings.IsLocked = zDO.GetBool("isLocked", false);
			bool isPaused = PlayerSettings.IsPaused;
			bool flag = zDO.GetBool("isPaused", false);
			bool isPlaying = zDO.GetBool("isPlaying", false);
			float zdoTime = zDO.GetFloat("time", 0f);
			string zdoUrl = zDO.GetString("url", "");
			PlayerSettings.IsLooping = zDO.GetBool("isLooping", false);
			SetLooping(PlayerSettings.IsLooping);
			PlayerSettings.CurrentMode = (PlayerSettings.PlayerMode)zDO.GetInt("currentMode", 0);
			if (zdoUrl != (UnparsedURL ?? ""))
			{
				if (string.IsNullOrEmpty(zdoUrl))
				{
					Stop(isRPC: true);
				}
				else if (PlayerSettings.CurrentMode == PlayerSettings.PlayerMode.Dynamic)
				{
					UnparsedURL = zdoUrl;
					PlayerSettings.IsPaused = flag;
					PlayerSettings.IsPlaying = isPlaying;
					((MonoBehaviour)this).StartCoroutine(DelayedExecution(1f, delegate
					{
						//IL_0095: Unknown result type (might be due to invalid IL or missing references)
						if (!(UnparsedURL != zdoUrl))
						{
							PlayerSettings.DynamicStation = StationManager.Instance.GetStation(zdoUrl);
							if (PlayerSettings.DynamicStation?.Title != null)
							{
								RPC.SendData(0L, CinemaPackage.RPCDataType.RequestStation, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, zdoTime, PlayerSettings.DynamicStation.Title);
							}
						}
					}));
					((MonoBehaviour)this).StartCoroutine(DelayedExecution(2f, SendRequestTimeSync_RPC));
				}
				else
				{
					RPC_SetURL(zdoUrl, flag, zdoTime);
				}
			}
			else
			{
				PlayerSettings.IsPlaying = isPlaying;
				if (flag != isPaused)
				{
					PlayerSettings.IsPaused = flag;
					if (flag)
					{
						PauseCurrentBackend();
						if (Object.op_Implicit((Object)(object)Animator))
						{
							Animator.SetBool(PlayerSettings.Playing, false);
						}
						if (Object.op_Implicit((Object)(object)WaveParticleSystem))
						{
							WaveParticleSystem.Stop();
						}
					}
					else
					{
						PlayCurrentBackend();
						if (Object.op_Implicit((Object)(object)Animator))
						{
							Animator.SetBool(PlayerSettings.Playing, true);
						}
						if (Object.op_Implicit((Object)(object)WaveParticleSystem) && OODConfig.MobilePlayerVisuals.Value)
						{
							WaveParticleSystem.Play();
						}
					}
				}
			}
			if (zDO.GetInt("speakerCount", 0) != mSpeakers.Count)
			{
				mSpeakers = SpeakerHelper.DecompressSpeakerList(zDO.GetByteArray("speakers", (byte[])null));
				UpdateSpeakerCenter();
			}
		}

		public async void RPC_UpdateZDO()
		{
			await Task.Delay(350);
			UpdateZDO();
		}

		private IEnumerator DelayedExecution(float delay, Action action)
		{
			yield return (object)new WaitForSeconds(delay);
			action();
		}

		internal void SendUpdateZDO_RPC()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			RPC.SendData(0L, CinemaPackage.RPCDataType.UpdateZDO, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, GetTime());
		}

		private void SyncTime()
		{
			if (IsPlaybackPlaying())
			{
				BroadcastTime();
			}
		}

		internal void SendRequestTimeSync_RPC()
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			ZDO zDO = ZNetView.GetZDO();
			if (zDO != null && (!zDO.IsOwner() || PlayerSettings.CurrentMode == PlayerSettings.PlayerMode.Dynamic))
			{
				RPC.SendData(0L, CinemaPackage.RPCDataType.RequestTime, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, 0f, UnparsedURL);
			}
		}

		public void BroadcastTime()
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			ZDO zDO = ZNetView.GetZDO();
			if (zDO != null && zDO.IsOwner())
			{
				SaveTimeZDO();
				RPC.SendData(0L, CinemaPackage.RPCDataType.SyncTime, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position, GetTime());
			}
		}

		private string GenerateUniqueID()
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			string[] obj = new string[5]
			{
				Path.GetRandomFileName().Replace(".", ""),
				"-",
				DateTime.Now.Ticks.ToString(),
				"-",
				null
			};
			ZDOID zDOID = ((Character)Player.m_localPlayer).GetZDOID();
			obj[4] = ((ZDOID)(ref zDOID)).UserID.ToString();
			return string.Concat(obj);
		}

		public Coroutine StartPlayerCoroutine(IEnumerator routine)
		{
			return ((MonoBehaviour)this).StartCoroutine(routine);
		}

		public void StopPlayerCoroutine(Coroutine routine)
		{
			((MonoBehaviour)this).StopCoroutine(routine);
		}

		public void ClaimOwnership(ZDO zdo)
		{
			if (zdo != null && !zdo.IsOwner())
			{
				zdo.SetOwner(ZDOMan.GetSessionID());
			}
		}

		public void SetOwnership(long peer)
		{
			ZDO zDO = ZNetView.GetZDO();
			if (zDO != null && zDO.IsOwner())
			{
				BroadcastTime();
				zDO.SetOwner(peer);
			}
		}

		public void RequestOwnership(ZDO zdo)
		{
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			if (zdo != null && !zdo.IsOwner())
			{
				if ((Object)(object)((IEnumerable<Player>)Player.s_players).FirstOrDefault((Func<Player, bool>)delegate(Player p)
				{
					//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)
					if ((Object)(object)p != (Object)null && (Object)(object)((Character)p).m_nview != (Object)null && ((Character)p).m_nview.IsValid())
					{
						ZDOID zDOID = ((Character)p).GetZDOID();
						return ((ZDOID)(ref zDOID)).UserID == zdo.GetOwner();
					}
					return false;
				}) == (Object)null)
				{
					ClaimOwnership(zdo);
				}
				else
				{
					RPC.SendData(0L, CinemaPackage.RPCDataType.RequestOwnership, PlayerSettings.PlayerType, MediaPlayerID, ((Component)this).gameObject.transform.position);
				}
			}
		}

		public bool AddSpeaker(SpeakerComponent sp)
		{
			if (mSpeakers.Add(sp))
			{
				SaveZDO();
				UpdateSpeakerCenter();
				((MonoBehaviour)this).StartCoroutine(ShowCenterSphere());
				SendUpdateZDO_RPC();
				return true;
			}
			return false;
		}

		public void RemoveSpeaker(SpeakerComponent sp)
		{
			if (mSpeakers.Remove(sp))
			{
				SaveZDO();
				UpdateSpeakerCenter();
				((MonoBehaviour)this).StartCoroutine(ShowCenterSphere());
				SendUpdateZDO_RPC();
			}
		}

		private void UpdateSpeakerCenter()
		{
			//IL_0034: 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_0045: 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)
			if (mSpeakers.Count == 0)
			{
				((Component)mAudio).transform.position = ((Component)this).transform.position;
				return;
			}
			Vector3 position = SpeakerHelper.CalculateAudioCenter(mSpeakers.ToList());
			((Component)mAudio).transform.position = position;
		}

		public void UnlinkAllSpeakers()
		{
			mSpeakers.Clear();
			UIController.UpdateSpeakerCount();
			UpdateSpeakerCenter();
			((MonoBehaviour)this).StartCoroutine(ShowCenterSphere());
			SaveZDO();
			SendUpdateZDO_RPC();
		}

		private IEnumerator ShowCenterSphere()
		{
			if (Object.op_Implicit((Object)(object)centerAudioSphere))
			{
				((Component)centerAudioSphere).gameObject.SetActive(true);
				yield return (object)new WaitForSeconds(1f);
				((Component)centerAudioSphere).gameObject.SetActive(false);
			}
		}

		private float GetTime()
		{
			return (float)PlaybackTime;
		}

		private float GetTimeZDO()
		{
			ZDO zDO = ZNetView.GetZDO();
			if (zDO != null)
			{
				return zDO.GetFloat("time", 0f);
			}
			return 0f;
		}

		private void ClearRenderTexture(RenderTexture renderTexture)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: 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_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0042: Expected O, but got Unknown
			if (!((Object)(object)renderTexture == (Object)null))
			{
				Texture2D val = new Texture2D(1, 1);
				val.SetPixel(0, 0, Color.black);
				val.Apply();
				RenderTexture active = RenderTexture.active;
				RenderTexture.active = renderTexture;
				Graphics.Blit((Texture)val, renderTexture);
				RenderTexture.active = active;
				Object.Destroy((Object)val);
			}
		}

		GameObject IPlayer.get_gameObject()
		{
			return ((Component)this).gameObject;
		}
	}
	public class PlayerSettings
	{
		public enum LinkType
		{
			Youtube,
			Soundcloud,
			Video,
			Audio,
			RelativeAudio,
			RelativeVideo,
			NetworkStream,
			LiveChannel
		}

		public enum PlayerMode
		{
			URL,
			Dynamic
		}

		public static readonly int Playing = Animator.StringToHash("Playing");

		public static readonly int MainTex = Shader.PropertyToID("_MainTex");

		public static readonly int EmissiveColorMap = Shader.PropertyToID("_EmissiveColorMap");

		internal LinkType PlayerLinkType;

		public PlayerMode CurrentMode;

		public List<AudioClip> CurrentDynamicList = new List<AudioClip>();

		public bool IsPaused { get; set; }

		public bool IsPlaying { get; set; }

		public int LoadingCount { get; set; }

		public bool IsGuiActive { get; set; }

		public bool AdminOnly { get; set; }

		public bool IsLocked { get; set; } = true;

		public bool IsLooping { get; set; }

		public bool IsPlayingPlaylist { get; set; }

		public bool IsSettingsGuiActive { get; set; }

		public bool IsShuffling { get; set; }

		public float MuteVol { get; set; } = 0.5f;

		public float VerticalDistanceDropoff { get; set; }

		public float DropoffPower { get; set; } = 1.5f;

		public float Volume { get; set; } = 0.5f;

		public bool IsLinkedToParent { get; set; }

		public CinemaPackage.MediaPlayers PlayerType { get; set; }

		public DynamicStation DynamicStation { get; set; }

		public Sprite Thumbnail { get; set; }

		public string MediaTitle { get; set; }
	}
	public sealed class YoutubeDecoder : MonoBehaviour
	{
		private sealed class PrepareRequest
		{
			public Uri VideoUri { get; private set; }

			public Uri AudioUri { get; private set; }

			public AudioSource Output { get; private set; }

			public RenderTexture TargetTexture { get; private set; }

			public IDictionary<string, string> Headers { get; private set; }

			public bool UseChunkedInput { get; private set; }

			public bool IsLive { get; private set; }

			public PrepareRequest(Uri videoUri, Uri audioUri, AudioSource output, RenderTexture targetTexture, IDictionary<string, string> headers, bool useChunkedInput, bool isLive)
			{
				VideoUri = videoUri;
				AudioUri = audioUri;
				Output = output;
				TargetTexture = targetTexture;
				Headers = headers;
				UseChunkedInput = useChunkedInput;
				IsLive = isLive;
			}
		}

		private sealed class PlaybackSession
		{
			private static int nextDiagnosticId;

			private readonly YoutubeDecoder owner;

			private readonly object videoGate = new object();

			private readonly bool renderVideo;

			private VideoFrameBuffer videoBuffer;

			private int nativeVideoErrorRaised;

			private int nativeAudioErrorRaised;

			private bool eventsAttached;

			private long pendingNativeTime;

			private volatile float pendingPosition;

			private volatile float pendingBufferCache;

			private int nativeTimeDirty;

			private int positionDirty;

			private int bufferingDirty;

			public volatile bool VideoOutputEnabled;

			public volatile bool VideoFormatSeen;

			public volatile bool NativePlaying;

			public volatile bool IsBuffering;

			public readonly int DiagnosticId = Interlocked.Increment(ref nextDiagnosticId);

			public float DiagnosticStartedAt;

			public float NextDiagnosticLogAt;

			public int DiagnosticSeeks;

			public MediaPlayer Player { get; private set; }

			public Media Media { get; set; }

			public ChunkedHttpMediaInput Input { get; set; }

			public bool HasEnded { get; set; }

			public PcmRingBuffer Audio { get; private set; }

			public bool Preparing { get; set; }

			public bool PreparePauseRequested { get; set; }

			public bool IsLive { get; private set; }

			public bool Seekable { get; set; }

			public bool OutputGatedPause { get; set; }

			public double LengthSeconds { get; set; }

			public PlaybackSession(YoutubeDecoder owner, MediaPlayer player, PcmRingBuffer audio, bool renderVideo, bool isLive)
			{
				this.owner = owner;
				this.renderVideo = renderVideo;
				IsLive = isLive;
				OutputGatedPause = isLive;
				Player = player;
				Audio = audio;
				Preparing = true;
			}

			public void ConfigureCallbacks()
			{
				//IL_000d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0047: Expected O, but got Unknown
				//IL_0047: Expected O, but got Unknown
				//IL_0047: Expected O, but got Unknown
				//IL_0047: Expected O, but got Unknown
				//IL_0047: Expected O, but got Unknown
				//IL_006a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0077: Unknown result type (might be due to invalid IL or missing references)
				//IL_0081: Expected O, but got Unknown
				//IL_0081: Expected O, but got Unknown
				//IL_008e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0099: Expected O, but got Unknown
				Player.SetAudioCallbacks(new LibVLCAudioPlayCb(AudioPlay), new LibVLCAudioPauseCb(AudioPause), new LibVLCAudioResumeCb(AudioResume), new LibVLCAudioFlushCb(AudioFlush), new LibVLCAudioDrainCb(AudioDrain));
				Player.SetAudioFormat("S16N", 48000u, 2u);
				Player.SetVideoCallbacks(new LibVLCVideoLockCb(VideoLock), (LibVLCVideoUnlockCb)null, new LibVLCVideoDisplayCb(VideoDisplay));
				Player.SetVideoFormatCallbacks(new LibVLCVideoFormatCb(VideoFormat), (LibVLCVideoCleanupCb)null);
			}

			public void AttachEvents()
			{
				Player.Playing += OnPlaying;
				Player.Paused += OnPaused;
				Player.TimeChanged += OnTimeChanged;
				Player.PositionChanged += OnPositionChanged;
				Player.Buffering += OnBuffering;
				Player.EndReached += OnEndReached;
				Player.EncounteredError += OnEncounteredError;
				eventsAttached = true;
			}

			public void ResetAfterStop()
			{
				HasEnded = false;
				NativePlaying = false;
				IsBuffering = false;
				Interlocked.Exchange(ref nativeTimeDirty, 0);
				Interlocked.Exchange(ref positionDirty, 0);
				Interlocked.Exchange(ref bufferingDirty, 0);
			}

			public void DispatchTimingEvents()
			{
				if (Interlocked.Exchange(ref bufferingDirty, 0) != 0)
				{
					owner.HandleBuffering(this, pendingBufferCache);
				}
				if (Interlocked.Exchange(ref nativeTimeDirty, 0) != 0)
				{
					Interlocked.Exchange(ref positionDirty, 0);
					owner.HandleNativeTime(this, Interlocked.Read(in pendingNativeTime));
				}
				else if (Interlocked.Exchange(ref positionDirty, 0) != 0)
				{
					owner.HandleNativePosition(this, pendingPosition);
				}
			}

			public bool TryAcquireVideoFrame(out VideoFrameBuffer buffer, out int slot, out byte[] pixels)
			{
				lock (videoGate)
				{
					buffer = videoBuffer;
				}
				if (buffer == null)
				{
					slot = -1;
					pixels = null;
					return false;
				}
				return buffer.TryAcquire(out slot, out pixels);
			}

			public void Shutdown()
			{
				Audio.SetActive(value: false);
				VideoOutputEnabled = false;
				try
				{
					if (eventsAttached)
					{
						Player.Playing -= OnPlaying;
						Player.Paused -= OnPaused;
						Player.TimeChanged -= OnTimeChanged;
						Player.PositionChanged -= OnPositionChanged;
						Player.Buffering -= OnBuffering;
						Player.EndReached -= OnEndReached;
						Player.EncounteredError -= OnEncounteredError;
						eventsAttached = false;
					}
					Player.Stop();
				}
				catch
				{
				}
				finally
				{
					try
					{
						((Internal)Player).Dispose();
					}
					catch
					{
					}
					finally
					{
						if (Media != null)
						{
							((Internal)Media).Dispose();
							Media = null;
						}
						if (Input != null)
						{
							((MediaInput)Input).Dispose();
							Input = null;
						}
						lock (videoGate)
						{
							if (videoBuffer != null)
							{
								videoBuffer.DisposeNative();
								videoBuffer = null;
							}
						}
					}
				}
			}

			private void OnPlaying(object sender, EventArgs args)
			{
				NativePlaying = true;
				owner.EnqueueMainThread(delegate
				{
					owner.HandlePlaying(this);
				});
			}

			private void OnPaused(object sender, EventArgs args)
			{
				NativePlaying = false;
				owner.EnqueueMainThread(delegate
				{
					owner.HandlePaused(this);
				});
			}

			private void OnEndReached(object sender, EventArgs args)
			{
				NativePlaying = false;
				owner.EnqueueMainThread(delegate
				{
					owner.HandleEndReached(this);
				});
			}

			private void OnTimeChanged(object sender, MediaPlayerTimeChangedEventArgs args)
			{
				Interlocked.Exchange(ref pendingNativeTime, args.Time);
				Interlocked.Exchange(ref nativeTimeDirty, 1);
			}

			private void OnPositionChanged(object sender, MediaPlayerPositionChangedEventArgs args)
			{
				pendingPosition = args.Position;
				Interlocked.Exchange(ref positionDirty, 1);
			}

			private void OnBuffering(object sender, MediaPlayerBufferingEventArgs args)
			{
				pendingBufferCache = args.Cache;
				IsBuffering = args.Cache < 100f;
				Interlocked.Exchange(ref bufferingDirty, 1);
			}

			private void OnEncounteredError(object sender, EventArgs args)
			{
				NativePlaying = false;
				owner.EnqueueMainThread(delegate
				{
					owner.FailCurrent(this, "LibVLC encountered an error while decoding the media stream.");
				});
			}

			private void AudioPlay(IntPtr data, IntPtr samples, uint count, long pts)
			{
				try
				{
					if (count != 0 && count <= 268435455)
					{
						Audio.Write(samples, (int)count, pts);
					}
				}
				catch
				{
					ReportNativeAudioError();
				}
			}

			private void AudioPause(IntPtr data, long pts)
			{
				SafeFlushAudio();
			}

			private void AudioResume(IntPtr data, long pts)
			{
				SafeFlushAudio();
			}

			private void AudioFlush(IntPtr data, long pts)
			{
				SafeFlushAudio();
			}

			private void AudioDrain(IntPtr data)
			{
				try
				{
					Audio.Drain();
				}
				catch
				{
					ReportNativeAudioError();
				}
			}

			private uint VideoFormat(ref IntPtr opaque, IntPtr chroma