[
  {
    "path": ".github/workflows/deploy.yml",
    "content": "name: 🚀 Deploy Release\n\non:\n  push:\n    branches:\n      - main\n    tags:\n      - \"v*.*.*\"\n\njobs:\n  deploy:\n    name: Deploy\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Repository\n        uses: actions/checkout@v3\n        with:\n          submodules: recursive\n\n      # Deploy to local repo\n      - name: Deploy to Release Branch\n        uses: s0/git-publish-subdir-action@develop\n        env:\n          REPO: self\n          BRANCH: release\n          FOLDER: addons/GDTask\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Create Release\n        run: |\n          mkdir release\n          mv addons/GDTask release\n          pushd release\n          zip -r ../Release.zip *\n          popd\n\n      - name: Upload Release\n        uses: actions/upload-artifact@v4\n        with:\n          name: Release\n          path: release\n\n      - name: Tagged Release\n        uses: softprops/action-gh-release@v1\n        if: startsWith(github.ref, 'refs/tags/')\n        with:\n          files: Release.zip\n"
  },
  {
    "path": ".gitignore",
    "content": "# Godot 4+ specific ignores\n.godot/\n\n# Godot-specific ignores\n.import/\nexport.cfg\nexport_presets.cfg\n\n# Mono-specific ignores\n.mono/\ndata_*/\n\n# IntelliJ\n.idea/\n\n# VSCode Settings \n.vscode/\n\n# Visual studio\n.vs/\n\nBuilds/\n\n# Ignore stub bin and obj folders\nbin/\nobj/\n\n# Tests\ntests/results.xml\ntests/metadata.json\n\n# MacOS\n.DS_Store\n"
  },
  {
    "path": ".gitmodules",
    "content": ""
  },
  {
    "path": "GDTask.csproj",
    "content": "<Project Sdk=\"Godot.NET.Sdk/4.4.0\">\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <EnableDynamicLoading>true</EnableDynamicLoading>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "GDTask.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.10.35027.167\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"GDTask\", \"GDTask.csproj\", \"{CEF6A453-1034-46B7-9617-C94E19891B46}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tExportDebug|Any CPU = ExportDebug|Any CPU\n\t\tExportRelease|Any CPU = ExportRelease|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{CEF6A453-1034-46B7-9617-C94E19891B46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CEF6A453-1034-46B7-9617-C94E19891B46}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CEF6A453-1034-46B7-9617-C94E19891B46}.ExportDebug|Any CPU.ActiveCfg = ExportDebug|Any CPU\n\t\t{CEF6A453-1034-46B7-9617-C94E19891B46}.ExportDebug|Any CPU.Build.0 = ExportDebug|Any CPU\n\t\t{CEF6A453-1034-46B7-9617-C94E19891B46}.ExportRelease|Any CPU.ActiveCfg = ExportRelease|Any CPU\n\t\t{CEF6A453-1034-46B7-9617-C94E19891B46}.ExportRelease|Any CPU.Build.0 = ExportRelease|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {688C3662-0D40-4D17-8576-4FA4A992B65A}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2019 Atlinx, Yoshifumi Kawai / Cysharp, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# ⚠️ Superceded by [GDTask.Nuget](https://github.com/Delsin-Yu/GDTask.Nuget)\n\nThis addon has been superceded by [Delsin-Yu's GDTask.Nuget](https://github.com/Delsin-Yu/GDTask.Nuget) package, which is accessible from the Nuget package manager. Their package also contains useful profiling tools for debugging GDTasks.\n\n# GDTask ✅\n\n![Deploy](https://github.com/Fractural/GDTask/actions/workflows/deploy.yml/badge.svg)\n\n> [!Note] \n> \n> This branch is for the Godot 4.4 version of the addon. \n> You can download the Godot 3.x version from the 3.x branch.\n\nAdds async/await features in Godot for easier async coding.\nBased on code from [Cysharp's UniTask library for Unity](https://github.com/Cysharp/UniTask).\n\n```CSharp\nusing Fractural.Tasks;\n\npublic Test : Node \n{\n\t[Signal]\n\tpublic delegate void MySignalHandler(int number, bool boolean);\n\t\n\tpublic override _Ready() \n\t{\n\t\t// Running a task from a non-async method.\n\t\tRun().Forget();\n\t}\n\n\tpublic async GDTaskVoid Run() \n\t{\n\t\tawait GDTask.DelayFrame(100);\n\n\t\t// Waiting some amount of time\n\t\t// Note that these delays are paused when the game is paused\n\t\tawait GDTask.Delay(TimeSpan.FromSeconds(10));\n\t\tawait GDTask.Delay(TimeSpan.FromSeconds(10), PlayerLoopTiming.Process);\n\t\tawait GDTask.Delay(TimeSpan.FromSeconds(10), PlayerLoopTiming.PhysicsProcess);\n\t\t// Waiting some amount of milliseconds\n\t\tawait GDTask.Delay(1000);\n\t\t// Waiting some amount of milliseconds, regardless of whether the game is paused\n\t\tawait GDTask.Delay(TimeSpan.FromSeconds(10), PlayerLoopTiming.PauseProcess);\n\t\tawait GDTask.Delay(TimeSpan.FromSeconds(10), PlayerLoopTiming.PausePhysicsProcess);\n\n\t\t// Awaiting for a signal\n\t\tWaitAndEmitMySignal(TimeSpan.FromSeconds(2)).Forget();\n\t\tvar signalResults = await GDTask.ToSignal(this, nameof(MySignal));\n\t\t// signalResults = [10, true]\n\n\t\t// Cancellable awaiting a signal\n\t\tvar cts = new CancellationTokenSource();\n\t\tWaitAndEmitMySignal(TimeSpan.FromSeconds(2)).Forget();\n\t\tWaitAndCancelToken(TimeSpan.FromSeconds(1), cts).Forget();\n\t\ttry \n\t\t{\n\t\t\tvar signalResults = await GDTask.ToSignal(this, nameof(MySignal), cts.Token);\n\t\t}\n\t\tcatch (OperationCanceledException _)\n\t\t{\n\t\t\tGD.Print(\"Awaiting MySignal cancelled!\");\n\t\t}\n\n\t\t// Waiting a single frame\n\t\tawait GDTask.Yield();\n\t\tawait GDTask.NextFrame();\n\t\tawait GDTask.WaitForEndOfFrame();\n\n\t\t// Waiting for specific lifetime call\n\t\tawait GDTask.WaitForPhysicsProcess();\n\n\t\t// Cancellation of a GDTask\n\t\tvar cts = new CancellationTokenSource();\n\t\tCancellableReallyLongTask(cts.Token).Forget();\n\t\tawait GDTask.Delay(TimeSpan.FromSeconds(3));\n\t\tcts.Cancel();\n\n\t\t// Returning a value from a GDTask\n\t\tstring result = await RunWithResult();\n\t\treturn result + \" with additional text\";\n\t}\n\n\tpublic async GDTask<string> RunWithResult()\n\t{\n\t\tawait GDTask.Delay(TimeSpan.FromSeconds(3));\n\t\treturn \"A result string\";\n\t}\n\n\tpublic async GDTaskVoid ReallyLongTask(CancellationToken cancellationToken)\n\t{\n\t\tGD.Print(\"Starting long task.\");\n\t\tawait GDTask.Delay(TimeSpan.FromSeconds(1000000), cancellationToken: cancellationToken);\n\t\tGD.Print(\"Finished long task.\");\n\t}\n\t\n\tpublic async GDTaskVoid WaitAndEmitMySignal(TimeSpan delay)\n\t{\n\t\tawait GDTask.Delay(delay);\n\t\tEmitSignal(nameof(MySignal), 10, true);\n\t}\n\n\tpublic async GDTaskVoid WaitAndCancelToken(TimeSpan delay, CancellationTokenSource cts)\n\t{\n\t\tawait GDTask.Delay(delay);\n\t\tcts.Cancel();\n\t}\n}\n```\n\n## Installation\n\nManual\n\n1. Download the repository\n2. Move the `addons/GDTask` folder into `addons/GDTask`\n\nGit Submodules\n\n1. Make sure your project has a git repo initialized\n2. Run\n   \n``` bash\ngit submodule add -b release https://github.com/fractural/GDTask.git addons/GDTask\n```\n\n3. Add `addons/GDTask/Autoload/GDTaskPlayerLoopAutoload` as an autoload\n"
  },
  {
    "path": "addons/GDTask/AsyncLazy.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    public partial class AsyncLazy\n    {\n        static Action<object> continuation = SetCompletionSource;\n\n        Func<GDTask> taskFactory;\n        GDTaskCompletionSource completionSource;\n        GDTask.Awaiter awaiter;\n\n        object syncLock;\n        bool initialized;\n\n        public AsyncLazy(Func<GDTask> taskFactory)\n        {\n            this.taskFactory = taskFactory;\n            this.completionSource = new GDTaskCompletionSource();\n            this.syncLock = new object();\n            this.initialized = false;\n        }\n\n        internal AsyncLazy(GDTask task)\n        {\n            this.taskFactory = null;\n            this.completionSource = new GDTaskCompletionSource();\n            this.syncLock = null;\n            this.initialized = true;\n\n            var awaiter = task.GetAwaiter();\n            if (awaiter.IsCompleted)\n            {\n                SetCompletionSource(awaiter);\n            }\n            else\n            {\n                this.awaiter = awaiter;\n                awaiter.SourceOnCompleted(continuation, this);\n            }\n        }\n\n        public GDTask Task\n        {\n            get\n            {\n                EnsureInitialized();\n                return completionSource.Task;\n            }\n        }\n\n\n        public GDTask.Awaiter GetAwaiter() => Task.GetAwaiter();\n\n        void EnsureInitialized()\n        {\n            if (Volatile.Read(ref initialized))\n            {\n                return;\n            }\n\n            EnsureInitializedCore();\n        }\n\n        void EnsureInitializedCore()\n        {\n            lock (syncLock)\n            {\n                if (!Volatile.Read(ref initialized))\n                {\n                    var f = Interlocked.Exchange(ref taskFactory, null);\n                    if (f != null)\n                    {\n                        var task = f();\n                        var awaiter = task.GetAwaiter();\n                        if (awaiter.IsCompleted)\n                        {\n                            SetCompletionSource(awaiter);\n                        }\n                        else\n                        {\n                            this.awaiter = awaiter;\n                            awaiter.SourceOnCompleted(continuation, this);\n                        }\n\n                        Volatile.Write(ref initialized, true);\n                    }\n                }\n            }\n        }\n\n        void SetCompletionSource(in GDTask.Awaiter awaiter)\n        {\n            try\n            {\n                awaiter.GetResult();\n                completionSource.TrySetResult();\n            }\n            catch (Exception ex)\n            {\n                completionSource.TrySetException(ex);\n            }\n        }\n\n        static void SetCompletionSource(object state)\n        {\n            var self = (AsyncLazy)state;\n            try\n            {\n                self.awaiter.GetResult();\n                self.completionSource.TrySetResult();\n            }\n            catch (Exception ex)\n            {\n                self.completionSource.TrySetException(ex);\n            }\n            finally\n            {\n                self.awaiter = default;\n            }\n        }\n    }\n\n    public partial class AsyncLazy<T>\n    {\n        static Action<object> continuation = SetCompletionSource;\n\n        Func<GDTask<T>> taskFactory;\n        GDTaskCompletionSource<T> completionSource;\n        GDTask<T>.Awaiter awaiter;\n\n        object syncLock;\n        bool initialized;\n\n        public AsyncLazy(Func<GDTask<T>> taskFactory)\n        {\n            this.taskFactory = taskFactory;\n            this.completionSource = new GDTaskCompletionSource<T>();\n            this.syncLock = new object();\n            this.initialized = false;\n        }\n\n        internal AsyncLazy(GDTask<T> task)\n        {\n            this.taskFactory = null;\n            this.completionSource = new GDTaskCompletionSource<T>();\n            this.syncLock = null;\n            this.initialized = true;\n\n            var awaiter = task.GetAwaiter();\n            if (awaiter.IsCompleted)\n            {\n                SetCompletionSource(awaiter);\n            }\n            else\n            {\n                this.awaiter = awaiter;\n                awaiter.SourceOnCompleted(continuation, this);\n            }\n        }\n\n        public GDTask<T> Task\n        {\n            get\n            {\n                EnsureInitialized();\n                return completionSource.Task;\n            }\n        }\n\n\n        public GDTask<T>.Awaiter GetAwaiter() => Task.GetAwaiter();\n\n        void EnsureInitialized()\n        {\n            if (Volatile.Read(ref initialized))\n            {\n                return;\n            }\n\n            EnsureInitializedCore();\n        }\n\n        void EnsureInitializedCore()\n        {\n            lock (syncLock)\n            {\n                if (!Volatile.Read(ref initialized))\n                {\n                    var f = Interlocked.Exchange(ref taskFactory, null);\n                    if (f != null)\n                    {\n                        var task = f();\n                        var awaiter = task.GetAwaiter();\n                        if (awaiter.IsCompleted)\n                        {\n                            SetCompletionSource(awaiter);\n                        }\n                        else\n                        {\n                            this.awaiter = awaiter;\n                            awaiter.SourceOnCompleted(continuation, this);\n                        }\n\n                        Volatile.Write(ref initialized, true);\n                    }\n                }\n            }\n        }\n\n        void SetCompletionSource(in GDTask<T>.Awaiter awaiter)\n        {\n            try\n            {\n                var result = awaiter.GetResult();\n                completionSource.TrySetResult(result);\n            }\n            catch (Exception ex)\n            {\n                completionSource.TrySetException(ex);\n            }\n        }\n\n        static void SetCompletionSource(object state)\n        {\n            var self = (AsyncLazy<T>)state;\n            try\n            {\n                var result = self.awaiter.GetResult();\n                self.completionSource.TrySetResult(result);\n            }\n            catch (Exception ex)\n            {\n                self.completionSource.TrySetException(ex);\n            }\n            finally\n            {\n                self.awaiter = default;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/AsyncLazy.cs.uid",
    "content": "uid://cnn3liy4tgvma\n"
  },
  {
    "path": "addons/GDTask/AsyncUnit.cs",
    "content": "﻿#pragma warning disable CS1591 // Missing XML comment for publicly visible type or \n\nusing System;\n\nnamespace Fractural.Tasks\n{\n    public readonly struct AsyncUnit : IEquatable<AsyncUnit>\n    {\n        public static readonly AsyncUnit Default = new AsyncUnit();\n\n        public override int GetHashCode()\n        {\n            return 0;\n        }\n\n        public bool Equals(AsyncUnit other)\n        {\n            return true;\n        }\n\n        public override string ToString()\n        {\n            return \"()\";\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/AsyncUnit.cs.uid",
    "content": "uid://bjl72gsi0q5ty\n"
  },
  {
    "path": "addons/GDTask/Autoload/GDTaskPlayerLoopAutoload.cs",
    "content": "﻿using Fractural.Tasks.Internal;\nusing Godot;\nusing System;\n\nnamespace Fractural.Tasks\n{\n    public static class GDTaskLoopRunners\n    {\n        public struct GDTaskLoopRunnerProcess { };\n        public struct GDTaskLoopRunnerPhysicsProcess { };\n    }\n\n    public enum PlayerLoopTiming\n    {\n        Process = 0,\n        PhysicsProcess = 1,\n        PauseProcess = 2,\n        PausePhysicsProcess = 3,\n    }\n\n    public interface IPlayerLoopItem\n    {\n        bool MoveNext();\n    }\n\n    /// <summary>\n    /// Singleton that forwards Godot calls and values to GDTasks.\n    /// </summary>\n    public partial class GDTaskPlayerLoopAutoload : Node\n    {\n        public static int MainThreadId => Global.mainThreadId;\n        public static bool IsMainThread => System.Threading.Thread.CurrentThread.ManagedThreadId == Global.mainThreadId;\n        public static void AddAction(PlayerLoopTiming timing, IPlayerLoopItem action) => Global.LocalAddAction(timing, action);\n        public static void ThrowInvalidLoopTiming(PlayerLoopTiming playerLoopTiming) => throw new InvalidOperationException(\"Target playerLoopTiming is not injected. Please check PlayerLoopHelper.Initialize. PlayerLoopTiming:\" + playerLoopTiming);\n        public static void AddContinuation(PlayerLoopTiming timing, Action continuation) => Global.LocalAddContinuation(timing, continuation);\n\n        public void LocalAddAction(PlayerLoopTiming timing, IPlayerLoopItem action)\n        {\n            var runner = runners[(int)timing];\n            if (runner == null)\n            {\n                ThrowInvalidLoopTiming(timing);\n            }\n            runner.AddAction(action);\n        }\n\n        // NOTE: Continuation means a asynchronous task invoked by another task after the other task finishes.\n        public void LocalAddContinuation(PlayerLoopTiming timing, Action continuation)\n        {\n            var q = yielders[(int)timing];\n            if (q == null)\n            {\n                ThrowInvalidLoopTiming(timing);\n            }\n            q.Enqueue(continuation);\n        }\n\n        public static GDTaskPlayerLoopAutoload Global\n        {\n            get\n            {\n                if (s_Global != null) return s_Global;\n\n                var newInstance = new GDTaskPlayerLoopAutoload();\n                newInstance.Initialize();\n                var currentScene = ((SceneTree)Engine.GetMainLoop()).CurrentScene;\n                currentScene.AddChild(newInstance);\n                currentScene.MoveChild(newInstance, 0);\n                newInstance.Name = \"GDTaskPlayerLoopAutoload\";\n                s_Global = newInstance;\n\n                return s_Global;\n            }\n        }\n        public double DeltaTime => GetProcessDeltaTime();\n        public double PhysicsDeltaTime => GetPhysicsProcessDeltaTime();\n\n        private static GDTaskPlayerLoopAutoload s_Global;\n        private int mainThreadId;\n        private ContinuationQueue[] yielders;\n        private PlayerLoopRunner[] runners;\n        private ProcessListener processListener;\n\n        public override void _EnterTree()\n        {\n            if (s_Global == null)\n            {\n                Initialize();\n                s_Global = this;\n                return;\n            }\n            QueueFree();\n        }\n\n        private void Initialize()\n        {\n            ProcessMode = ProcessModeEnum.Pausable;\n            mainThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;\n            yielders = new[] {\n                new ContinuationQueue(PlayerLoopTiming.Process),\n                new ContinuationQueue(PlayerLoopTiming.PhysicsProcess),\n                new ContinuationQueue(PlayerLoopTiming.PauseProcess),\n                new ContinuationQueue(PlayerLoopTiming.PausePhysicsProcess),\n            };\n            runners = new[] {\n                new PlayerLoopRunner(PlayerLoopTiming.Process),\n                new PlayerLoopRunner(PlayerLoopTiming.PhysicsProcess),\n                new PlayerLoopRunner(PlayerLoopTiming.PauseProcess),\n                new PlayerLoopRunner(PlayerLoopTiming.PausePhysicsProcess),\n            };\n            processListener = new ProcessListener();\n            AddChild(processListener);\n            processListener.ProcessMode = ProcessModeEnum.Always;\n            processListener.OnProcess += PauseProcess;\n            processListener.OnPhysicsProcess += PausePhysicsProcess;\n        }\n\n        public override void _Notification(int what)\n        {\n            if (what == NotificationPredelete)\n            {\n                if (Global == this)\n                    s_Global = null;\n                if (yielders != null)\n                {\n                    foreach (var yielder in yielders)\n                        yielder.Clear();\n                    foreach (var runner in runners)\n                        runner.Clear();\n                }\n            }\n        }\n\n        public override void _Process(double delta)\n        {\n            yielders[(int)PlayerLoopTiming.Process].Run();\n            runners[(int)PlayerLoopTiming.Process].Run();\n        }\n\n        public override void _PhysicsProcess(double delta)\n        {\n            yielders[(int)PlayerLoopTiming.PhysicsProcess].Run();\n            runners[(int)PlayerLoopTiming.PhysicsProcess].Run();\n        }\n\n        private void PauseProcess(double delta)\n        {\n            yielders[(int)PlayerLoopTiming.PauseProcess].Run();\n            runners[(int)PlayerLoopTiming.PauseProcess].Run();\n        }\n\n        private void PausePhysicsProcess(double delta)\n        {\n            yielders[(int)PlayerLoopTiming.PausePhysicsProcess].Run();\n            runners[(int)PlayerLoopTiming.PausePhysicsProcess].Run();\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Autoload/GDTaskPlayerLoopAutoload.cs.uid",
    "content": "uid://b34v2b358nj4p\n"
  },
  {
    "path": "addons/GDTask/Autoload/ProcessListener.cs",
    "content": "﻿using Godot;\nusing System;\n\nnamespace Fractural.Tasks\n{\n    public partial class ProcessListener : Node\n    {\n        public event Action<double> OnProcess;\n        public event Action<double> OnPhysicsProcess;\n\n        public override void _Process(double delta)\n        {\n            OnProcess?.Invoke(delta);\n        }\n\n        public override void _PhysicsProcess(double delta)\n        {\n            OnPhysicsProcess?.Invoke(delta);\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/Autoload/ProcessListener.cs.uid",
    "content": "uid://3h6xpadx1svw\n"
  },
  {
    "path": "addons/GDTask/CancellationTokenEqualityComparer.cs",
    "content": "using System.Collections.Generic;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    public partial class CancellationTokenEqualityComparer : IEqualityComparer<CancellationToken>\n    {\n        public static readonly IEqualityComparer<CancellationToken> Default = new CancellationTokenEqualityComparer();\n\n        public bool Equals(CancellationToken x, CancellationToken y)\n        {\n            return x.Equals(y);\n        }\n\n        public int GetHashCode(CancellationToken obj)\n        {\n            return obj.GetHashCode();\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/CancellationTokenEqualityComparer.cs.uid",
    "content": "uid://dkqkuimd6xnj6\n"
  },
  {
    "path": "addons/GDTask/CancellationTokenExtensions.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    public static class CancellationTokenExtensions\n    {\n        static readonly Action<object> cancellationTokenCallback = Callback;\n        static readonly Action<object> disposeCallback = DisposeCallback;\n\n        public static CancellationToken ToCancellationToken(this GDTask task)\n        {\n            var cts = new CancellationTokenSource();\n            ToCancellationTokenCore(task, cts).Forget();\n            return cts.Token;\n        }\n\n        public static CancellationToken ToCancellationToken(this GDTask task, CancellationToken linkToken)\n        {\n            if (linkToken.IsCancellationRequested)\n            {\n                return linkToken;\n            }\n\n            if (!linkToken.CanBeCanceled)\n            {\n                return ToCancellationToken(task);\n            }\n\n            var cts = CancellationTokenSource.CreateLinkedTokenSource(linkToken);\n            ToCancellationTokenCore(task, cts).Forget();\n\n            return cts.Token;\n        }\n\n        public static CancellationToken ToCancellationToken<T>(this GDTask<T> task)\n        {\n            return ToCancellationToken(task.AsGDTask());\n        }\n\n        public static CancellationToken ToCancellationToken<T>(this GDTask<T> task, CancellationToken linkToken)\n        {\n            return ToCancellationToken(task.AsGDTask(), linkToken);\n        }\n\n        static async GDTaskVoid ToCancellationTokenCore(GDTask task, CancellationTokenSource cts)\n        {\n            try\n            {\n                await task;\n            }\n            catch (Exception ex)\n            {\n                GDTaskScheduler.PublishUnobservedTaskException(ex);\n            }\n            cts.Cancel();\n            cts.Dispose();\n        }\n\n        public static (GDTask, CancellationTokenRegistration) ToGDTask(this CancellationToken cancellationToken)\n        {\n            if (cancellationToken.IsCancellationRequested)\n            {\n                return (GDTask.FromCanceled(cancellationToken), default(CancellationTokenRegistration));\n            }\n\n            var promise = new GDTaskCompletionSource();\n            return (promise.Task, cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationTokenCallback, promise));\n        }\n\n        static void Callback(object state)\n        {\n            var promise = (GDTaskCompletionSource)state;\n            promise.TrySetResult();\n        }\n\n        public static CancellationTokenAwaitable WaitUntilCanceled(this CancellationToken cancellationToken)\n        {\n            return new CancellationTokenAwaitable(cancellationToken);\n        }\n\n        public static CancellationTokenRegistration RegisterWithoutCaptureExecutionContext(this CancellationToken cancellationToken, Action callback)\n        {\n            var restoreFlow = false;\n            if (!ExecutionContext.IsFlowSuppressed())\n            {\n                ExecutionContext.SuppressFlow();\n                restoreFlow = true;\n            }\n\n            try\n            {\n                return cancellationToken.Register(callback, false);\n            }\n            finally\n            {\n                if (restoreFlow)\n                {\n                    ExecutionContext.RestoreFlow();\n                }\n            }\n        }\n\n        public static CancellationTokenRegistration RegisterWithoutCaptureExecutionContext(this CancellationToken cancellationToken, Action<object> callback, object state)\n        {\n            var restoreFlow = false;\n            if (!ExecutionContext.IsFlowSuppressed())\n            {\n                ExecutionContext.SuppressFlow();\n                restoreFlow = true;\n            }\n\n            try\n            {\n                return cancellationToken.Register(callback, state, false);\n            }\n            finally\n            {\n                if (restoreFlow)\n                {\n                    ExecutionContext.RestoreFlow();\n                }\n            }\n        }\n\n        public static CancellationTokenRegistration AddTo(this IDisposable disposable, CancellationToken cancellationToken)\n        {\n            return cancellationToken.RegisterWithoutCaptureExecutionContext(disposeCallback, disposable);\n        }\n\n        static void DisposeCallback(object state)\n        {\n            var d = (IDisposable)state;\n            d.Dispose();\n        }\n    }\n\n    public struct CancellationTokenAwaitable\n    {\n        CancellationToken cancellationToken;\n\n        public CancellationTokenAwaitable(CancellationToken cancellationToken)\n        {\n            this.cancellationToken = cancellationToken;\n        }\n\n        public Awaiter GetAwaiter()\n        {\n            return new Awaiter(cancellationToken);\n        }\n\n        public struct Awaiter : ICriticalNotifyCompletion\n        {\n            CancellationToken cancellationToken;\n\n            public Awaiter(CancellationToken cancellationToken)\n            {\n                this.cancellationToken = cancellationToken;\n            }\n\n            public bool IsCompleted => !cancellationToken.CanBeCanceled || cancellationToken.IsCancellationRequested;\n\n            public void GetResult()\n            {\n            }\n\n            public void OnCompleted(Action continuation)\n            {\n                UnsafeOnCompleted(continuation);\n            }\n\n            public void UnsafeOnCompleted(Action continuation)\n            {\n                cancellationToken.RegisterWithoutCaptureExecutionContext(continuation);\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/CancellationTokenExtensions.cs.uid",
    "content": "uid://bvmag4mxjvgn4\n"
  },
  {
    "path": "addons/GDTask/CancellationTokenSourceExtensions.cs",
    "content": "﻿using System.Threading;\nusing Fractural.Tasks.Triggers;\nusing System;\nusing Fractural.Tasks.Internal;\nusing Godot;\n\nnamespace Fractural.Tasks\n{\n\n    public static partial class CancellationTokenSourceExtensions\n    {\n        readonly static Action<object> CancelCancellationTokenSourceStateDelegate = new Action<object>(CancelCancellationTokenSourceState);\n\n        static void CancelCancellationTokenSourceState(object state)\n        {\n            var cts = (CancellationTokenSource)state;\n            cts.Cancel();\n        }\n\n        public static IDisposable CancelAfterSlim(this CancellationTokenSource cts, int millisecondsDelay, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming delayTiming = PlayerLoopTiming.Process)\n        {\n            return CancelAfterSlim(cts, TimeSpan.FromMilliseconds(millisecondsDelay), delayType, delayTiming);\n        }\n\n        public static IDisposable CancelAfterSlim(this CancellationTokenSource cts, TimeSpan delayTimeSpan, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming delayTiming = PlayerLoopTiming.Process)\n        {\n            return PlayerLoopTimer.StartNew(delayTimeSpan, false, delayType, delayTiming, cts.Token, CancelCancellationTokenSourceStateDelegate, cts);\n        }\n\n        public static void RegisterRaiseCancelOnDestroy(this CancellationTokenSource cts, Node node)\n        {\n            var trigger = node.GetAsyncDestroyTrigger();\n            trigger.CancellationToken.RegisterWithoutCaptureExecutionContext(CancelCancellationTokenSourceStateDelegate, cts);\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/CancellationTokenSourceExtensions.cs.uid",
    "content": "uid://u8ib13lqamfi\n"
  },
  {
    "path": "addons/GDTask/CompilerServices/AsyncGDTaskMethodBuilder.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Security;\n\nnamespace Fractural.Tasks.CompilerServices\n{\n    [StructLayout(LayoutKind.Auto)]\n    public struct AsyncGDTaskMethodBuilder\n    {\n        IStateMachineRunnerPromise runnerPromise;\n        Exception ex;\n\n        // 1. Static Create method.\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static AsyncGDTaskMethodBuilder Create()\n        {\n            return default;\n        }\n\n        // 2. TaskLike Task property.\n        public GDTask Task\n        {\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            get\n            {\n                if (runnerPromise != null)\n                {\n                    return runnerPromise.Task;\n                }\n                else if (ex != null)\n                {\n                    return GDTask.FromException(ex);\n                }\n                else\n                {\n                    return GDTask.CompletedTask;\n                }\n            }\n        }\n\n        // 3. SetException\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void SetException(Exception exception)\n        {\n            if (runnerPromise == null)\n            {\n                ex = exception;\n            }\n            else\n            {\n                runnerPromise.SetException(exception);\n            }\n        }\n\n        // 4. SetResult\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void SetResult()\n        {\n            if (runnerPromise != null)\n            {\n                runnerPromise.SetResult();\n            }\n        }\n\n        // 5. AwaitOnCompleted\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)\n            where TAwaiter : INotifyCompletion\n            where TStateMachine : IAsyncStateMachine\n        {\n            if (runnerPromise == null)\n            {\n                AsyncGDTask<TStateMachine>.SetStateMachine(ref stateMachine, ref runnerPromise);\n            }\n\n            awaiter.OnCompleted(runnerPromise.MoveNext);\n        }\n\n        // 6. AwaitUnsafeOnCompleted\n        [DebuggerHidden]\n        [SecuritySafeCritical]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)\n            where TAwaiter : ICriticalNotifyCompletion\n            where TStateMachine : IAsyncStateMachine\n        {\n            if (runnerPromise == null)\n            {\n                AsyncGDTask<TStateMachine>.SetStateMachine(ref stateMachine, ref runnerPromise);\n            }\n\n            awaiter.UnsafeOnCompleted(runnerPromise.MoveNext);\n        }\n\n        // 7. Start\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void Start<TStateMachine>(ref TStateMachine stateMachine)\n            where TStateMachine : IAsyncStateMachine\n        {\n            stateMachine.MoveNext();\n        }\n\n        // 8. SetStateMachine\n        [DebuggerHidden]\n        public void SetStateMachine(IAsyncStateMachine stateMachine)\n        {\n            // don't use boxed stateMachine.\n        }\n\n#if DEBUG\n        // Important for IDE debugger.\n        object debuggingId;\n        private object ObjectIdForDebugger\n        {\n            get\n            {\n                if (debuggingId == null)\n                {\n                    debuggingId = new object();\n                }\n                return debuggingId;\n            }\n        }\n#endif\n    }\n\n    [StructLayout(LayoutKind.Auto)]\n    public struct AsyncGDTaskMethodBuilder<T>\n    {\n        IStateMachineRunnerPromise<T> runnerPromise;\n        Exception ex;\n        T result;\n\n        // 1. Static Create method.\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static AsyncGDTaskMethodBuilder<T> Create()\n        {\n            return default;\n        }\n\n        // 2. TaskLike Task property.\n        public GDTask<T> Task\n        {\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            get\n            {\n                if (runnerPromise != null)\n                {\n                    return runnerPromise.Task;\n                }\n                else if (ex != null)\n                {\n                    return GDTask.FromException<T>(ex);\n                }\n                else\n                {\n                    return GDTask.FromResult(result);\n                }\n            }\n        }\n\n        // 3. SetException\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void SetException(Exception exception)\n        {\n            if (runnerPromise == null)\n            {\n                ex = exception;\n            }\n            else\n            {\n                runnerPromise.SetException(exception);\n            }\n        }\n\n        // 4. SetResult\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void SetResult(T result)\n        {\n            if (runnerPromise == null)\n            {\n                this.result = result;\n            }\n            else\n            {\n                runnerPromise.SetResult(result);\n            }\n        }\n\n        // 5. AwaitOnCompleted\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)\n            where TAwaiter : INotifyCompletion\n            where TStateMachine : IAsyncStateMachine\n        {\n            if (runnerPromise == null)\n            {\n                AsyncGDTask<TStateMachine, T>.SetStateMachine(ref stateMachine, ref runnerPromise);\n            }\n\n            awaiter.OnCompleted(runnerPromise.MoveNext);\n        }\n\n        // 6. AwaitUnsafeOnCompleted\n        [DebuggerHidden]\n        [SecuritySafeCritical]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)\n            where TAwaiter : ICriticalNotifyCompletion\n            where TStateMachine : IAsyncStateMachine\n        {\n            if (runnerPromise == null)\n            {\n                AsyncGDTask<TStateMachine, T>.SetStateMachine(ref stateMachine, ref runnerPromise);\n            }\n\n            awaiter.UnsafeOnCompleted(runnerPromise.MoveNext);\n        }\n\n        // 7. Start\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void Start<TStateMachine>(ref TStateMachine stateMachine)\n            where TStateMachine : IAsyncStateMachine\n        {\n            stateMachine.MoveNext();\n        }\n\n        // 8. SetStateMachine\n        [DebuggerHidden]\n        public void SetStateMachine(IAsyncStateMachine stateMachine)\n        {\n            // don't use boxed stateMachine.\n        }\n\n#if DEBUG\n        // Important for IDE debugger.\n        object debuggingId;\n        private object ObjectIdForDebugger\n        {\n            get\n            {\n                if (debuggingId == null)\n                {\n                    debuggingId = new object();\n                }\n                return debuggingId;\n            }\n        }\n#endif\n\n    }\n}"
  },
  {
    "path": "addons/GDTask/CompilerServices/AsyncGDTaskMethodBuilder.cs.uid",
    "content": "uid://6mv8w57jlsg3\n"
  },
  {
    "path": "addons/GDTask/CompilerServices/AsyncGDTaskVoidMethodBuilder.cs",
    "content": "﻿\nusing System;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Security;\n\nnamespace Fractural.Tasks.CompilerServices\n{\n    [StructLayout(LayoutKind.Auto)]\n    public struct AsyncGDTaskVoidMethodBuilder\n    {\n        IStateMachineRunner runner;\n\n        // 1. Static Create method.\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static AsyncGDTaskVoidMethodBuilder Create()\n        {\n            return default;\n        }\n\n        // 2. TaskLike Task property(void)\n        public GDTaskVoid Task\n        {\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            get\n            {\n                return default;\n            }\n        }\n\n        // 3. SetException\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void SetException(Exception exception)\n        {\n            // runner is finished, return first.\n            if (runner != null)\n            {\n                runner.Return();\n                runner = null;\n            }\n\n            GDTaskScheduler.PublishUnobservedTaskException(exception);\n        }\n\n        // 4. SetResult\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void SetResult()\n        {\n            // runner is finished, return.\n            if (runner != null)\n            {\n                runner.Return();\n                runner = null;\n            }\n        }\n\n        // 5. AwaitOnCompleted\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)\n            where TAwaiter : INotifyCompletion\n            where TStateMachine : IAsyncStateMachine\n        {\n            if (runner == null)\n            {\n                AsyncGDTaskVoid<TStateMachine>.SetStateMachine(ref stateMachine, ref runner);\n            }\n\n            awaiter.OnCompleted(runner.MoveNext);\n        }\n\n        // 6. AwaitUnsafeOnCompleted\n        [DebuggerHidden]\n        [SecuritySafeCritical]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)\n            where TAwaiter : ICriticalNotifyCompletion\n            where TStateMachine : IAsyncStateMachine\n        {\n            if (runner == null)\n            {\n                AsyncGDTaskVoid<TStateMachine>.SetStateMachine(ref stateMachine, ref runner);\n            }\n\n            awaiter.UnsafeOnCompleted(runner.MoveNext);\n        }\n\n        // 7. Start\n        [DebuggerHidden]\n        public void Start<TStateMachine>(ref TStateMachine stateMachine)\n            where TStateMachine : IAsyncStateMachine\n        {\n            stateMachine.MoveNext();\n        }\n\n        // 8. SetStateMachine\n        [DebuggerHidden]\n        public void SetStateMachine(IAsyncStateMachine stateMachine)\n        {\n            // don't use boxed stateMachine.\n        }\n\n#if DEBUG\n        // Important for IDE debugger.\n        object debuggingId;\n        private object ObjectIdForDebugger\n        {\n            get\n            {\n                if (debuggingId == null)\n                {\n                    debuggingId = new object();\n                }\n                return debuggingId;\n            }\n        }\n#endif\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/CompilerServices/AsyncGDTaskVoidMethodBuilder.cs.uid",
    "content": "uid://di85mfhei8bs7\n"
  },
  {
    "path": "addons/GDTask/CompilerServices/StateMachineRunner.cs",
    "content": "﻿#pragma warning disable CS1591\n\nusing System;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\n\nnamespace Fractural.Tasks.CompilerServices\n{\n    internal interface IStateMachineRunner\n    {\n        Action MoveNext { get; }\n        void Return();\n\n        Action ReturnAction { get; }\n    }\n\n    internal interface IStateMachineRunnerPromise : IGDTaskSource\n    {\n        Action MoveNext { get; }\n        GDTask Task { get; }\n        void SetResult();\n        void SetException(Exception exception);\n    }\n\n    internal interface IStateMachineRunnerPromise<T> : IGDTaskSource<T>\n    {\n        Action MoveNext { get; }\n        GDTask<T> Task { get; }\n        void SetResult(T result);\n        void SetException(Exception exception);\n    }\n\n    internal static class StateMachineUtility\n    {\n        // Get AsyncStateMachine internal state to check IL2CPP bug\n        public static int GetState(IAsyncStateMachine stateMachine)\n        {\n            var info = stateMachine.GetType().GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)\n                .First(x => x.Name.EndsWith(\"__state\"));\n            return (int)info.GetValue(stateMachine);\n        }\n    }\n\n    internal sealed class AsyncGDTaskVoid<TStateMachine> : IStateMachineRunner, ITaskPoolNode<AsyncGDTaskVoid<TStateMachine>>, IGDTaskSource\n        where TStateMachine : IAsyncStateMachine\n    {\n        static TaskPool<AsyncGDTaskVoid<TStateMachine>> pool;\n\n        public Action ReturnAction { get; }\n\n        TStateMachine stateMachine;\n\n        public Action MoveNext { get; }\n\n        public AsyncGDTaskVoid()\n        {\n            MoveNext = Run;\n        }\n\n        public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunner runnerFieldRef)\n        {\n            if (!pool.TryPop(out var result))\n            {\n                result = new AsyncGDTaskVoid<TStateMachine>();\n            }\n            TaskTracker.TrackActiveTask(result, 3);\n\n            runnerFieldRef = result; // set runner before copied.\n            result.stateMachine = stateMachine; // copy struct StateMachine(in release build).\n        }\n\n        static AsyncGDTaskVoid()\n        {\n            TaskPool.RegisterSizeGetter(typeof(AsyncGDTaskVoid<TStateMachine>), () => pool.Size);\n        }\n\n        AsyncGDTaskVoid<TStateMachine> nextNode;\n        public ref AsyncGDTaskVoid<TStateMachine> NextNode => ref nextNode;\n\n        public void Return()\n        {\n            TaskTracker.RemoveTracking(this);\n            stateMachine = default;\n            pool.TryPush(this);\n        }\n\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        void Run()\n        {\n            stateMachine.MoveNext();\n        }\n\n        // dummy interface implementation for TaskTracker.\n\n        GDTaskStatus IGDTaskSource.GetStatus(short token)\n        {\n            return GDTaskStatus.Pending;\n        }\n\n        GDTaskStatus IGDTaskSource.UnsafeGetStatus()\n        {\n            return GDTaskStatus.Pending;\n        }\n\n        void IGDTaskSource.OnCompleted(Action<object> continuation, object state, short token)\n        {\n        }\n\n        void IGDTaskSource.GetResult(short token)\n        {\n        }\n    }\n\n    internal sealed class AsyncGDTask<TStateMachine> : IStateMachineRunnerPromise, IGDTaskSource, ITaskPoolNode<AsyncGDTask<TStateMachine>>\n        where TStateMachine : IAsyncStateMachine\n    {\n        static TaskPool<AsyncGDTask<TStateMachine>> pool;\n        public Action MoveNext { get; }\n\n        TStateMachine stateMachine;\n        GDTaskCompletionSourceCore<AsyncUnit> core;\n\n        AsyncGDTask()\n        {\n            MoveNext = Run;\n        }\n\n        public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPromise runnerPromiseFieldRef)\n        {\n            if (!pool.TryPop(out var result))\n            {\n                result = new AsyncGDTask<TStateMachine>();\n            }\n            TaskTracker.TrackActiveTask(result, 3);\n\n            runnerPromiseFieldRef = result; // set runner before copied.\n            result.stateMachine = stateMachine; // copy struct StateMachine(in release build).\n        }\n\n        AsyncGDTask<TStateMachine> nextNode;\n        public ref AsyncGDTask<TStateMachine> NextNode => ref nextNode;\n\n        static AsyncGDTask()\n        {\n            TaskPool.RegisterSizeGetter(typeof(AsyncGDTask<TStateMachine>), () => pool.Size);\n        }\n\n        void Return()\n        {\n            TaskTracker.RemoveTracking(this);\n            core.Reset();\n            stateMachine = default;\n            pool.TryPush(this);\n        }\n\n        bool TryReturn()\n        {\n            TaskTracker.RemoveTracking(this);\n            core.Reset();\n            stateMachine = default;\n            return pool.TryPush(this);\n        }\n\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        void Run()\n        {\n            stateMachine.MoveNext();\n        }\n\n        public GDTask Task\n        {\n            [DebuggerHidden]\n            get\n            {\n                return new GDTask(this, core.Version);\n            }\n        }\n\n        [DebuggerHidden]\n        public void SetResult()\n        {\n            core.TrySetResult(AsyncUnit.Default);\n        }\n\n        [DebuggerHidden]\n        public void SetException(Exception exception)\n        {\n            core.TrySetException(exception);\n        }\n\n        [DebuggerHidden]\n        public void GetResult(short token)\n        {\n            try\n            {\n                core.GetResult(token);\n            }\n            finally\n            {\n                TryReturn();\n            }\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus GetStatus(short token)\n        {\n            return core.GetStatus(token);\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus UnsafeGetStatus()\n        {\n            return core.UnsafeGetStatus();\n        }\n\n        [DebuggerHidden]\n        public void OnCompleted(Action<object> continuation, object state, short token)\n        {\n            core.OnCompleted(continuation, state, token);\n        }\n    }\n\n    internal sealed class AsyncGDTask<TStateMachine, T> : IStateMachineRunnerPromise<T>, IGDTaskSource<T>, ITaskPoolNode<AsyncGDTask<TStateMachine, T>>\n        where TStateMachine : IAsyncStateMachine\n    {\n        static TaskPool<AsyncGDTask<TStateMachine, T>> pool;\n\n        public Action MoveNext { get; }\n\n        TStateMachine stateMachine;\n        GDTaskCompletionSourceCore<T> core;\n\n        AsyncGDTask()\n        {\n            MoveNext = Run;\n        }\n\n        public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPromise<T> runnerPromiseFieldRef)\n        {\n            if (!pool.TryPop(out var result))\n            {\n                result = new AsyncGDTask<TStateMachine, T>();\n            }\n            TaskTracker.TrackActiveTask(result, 3);\n\n            runnerPromiseFieldRef = result; // set runner before copied.\n            result.stateMachine = stateMachine; // copy struct StateMachine(in release build).\n        }\n\n        AsyncGDTask<TStateMachine, T> nextNode;\n        public ref AsyncGDTask<TStateMachine, T> NextNode => ref nextNode;\n\n        static AsyncGDTask()\n        {\n            TaskPool.RegisterSizeGetter(typeof(AsyncGDTask<TStateMachine, T>), () => pool.Size);\n        }\n\n        void Return()\n        {\n            TaskTracker.RemoveTracking(this);\n            core.Reset();\n            stateMachine = default;\n            pool.TryPush(this);\n        }\n\n        bool TryReturn()\n        {\n            TaskTracker.RemoveTracking(this);\n            core.Reset();\n            stateMachine = default;\n            return pool.TryPush(this);\n        }\n\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        void Run()\n        {\n            stateMachine.MoveNext();\n        }\n\n        public GDTask<T> Task\n        {\n            [DebuggerHidden]\n            get\n            {\n                return new GDTask<T>(this, core.Version);\n            }\n        }\n\n        [DebuggerHidden]\n        public void SetResult(T result)\n        {\n            core.TrySetResult(result);\n        }\n\n        [DebuggerHidden]\n        public void SetException(Exception exception)\n        {\n            core.TrySetException(exception);\n        }\n\n        [DebuggerHidden]\n        public T GetResult(short token)\n        {\n            try\n            {\n                return core.GetResult(token);\n            }\n            finally\n            {\n                TryReturn();\n            }\n        }\n\n        [DebuggerHidden]\n        void IGDTaskSource.GetResult(short token)\n        {\n            GetResult(token);\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus GetStatus(short token)\n        {\n            return core.GetStatus(token);\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus UnsafeGetStatus()\n        {\n            return core.UnsafeGetStatus();\n        }\n\n        [DebuggerHidden]\n        public void OnCompleted(Action<object> continuation, object state, short token)\n        {\n            core.OnCompleted(continuation, state, token);\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/CompilerServices/StateMachineRunner.cs.uid",
    "content": "uid://civq0j70x833j\n"
  },
  {
    "path": "addons/GDTask/GDTask.Delay.cs",
    "content": "﻿using Fractural.Tasks.Internal;\nusing Godot;\nusing System;\nusing System.Runtime.CompilerServices;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    public enum DelayType\n    {\n        /// <summary>use Time.deltaTime.</summary>\n        DeltaTime,\n        /// <summary>use Stopwatch.GetTimestamp().</summary>\n        Realtime\n    }\n\n    public partial struct GDTask\n    {\n        public static YieldAwaitable Yield()\n        {\n            // optimized for single continuation\n            return new YieldAwaitable(PlayerLoopTiming.Process);\n        }\n\n        public static YieldAwaitable Yield(PlayerLoopTiming timing)\n        {\n            // optimized for single continuation\n            return new YieldAwaitable(timing);\n        }\n\n        public static GDTask Yield(CancellationToken cancellationToken)\n        {\n            return new GDTask(YieldPromise.Create(PlayerLoopTiming.Process, cancellationToken, out var token), token);\n        }\n\n        public static GDTask Yield(PlayerLoopTiming timing, CancellationToken cancellationToken)\n        {\n            return new GDTask(YieldPromise.Create(timing, cancellationToken, out var token), token);\n        }\n\n        /// <summary>\n        /// Similar as GDTask.Yield but guaranteed run on next frame.\n        /// </summary>\n        public static GDTask NextFrame()\n        {\n            return new GDTask(NextFramePromise.Create(PlayerLoopTiming.Process, CancellationToken.None, out var token), token);\n        }\n\n        /// <summary>\n        /// Similar as GDTask.Yield but guaranteed run on next frame.\n        /// </summary>\n        public static GDTask NextFrame(PlayerLoopTiming timing)\n        {\n            return new GDTask(NextFramePromise.Create(timing, CancellationToken.None, out var token), token);\n        }\n\n        /// <summary>\n        /// Similar as GDTask.Yield but guaranteed run on next frame.\n        /// </summary>\n        public static GDTask NextFrame(CancellationToken cancellationToken)\n        {\n            return new GDTask(NextFramePromise.Create(PlayerLoopTiming.Process, cancellationToken, out var token), token);\n        }\n\n        /// <summary>\n        /// Similar as GDTask.Yield but guaranteed run on next frame.\n        /// </summary>\n        public static GDTask NextFrame(PlayerLoopTiming timing, CancellationToken cancellationToken)\n        {\n            return new GDTask(NextFramePromise.Create(timing, cancellationToken, out var token), token);\n        }\n\n        public static YieldAwaitable WaitForEndOfFrame()\n        {\n            return GDTask.Yield(PlayerLoopTiming.Process);\n        }\n\n        public static GDTask WaitForEndOfFrame(CancellationToken cancellationToken)\n        {\n            return GDTask.Yield(PlayerLoopTiming.Process, cancellationToken);\n        }\n\n        /// <summary>\n        /// Same as GDTask.Yield(PlayerLoopTiming.PhysicsProcess).\n        /// </summary>\n        public static YieldAwaitable WaitForPhysicsProcess()\n        {\n            return GDTask.Yield(PlayerLoopTiming.PhysicsProcess);\n        }\n\n        /// <summary>\n        /// Same as GDTask.Yield(PlayerLoopTiming.PhysicsProcess, cancellationToken).\n        /// </summary>\n        public static GDTask WaitForPhysicsProcess(CancellationToken cancellationToken)\n        {\n            return GDTask.Yield(PlayerLoopTiming.PhysicsProcess, cancellationToken);\n        }\n\n        public static GDTask DelayFrame(int delayFrameCount, PlayerLoopTiming delayTiming = PlayerLoopTiming.Process, CancellationToken cancellationToken = default(CancellationToken))\n        {\n            if (delayFrameCount < 0)\n            {\n                throw new ArgumentOutOfRangeException(\"Delay does not allow minus delayFrameCount. delayFrameCount:\" + delayFrameCount);\n            }\n\n            return new GDTask(DelayFramePromise.Create(delayFrameCount, delayTiming, cancellationToken, out var token), token);\n        }\n\n        public static GDTask Delay(int millisecondsDelay, PlayerLoopTiming delayTiming = PlayerLoopTiming.Process, CancellationToken cancellationToken = default(CancellationToken))\n        {\n            var delayTimeSpan = TimeSpan.FromMilliseconds(millisecondsDelay);\n            return Delay(delayTimeSpan, delayTiming, cancellationToken);\n        }\n\n        public static GDTask Delay(TimeSpan delayTimeSpan, PlayerLoopTiming delayTiming = PlayerLoopTiming.Process, CancellationToken cancellationToken = default(CancellationToken))\n        {\n            return Delay(delayTimeSpan, DelayType.DeltaTime, delayTiming, cancellationToken);\n        }\n\n        public static GDTask Delay(int millisecondsDelay, DelayType delayType, PlayerLoopTiming delayTiming = PlayerLoopTiming.Process, CancellationToken cancellationToken = default(CancellationToken))\n        {\n            var delayTimeSpan = TimeSpan.FromMilliseconds(millisecondsDelay);\n            return Delay(delayTimeSpan, delayType, delayTiming, cancellationToken);\n        }\n\n        public static GDTask Delay(TimeSpan delayTimeSpan, DelayType delayType, PlayerLoopTiming delayTiming = PlayerLoopTiming.Process, CancellationToken cancellationToken = default(CancellationToken))\n        {\n            if (delayTimeSpan < TimeSpan.Zero)\n            {\n                throw new ArgumentOutOfRangeException(\"Delay does not allow minus delayTimeSpan. delayTimeSpan:\" + delayTimeSpan);\n            }\n\n#if DEBUG\n            // force use Realtime.\n            if (GDTaskPlayerLoopAutoload.IsMainThread && Engine.IsEditorHint())\n            {\n                delayType = DelayType.Realtime;\n            }\n#endif\n            switch (delayType)\n            {\n                case DelayType.Realtime:\n                    {\n                        return new GDTask(DelayRealtimePromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token);\n                    }\n                case DelayType.DeltaTime:\n                default:\n                    {\n                        return new GDTask(DelayPromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token);\n                    }\n            }\n        }\n\n        sealed class YieldPromise : IGDTaskSource, IPlayerLoopItem, ITaskPoolNode<YieldPromise>\n        {\n            static TaskPool<YieldPromise> pool;\n            YieldPromise nextNode;\n            public ref YieldPromise NextNode => ref nextNode;\n\n            static YieldPromise()\n            {\n                TaskPool.RegisterSizeGetter(typeof(YieldPromise), () => pool.Size);\n            }\n\n            CancellationToken cancellationToken;\n            GDTaskCompletionSourceCore<object> core;\n\n            YieldPromise()\n            {\n            }\n\n            public static IGDTaskSource Create(PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    return AutoResetGDTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);\n                }\n\n                if (!pool.TryPop(out var result))\n                {\n                    result = new YieldPromise();\n                }\n\n\n                result.cancellationToken = cancellationToken;\n\n                TaskTracker.TrackActiveTask(result, 3);\n\n                GDTaskPlayerLoopAutoload.AddAction(timing, result);\n\n                token = result.core.Version;\n                return result;\n            }\n\n            public void GetResult(short token)\n            {\n                try\n                {\n                    core.GetResult(token);\n                }\n                finally\n                {\n                    TryReturn();\n                }\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public bool MoveNext()\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    core.TrySetCanceled(cancellationToken);\n                    return false;\n                }\n\n                core.TrySetResult(null);\n                return false;\n            }\n\n            bool TryReturn()\n            {\n                TaskTracker.RemoveTracking(this);\n                core.Reset();\n                cancellationToken = default;\n                return pool.TryPush(this);\n            }\n        }\n\n        sealed class NextFramePromise : IGDTaskSource, IPlayerLoopItem, ITaskPoolNode<NextFramePromise>\n        {\n            static TaskPool<NextFramePromise> pool;\n            NextFramePromise nextNode;\n            public ref NextFramePromise NextNode => ref nextNode;\n\n            static NextFramePromise()\n            {\n                TaskPool.RegisterSizeGetter(typeof(NextFramePromise), () => pool.Size);\n            }\n\n            bool isMainThread;\n            ulong frameCount;\n            CancellationToken cancellationToken;\n            GDTaskCompletionSourceCore<AsyncUnit> core;\n\n            NextFramePromise()\n            {\n            }\n\n            public static IGDTaskSource Create(PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    return AutoResetGDTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);\n                }\n\n                if (!pool.TryPop(out var result))\n                {\n                    result = new NextFramePromise();\n                }\n\n                result.isMainThread = GDTaskPlayerLoopAutoload.IsMainThread;\n                if (result.isMainThread)\n                    result.frameCount = Engine.GetProcessFrames();\n                result.cancellationToken = cancellationToken;\n\n                TaskTracker.TrackActiveTask(result, 3);\n\n                GDTaskPlayerLoopAutoload.AddAction(timing, result);\n\n                token = result.core.Version;\n                return result;\n            }\n\n            public void GetResult(short token)\n            {\n                try\n                {\n                    core.GetResult(token);\n                }\n                finally\n                {\n                    TryReturn();\n                }\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public bool MoveNext()\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    core.TrySetCanceled(cancellationToken);\n                    return false;\n                }\n\n                if (isMainThread && frameCount == Engine.GetProcessFrames())\n                {\n                    return true;\n                }\n\n                core.TrySetResult(AsyncUnit.Default);\n                return false;\n            }\n\n            bool TryReturn()\n            {\n                TaskTracker.RemoveTracking(this);\n                core.Reset();\n                cancellationToken = default;\n                return pool.TryPush(this);\n            }\n        }\n\n        sealed class DelayFramePromise : IGDTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayFramePromise>\n        {\n            static TaskPool<DelayFramePromise> pool;\n            DelayFramePromise nextNode;\n            public ref DelayFramePromise NextNode => ref nextNode;\n\n            static DelayFramePromise()\n            {\n                TaskPool.RegisterSizeGetter(typeof(DelayFramePromise), () => pool.Size);\n            }\n\n            bool isMainThread;\n            ulong initialFrame;\n            int delayFrameCount;\n            CancellationToken cancellationToken;\n\n            int currentFrameCount;\n            GDTaskCompletionSourceCore<AsyncUnit> core;\n\n            DelayFramePromise()\n            {\n            }\n\n            public static IGDTaskSource Create(int delayFrameCount, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    return AutoResetGDTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);\n                }\n\n                if (!pool.TryPop(out var result))\n                {\n                    result = new DelayFramePromise();\n                }\n\n                result.delayFrameCount = delayFrameCount;\n                result.cancellationToken = cancellationToken;\n                result.isMainThread = GDTaskPlayerLoopAutoload.IsMainThread;\n                if (result.isMainThread)\n                    result.initialFrame = Engine.GetProcessFrames();\n\n                TaskTracker.TrackActiveTask(result, 3);\n\n                GDTaskPlayerLoopAutoload.AddAction(timing, result);\n\n                token = result.core.Version;\n                return result;\n            }\n\n            public void GetResult(short token)\n            {\n                try\n                {\n                    core.GetResult(token);\n                }\n                finally\n                {\n                    TryReturn();\n                }\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public bool MoveNext()\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    core.TrySetCanceled(cancellationToken);\n                    return false;\n                }\n\n                if (currentFrameCount == 0)\n                {\n                    if (delayFrameCount == 0) // same as Yield\n                    {\n                        core.TrySetResult(AsyncUnit.Default);\n                        return false;\n                    }\n\n                    // skip in initial frame.\n                    if (isMainThread && initialFrame == Engine.GetProcessFrames())\n                    {\n#if DEBUG\n                        // force use Realtime.\n                        if (GDTaskPlayerLoopAutoload.IsMainThread && Engine.IsEditorHint())\n                        {\n                            //goto ++currentFrameCount\n                        }\n                        else\n                        {\n                            return true;\n                        }\n#else\n                        return true;\n#endif\n                    }\n                }\n\n                if (++currentFrameCount >= delayFrameCount)\n                {\n                    core.TrySetResult(AsyncUnit.Default);\n                    return false;\n                }\n\n                return true;\n            }\n\n            bool TryReturn()\n            {\n                TaskTracker.RemoveTracking(this);\n                core.Reset();\n                currentFrameCount = default;\n                delayFrameCount = default;\n                cancellationToken = default;\n                return pool.TryPush(this);\n            }\n        }\n\n        sealed class DelayPromise : IGDTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayPromise>\n        {\n            static TaskPool<DelayPromise> pool;\n            DelayPromise nextNode;\n            public ref DelayPromise NextNode => ref nextNode;\n\n            static DelayPromise()\n            {\n                TaskPool.RegisterSizeGetter(typeof(DelayPromise), () => pool.Size);\n            }\n\n            bool isMainThread;\n            ulong initialFrame;\n            double delayTimeSpan;\n            double elapsed;\n            PlayerLoopTiming timing;\n            CancellationToken cancellationToken;\n\n            GDTaskCompletionSourceCore<object> core;\n\n            DelayPromise()\n            {\n            }\n\n            public static IGDTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    return AutoResetGDTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);\n                }\n\n                if (!pool.TryPop(out var result))\n                {\n                    result = new DelayPromise();\n                }\n\n                result.elapsed = 0.0f;\n                result.delayTimeSpan = (float)delayTimeSpan.TotalSeconds;\n                result.cancellationToken = cancellationToken;\n                result.isMainThread = GDTaskPlayerLoopAutoload.IsMainThread;\n                result.timing = timing;\n                if (result.isMainThread)\n                    result.initialFrame = Engine.GetProcessFrames();\n\n                TaskTracker.TrackActiveTask(result, 3);\n\n                GDTaskPlayerLoopAutoload.AddAction(timing, result);\n\n                token = result.core.Version;\n                return result;\n            }\n\n            public void GetResult(short token)\n            {\n                try\n                {\n                    core.GetResult(token);\n                }\n                finally\n                {\n                    TryReturn();\n                }\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public bool MoveNext()\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    core.TrySetCanceled(cancellationToken);\n                    return false;\n                }\n\n                if (elapsed == 0.0f)\n                {\n                    if (isMainThread && initialFrame == Engine.GetProcessFrames())\n                    {\n                        return true;\n                    }\n                }\n\n                if (timing == PlayerLoopTiming.Process || timing == PlayerLoopTiming.PauseProcess)\n                    elapsed += GDTaskPlayerLoopAutoload.Global.DeltaTime;\n                else\n                    elapsed += GDTaskPlayerLoopAutoload.Global.PhysicsDeltaTime;\n\n                if (elapsed >= delayTimeSpan)\n                {\n                    core.TrySetResult(null);\n                    return false;\n                }\n\n                return true;\n            }\n\n            bool TryReturn()\n            {\n                TaskTracker.RemoveTracking(this);\n                core.Reset();\n                delayTimeSpan = default;\n                elapsed = default;\n                cancellationToken = default;\n                return pool.TryPush(this);\n            }\n        }\n\n        sealed class DelayRealtimePromise : IGDTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayRealtimePromise>\n        {\n            static TaskPool<DelayRealtimePromise> pool;\n            DelayRealtimePromise nextNode;\n            public ref DelayRealtimePromise NextNode => ref nextNode;\n\n            static DelayRealtimePromise()\n            {\n                TaskPool.RegisterSizeGetter(typeof(DelayRealtimePromise), () => pool.Size);\n            }\n\n            long delayTimeSpanTicks;\n            ValueStopwatch stopwatch;\n            CancellationToken cancellationToken;\n\n            GDTaskCompletionSourceCore<AsyncUnit> core;\n\n            DelayRealtimePromise()\n            {\n            }\n\n            public static IGDTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    return AutoResetGDTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);\n                }\n\n                if (!pool.TryPop(out var result))\n                {\n                    result = new DelayRealtimePromise();\n                }\n\n                result.stopwatch = ValueStopwatch.StartNew();\n                result.delayTimeSpanTicks = delayTimeSpan.Ticks;\n                result.cancellationToken = cancellationToken;\n\n                TaskTracker.TrackActiveTask(result, 3);\n\n                GDTaskPlayerLoopAutoload.AddAction(timing, result);\n\n                token = result.core.Version;\n                return result;\n            }\n\n            public void GetResult(short token)\n            {\n                try\n                {\n                    core.GetResult(token);\n                }\n                finally\n                {\n                    TryReturn();\n                }\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public bool MoveNext()\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    core.TrySetCanceled(cancellationToken);\n                    return false;\n                }\n\n                if (stopwatch.IsInvalid)\n                {\n                    core.TrySetResult(AsyncUnit.Default);\n                    return false;\n                }\n\n                if (stopwatch.ElapsedTicks >= delayTimeSpanTicks)\n                {\n                    core.TrySetResult(AsyncUnit.Default);\n                    return false;\n                }\n\n                return true;\n            }\n\n            bool TryReturn()\n            {\n                TaskTracker.RemoveTracking(this);\n                core.Reset();\n                stopwatch = default;\n                cancellationToken = default;\n                return pool.TryPush(this);\n            }\n        }\n    }\n\n    public readonly struct YieldAwaitable\n    {\n        readonly PlayerLoopTiming timing;\n\n        public YieldAwaitable(PlayerLoopTiming timing)\n        {\n            this.timing = timing;\n        }\n\n        public Awaiter GetAwaiter()\n        {\n            return new Awaiter(timing);\n        }\n\n        public GDTask ToGDTask()\n        {\n            return GDTask.Yield(timing, CancellationToken.None);\n        }\n\n        public readonly struct Awaiter : ICriticalNotifyCompletion\n        {\n            readonly PlayerLoopTiming timing;\n\n            public Awaiter(PlayerLoopTiming timing)\n            {\n                this.timing = timing;\n            }\n\n            public bool IsCompleted => false;\n\n            public void GetResult() { }\n\n            public void OnCompleted(Action continuation)\n            {\n                GDTaskPlayerLoopAutoload.AddContinuation(timing, continuation);\n            }\n\n            public void UnsafeOnCompleted(Action continuation)\n            {\n                GDTaskPlayerLoopAutoload.AddContinuation(timing, continuation);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/GDTask.Delay.cs.uid",
    "content": "uid://btyvmsmlux4qq\n"
  },
  {
    "path": "addons/GDTask/GDTask.Factory.cs",
    "content": "﻿using Fractural.Tasks.Internal;\nusing System;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.ExceptionServices;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    public partial struct GDTask\n    {\n        static readonly GDTask CanceledGDTask = new Func<GDTask>(() =>\n        {\n            return new GDTask(new CanceledResultSource(CancellationToken.None), 0);\n        })();\n\n        static class CanceledGDTaskCache<T>\n        {\n            public static readonly GDTask<T> Task;\n\n            static CanceledGDTaskCache()\n            {\n                Task = new GDTask<T>(new CanceledResultSource<T>(CancellationToken.None), 0);\n            }\n        }\n\n        public static readonly GDTask CompletedTask = new GDTask();\n\n        public static GDTask FromException(Exception ex)\n        {\n            if (ex is OperationCanceledException oce)\n            {\n                return FromCanceled(oce.CancellationToken);\n            }\n\n            return new GDTask(new ExceptionResultSource(ex), 0);\n        }\n\n        public static GDTask<T> FromException<T>(Exception ex)\n        {\n            if (ex is OperationCanceledException oce)\n            {\n                return FromCanceled<T>(oce.CancellationToken);\n            }\n\n            return new GDTask<T>(new ExceptionResultSource<T>(ex), 0);\n        }\n\n        public static GDTask<T> FromResult<T>(T value)\n        {\n            return new GDTask<T>(value);\n        }\n\n        public static GDTask FromCanceled(CancellationToken cancellationToken = default)\n        {\n            if (cancellationToken == CancellationToken.None)\n            {\n                return CanceledGDTask;\n            }\n            else\n            {\n                return new GDTask(new CanceledResultSource(cancellationToken), 0);\n            }\n        }\n\n        public static GDTask<T> FromCanceled<T>(CancellationToken cancellationToken = default)\n        {\n            if (cancellationToken == CancellationToken.None)\n            {\n                return CanceledGDTaskCache<T>.Task;\n            }\n            else\n            {\n                return new GDTask<T>(new CanceledResultSource<T>(cancellationToken), 0);\n            }\n        }\n\n        public static GDTask Create(Func<GDTask> factory)\n        {\n            return factory();\n        }\n\n        public static GDTask<T> Create<T>(Func<GDTask<T>> factory)\n        {\n            return factory();\n        }\n\n        public static AsyncLazy Lazy(Func<GDTask> factory)\n        {\n            return new AsyncLazy(factory);\n        }\n\n        public static AsyncLazy<T> Lazy<T>(Func<GDTask<T>> factory)\n        {\n            return new AsyncLazy<T>(factory);\n        }\n\n        /// <summary>\n        /// helper of fire and forget void action.\n        /// </summary>\n        public static void Void(Func<GDTaskVoid> asyncAction)\n        {\n            asyncAction().Forget();\n        }\n\n        /// <summary>\n        /// helper of fire and forget void action.\n        /// </summary>\n        public static void Void(Func<CancellationToken, GDTaskVoid> asyncAction, CancellationToken cancellationToken)\n        {\n            asyncAction(cancellationToken).Forget();\n        }\n\n        /// <summary>\n        /// helper of fire and forget void action.\n        /// </summary>\n        public static void Void<T>(Func<T, GDTaskVoid> asyncAction, T state)\n        {\n            asyncAction(state).Forget();\n        }\n\n        /// <summary>\n        /// helper of create add GDTaskVoid to delegate.\n        /// For example: FooAction = GDTask.Action(async () => { /* */ })\n        /// </summary>\n        public static Action Action(Func<GDTaskVoid> asyncAction)\n        {\n            return () => asyncAction().Forget();\n        }\n\n        /// <summary>\n        /// helper of create add GDTaskVoid to delegate.\n        /// </summary>\n        public static Action Action(Func<CancellationToken, GDTaskVoid> asyncAction, CancellationToken cancellationToken)\n        {\n            return () => asyncAction(cancellationToken).Forget();\n        }\n\n        /// <summary>\n        /// Defer the task creation just before call await.\n        /// </summary>\n        public static GDTask Defer(Func<GDTask> factory)\n        {\n            return new GDTask(new DeferPromise(factory), 0);\n        }\n\n        /// <summary>\n        /// Defer the task creation just before call await.\n        /// </summary>\n        public static GDTask<T> Defer<T>(Func<GDTask<T>> factory)\n        {\n            return new GDTask<T>(new DeferPromise<T>(factory), 0);\n        }\n\n        /// <summary>\n        /// Never complete.\n        /// </summary>\n        public static GDTask Never(CancellationToken cancellationToken = default)\n        {\n            return new GDTask<AsyncUnit>(new NeverPromise<AsyncUnit>(cancellationToken), 0);\n        }\n\n        /// <summary>\n        /// Never complete.\n        /// </summary>\n        public static GDTask<T> Never<T>(CancellationToken cancellationToken = default)\n        {\n            return new GDTask<T>(new NeverPromise<T>(cancellationToken), 0);\n        }\n\n        sealed class ExceptionResultSource : IGDTaskSource\n        {\n            readonly ExceptionDispatchInfo exception;\n            bool calledGet;\n\n            public ExceptionResultSource(Exception exception)\n            {\n                this.exception = ExceptionDispatchInfo.Capture(exception);\n            }\n\n            public void GetResult(short token)\n            {\n                if (!calledGet)\n                {\n                    calledGet = true;\n                    GC.SuppressFinalize(this);\n                }\n                exception.Throw();\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return GDTaskStatus.Faulted;\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return GDTaskStatus.Faulted;\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                continuation(state);\n            }\n\n            ~ExceptionResultSource()\n            {\n                if (!calledGet)\n                {\n                    GDTaskScheduler.PublishUnobservedTaskException(exception.SourceException);\n                }\n            }\n        }\n\n        sealed class ExceptionResultSource<T> : IGDTaskSource<T>\n        {\n            readonly ExceptionDispatchInfo exception;\n            bool calledGet;\n\n            public ExceptionResultSource(Exception exception)\n            {\n                this.exception = ExceptionDispatchInfo.Capture(exception);\n            }\n\n            public T GetResult(short token)\n            {\n                if (!calledGet)\n                {\n                    calledGet = true;\n                    GC.SuppressFinalize(this);\n                }\n                exception.Throw();\n                return default;\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                if (!calledGet)\n                {\n                    calledGet = true;\n                    GC.SuppressFinalize(this);\n                }\n                exception.Throw();\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return GDTaskStatus.Faulted;\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return GDTaskStatus.Faulted;\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                continuation(state);\n            }\n\n            ~ExceptionResultSource()\n            {\n                if (!calledGet)\n                {\n                    GDTaskScheduler.PublishUnobservedTaskException(exception.SourceException);\n                }\n            }\n        }\n\n        sealed class CanceledResultSource : IGDTaskSource\n        {\n            readonly CancellationToken cancellationToken;\n\n            public CanceledResultSource(CancellationToken cancellationToken)\n            {\n                this.cancellationToken = cancellationToken;\n            }\n\n            public void GetResult(short token)\n            {\n                throw new OperationCanceledException(cancellationToken);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return GDTaskStatus.Canceled;\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return GDTaskStatus.Canceled;\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                continuation(state);\n            }\n        }\n\n        sealed class CanceledResultSource<T> : IGDTaskSource<T>\n        {\n            readonly CancellationToken cancellationToken;\n\n            public CanceledResultSource(CancellationToken cancellationToken)\n            {\n                this.cancellationToken = cancellationToken;\n            }\n\n            public T GetResult(short token)\n            {\n                throw new OperationCanceledException(cancellationToken);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                throw new OperationCanceledException(cancellationToken);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return GDTaskStatus.Canceled;\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return GDTaskStatus.Canceled;\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                continuation(state);\n            }\n        }\n\n        sealed class DeferPromise : IGDTaskSource\n        {\n            Func<GDTask> factory;\n            GDTask task;\n            GDTask.Awaiter awaiter;\n\n            public DeferPromise(Func<GDTask> factory)\n            {\n                this.factory = factory;\n            }\n\n            public void GetResult(short token)\n            {\n                awaiter.GetResult();\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                var f = Interlocked.Exchange(ref factory, null);\n                if (f != null)\n                {\n                    task = f();\n                    awaiter = task.GetAwaiter();\n                }\n\n                return task.Status;\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                awaiter.SourceOnCompleted(continuation, state);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return task.Status;\n            }\n        }\n\n        sealed class DeferPromise<T> : IGDTaskSource<T>\n        {\n            Func<GDTask<T>> factory;\n            GDTask<T> task;\n            GDTask<T>.Awaiter awaiter;\n\n            public DeferPromise(Func<GDTask<T>> factory)\n            {\n                this.factory = factory;\n            }\n\n            public T GetResult(short token)\n            {\n                return awaiter.GetResult();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                awaiter.GetResult();\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                var f = Interlocked.Exchange(ref factory, null);\n                if (f != null)\n                {\n                    task = f();\n                    awaiter = task.GetAwaiter();\n                }\n\n                return task.Status;\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                awaiter.SourceOnCompleted(continuation, state);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return task.Status;\n            }\n        }\n\n        sealed class NeverPromise<T> : IGDTaskSource<T>\n        {\n            static readonly Action<object> cancellationCallback = CancellationCallback;\n\n            CancellationToken cancellationToken;\n            GDTaskCompletionSourceCore<T> core;\n\n            public NeverPromise(CancellationToken cancellationToken)\n            {\n                this.cancellationToken = cancellationToken;\n                if (this.cancellationToken.CanBeCanceled)\n                {\n                    this.cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this);\n                }\n            }\n\n            static void CancellationCallback(object state)\n            {\n                var self = (NeverPromise<T>)state;\n                self.core.TrySetCanceled(self.cancellationToken);\n            }\n\n            public T GetResult(short token)\n            {\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                core.GetResult(token);\n            }\n        }\n    }\n\n    internal static class CompletedTasks\n    {\n        public static readonly GDTask<AsyncUnit> AsyncUnit = GDTask.FromResult(Fractural.Tasks.AsyncUnit.Default);\n        public static readonly GDTask<bool> True = GDTask.FromResult(true);\n        public static readonly GDTask<bool> False = GDTask.FromResult(false);\n        public static readonly GDTask<int> Zero = GDTask.FromResult(0);\n        public static readonly GDTask<int> MinusOne = GDTask.FromResult(-1);\n        public static readonly GDTask<int> One = GDTask.FromResult(1);\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/GDTask.Factory.cs.uid",
    "content": "uid://p3ayqohsixwx\n"
  },
  {
    "path": "addons/GDTask/GDTask.Run.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    public partial struct GDTask\n    {\n        #region OBSOLETE_RUN\n\n        [Obsolete(\"GDTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use GDTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use GDTask.Void(async void) or GDTask.Create(async GDTask) too.\")]\n        public static GDTask Run(Action action, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            return RunOnThreadPool(action, configureAwait, cancellationToken);\n        }\n\n        [Obsolete(\"GDTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use GDTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use GDTask.Void(async void) or GDTask.Create(async GDTask) too.\")]\n        public static GDTask Run(Action<object> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            return RunOnThreadPool(action, state, configureAwait, cancellationToken);\n        }\n\n        [Obsolete(\"GDTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use GDTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use GDTask.Void(async void) or GDTask.Create(async GDTask) too.\")]\n        public static GDTask Run(Func<GDTask> action, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            return RunOnThreadPool(action, configureAwait, cancellationToken);\n        }\n\n        [Obsolete(\"GDTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use GDTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use GDTask.Void(async void) or GDTask.Create(async GDTask) too.\")]\n        public static GDTask Run(Func<object, GDTask> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            return RunOnThreadPool(action, state, configureAwait, cancellationToken);\n        }\n\n        [Obsolete(\"GDTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use GDTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use GDTask.Void(async void) or GDTask.Create(async GDTask) too.\")]\n        public static GDTask<T> Run<T>(Func<T> func, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            return RunOnThreadPool(func, configureAwait, cancellationToken);\n        }\n\n        [Obsolete(\"GDTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use GDTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use GDTask.Void(async void) or GDTask.Create(async GDTask) too.\")]\n        public static GDTask<T> Run<T>(Func<GDTask<T>> func, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            return RunOnThreadPool(func, configureAwait, cancellationToken);\n        }\n\n        [Obsolete(\"GDTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use GDTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use GDTask.Void(async void) or GDTask.Create(async GDTask) too.\")]\n        public static GDTask<T> Run<T>(Func<object, T> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            return RunOnThreadPool(func, state, configureAwait, cancellationToken);\n        }\n\n        [Obsolete(\"GDTask.Run is similar as Task.Run, it uses ThreadPool. For equivalent behaviour, use GDTask.RunOnThreadPool instead. If you don't want to use ThreadPool, you can use GDTask.Void(async void) or GDTask.Create(async GDTask) too.\")]\n        public static GDTask<T> Run<T>(Func<object, GDTask<T>> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            return RunOnThreadPool(func, state, configureAwait, cancellationToken);\n        }\n\n        #endregion\n\n        /// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>\n        public static async GDTask RunOnThreadPool(Action action, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            cancellationToken.ThrowIfCancellationRequested();\n\n            await GDTask.SwitchToThreadPool();\n\n            cancellationToken.ThrowIfCancellationRequested();\n\n            if (configureAwait)\n            {\n                try\n                {\n                    action();\n                }\n                finally\n                {\n                    await GDTask.Yield();\n                }\n            }\n            else\n            {\n                action();\n            }\n\n            cancellationToken.ThrowIfCancellationRequested();\n        }\n\n        /// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>\n        public static async GDTask RunOnThreadPool(Action<object> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            cancellationToken.ThrowIfCancellationRequested();\n\n            await GDTask.SwitchToThreadPool();\n\n            cancellationToken.ThrowIfCancellationRequested();\n\n            if (configureAwait)\n            {\n                try\n                {\n                    action(state);\n                }\n                finally\n                {\n                    await GDTask.Yield();\n                }\n            }\n            else\n            {\n                action(state);\n            }\n\n            cancellationToken.ThrowIfCancellationRequested();\n        }\n\n        /// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>\n        public static async GDTask RunOnThreadPool(Func<GDTask> action, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            cancellationToken.ThrowIfCancellationRequested();\n\n            await GDTask.SwitchToThreadPool();\n\n            cancellationToken.ThrowIfCancellationRequested();\n\n            if (configureAwait)\n            {\n                try\n                {\n                    await action();\n                }\n                finally\n                {\n                    await GDTask.Yield();\n                }\n            }\n            else\n            {\n                await action();\n            }\n\n            cancellationToken.ThrowIfCancellationRequested();\n        }\n\n        /// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>\n        public static async GDTask RunOnThreadPool(Func<object, GDTask> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            cancellationToken.ThrowIfCancellationRequested();\n\n            await GDTask.SwitchToThreadPool();\n\n            cancellationToken.ThrowIfCancellationRequested();\n\n            if (configureAwait)\n            {\n                try\n                {\n                    await action(state);\n                }\n                finally\n                {\n                    await GDTask.Yield();\n                }\n            }\n            else\n            {\n                await action(state);\n            }\n\n            cancellationToken.ThrowIfCancellationRequested();\n        }\n\n        /// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>\n        public static async GDTask<T> RunOnThreadPool<T>(Func<T> func, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            cancellationToken.ThrowIfCancellationRequested();\n\n            await GDTask.SwitchToThreadPool();\n\n            cancellationToken.ThrowIfCancellationRequested();\n\n            if (configureAwait)\n            {\n                try\n                {\n                    return func();\n                }\n                finally\n                {\n                    await GDTask.Yield();\n                    cancellationToken.ThrowIfCancellationRequested();\n                }\n            }\n            else\n            {\n                return func();\n            }\n        }\n\n        /// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>\n        public static async GDTask<T> RunOnThreadPool<T>(Func<GDTask<T>> func, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            cancellationToken.ThrowIfCancellationRequested();\n\n            await GDTask.SwitchToThreadPool();\n\n            cancellationToken.ThrowIfCancellationRequested();\n\n            if (configureAwait)\n            {\n                try\n                {\n                    return await func();\n                }\n                finally\n                {\n                    cancellationToken.ThrowIfCancellationRequested();\n                    await GDTask.Yield();\n                    cancellationToken.ThrowIfCancellationRequested();\n                }\n            }\n            else\n            {\n                var result = await func();\n                cancellationToken.ThrowIfCancellationRequested();\n                return result;\n            }\n        }\n\n        /// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>\n        public static async GDTask<T> RunOnThreadPool<T>(Func<object, T> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            cancellationToken.ThrowIfCancellationRequested();\n\n            await GDTask.SwitchToThreadPool();\n\n            cancellationToken.ThrowIfCancellationRequested();\n\n            if (configureAwait)\n            {\n                try\n                {\n                    return func(state);\n                }\n                finally\n                {\n                    await GDTask.Yield();\n                    cancellationToken.ThrowIfCancellationRequested();\n                }\n            }\n            else\n            {\n                return func(state);\n            }\n        }\n\n        /// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>\n        public static async GDTask<T> RunOnThreadPool<T>(Func<object, GDTask<T>> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default)\n        {\n            cancellationToken.ThrowIfCancellationRequested();\n\n            await GDTask.SwitchToThreadPool();\n\n            cancellationToken.ThrowIfCancellationRequested();\n\n            if (configureAwait)\n            {\n                try\n                {\n                    return await func(state);\n                }\n                finally\n                {\n                    cancellationToken.ThrowIfCancellationRequested();\n                    await GDTask.Yield();\n                    cancellationToken.ThrowIfCancellationRequested();\n                }\n            }\n            else\n            {\n                var result = await func(state);\n                cancellationToken.ThrowIfCancellationRequested();\n                return result;\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/GDTask.Run.cs.uid",
    "content": "uid://daid4jdjbp0au\n"
  },
  {
    "path": "addons/GDTask/GDTask.Threading.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Fractural.Tasks.Internal;\n\nnamespace Fractural.Tasks\n{\n    public partial struct GDTask\n    {\n\n        /// <summary>\n        /// If running on mainthread, do nothing. Otherwise, same as GDTask.Yield(PlayerLoopTiming.Update).\n        /// </summary>\n        public static SwitchToMainThreadAwaitable SwitchToMainThread(CancellationToken cancellationToken = default)\n        {\n            return new SwitchToMainThreadAwaitable(PlayerLoopTiming.Process, cancellationToken);\n        }\n\n        /// <summary>\n        /// If running on mainthread, do nothing. Otherwise, same as GDTask.Yield(timing).\n        /// </summary>\n        public static SwitchToMainThreadAwaitable SwitchToMainThread(PlayerLoopTiming timing, CancellationToken cancellationToken = default)\n        {\n            return new SwitchToMainThreadAwaitable(timing, cancellationToken);\n        }\n\n        /// <summary>\n        /// Return to mainthread(same as await SwitchToMainThread) after using scope is closed.\n        /// </summary>\n        public static ReturnToMainThread ReturnToMainThread(CancellationToken cancellationToken = default)\n        {\n            return new ReturnToMainThread(PlayerLoopTiming.Process, cancellationToken);\n        }\n\n        /// <summary>\n        /// Return to mainthread(same as await SwitchToMainThread) after using scope is closed.\n        /// </summary>\n        public static ReturnToMainThread ReturnToMainThread(PlayerLoopTiming timing, CancellationToken cancellationToken = default)\n        {\n            return new ReturnToMainThread(timing, cancellationToken);\n        }\n\n        /// <summary>\n        /// Queue the action to PlayerLoop.\n        /// </summary>\n        public static void Post(Action action, PlayerLoopTiming timing = PlayerLoopTiming.Process)\n        {\n            GDTaskPlayerLoopAutoload.AddContinuation(timing, action);\n        }\n\n\n        public static SwitchToThreadPoolAwaitable SwitchToThreadPool()\n        {\n            return new SwitchToThreadPoolAwaitable();\n        }\n\n        /// <summary>\n        /// Note: use SwitchToThreadPool is recommended.\n        /// </summary>\n        public static SwitchToTaskPoolAwaitable SwitchToTaskPool()\n        {\n            return new SwitchToTaskPoolAwaitable();\n        }\n\n        public static SwitchToSynchronizationContextAwaitable SwitchToSynchronizationContext(SynchronizationContext synchronizationContext, CancellationToken cancellationToken = default)\n        {\n            Error.ThrowArgumentNullException(synchronizationContext, nameof(synchronizationContext));\n            return new SwitchToSynchronizationContextAwaitable(synchronizationContext, cancellationToken);\n        }\n\n        public static ReturnToSynchronizationContext ReturnToSynchronizationContext(SynchronizationContext synchronizationContext, CancellationToken cancellationToken = default)\n        {\n            return new ReturnToSynchronizationContext(synchronizationContext, false, cancellationToken);\n        }\n\n        public static ReturnToSynchronizationContext ReturnToCurrentSynchronizationContext(bool dontPostWhenSameContext = true, CancellationToken cancellationToken = default)\n        {\n            return new ReturnToSynchronizationContext(SynchronizationContext.Current, dontPostWhenSameContext, cancellationToken);\n        }\n    }\n\n    public struct SwitchToMainThreadAwaitable\n    {\n        readonly PlayerLoopTiming playerLoopTiming;\n        readonly CancellationToken cancellationToken;\n\n        public SwitchToMainThreadAwaitable(PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken)\n        {\n            this.playerLoopTiming = playerLoopTiming;\n            this.cancellationToken = cancellationToken;\n        }\n\n        public Awaiter GetAwaiter() => new Awaiter(playerLoopTiming, cancellationToken);\n\n        public struct Awaiter : ICriticalNotifyCompletion\n        {\n            readonly PlayerLoopTiming playerLoopTiming;\n            readonly CancellationToken cancellationToken;\n\n            public Awaiter(PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken)\n            {\n                this.playerLoopTiming = playerLoopTiming;\n                this.cancellationToken = cancellationToken;\n            }\n\n            public bool IsCompleted\n            {\n                get\n                {\n                    var currentThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;\n                    if (GDTaskPlayerLoopAutoload.MainThreadId == currentThreadId)\n                    {\n                        return true; // run immediate.\n                    }\n                    else\n                    {\n                        return false; // register continuation.\n                    }\n                }\n            }\n\n            public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); }\n\n            public void OnCompleted(Action continuation)\n            {\n                GDTaskPlayerLoopAutoload.AddContinuation(playerLoopTiming, continuation);\n            }\n\n            public void UnsafeOnCompleted(Action continuation)\n            {\n                GDTaskPlayerLoopAutoload.AddContinuation(playerLoopTiming, continuation);\n            }\n        }\n    }\n\n    public struct ReturnToMainThread\n    {\n        readonly PlayerLoopTiming playerLoopTiming;\n        readonly CancellationToken cancellationToken;\n\n        public ReturnToMainThread(PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken)\n        {\n            this.playerLoopTiming = playerLoopTiming;\n            this.cancellationToken = cancellationToken;\n        }\n\n        public Awaiter DisposeAsync()\n        {\n            return new Awaiter(playerLoopTiming, cancellationToken); // run immediate.\n        }\n\n        public readonly struct Awaiter : ICriticalNotifyCompletion\n        {\n            readonly PlayerLoopTiming timing;\n            readonly CancellationToken cancellationToken;\n\n            public Awaiter(PlayerLoopTiming timing, CancellationToken cancellationToken)\n            {\n                this.timing = timing;\n                this.cancellationToken = cancellationToken;\n            }\n\n            public Awaiter GetAwaiter() => this;\n\n            public bool IsCompleted => GDTaskPlayerLoopAutoload.MainThreadId == System.Threading.Thread.CurrentThread.ManagedThreadId;\n\n            public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); }\n\n            public void OnCompleted(Action continuation)\n            {\n                GDTaskPlayerLoopAutoload.AddContinuation(timing, continuation);\n            }\n\n            public void UnsafeOnCompleted(Action continuation)\n            {\n                GDTaskPlayerLoopAutoload.AddContinuation(timing, continuation);\n            }\n        }\n    }\n\n\n    public struct SwitchToThreadPoolAwaitable\n    {\n        public Awaiter GetAwaiter() => new Awaiter();\n\n        public struct Awaiter : ICriticalNotifyCompletion\n        {\n            static readonly WaitCallback switchToCallback = Callback;\n\n            public bool IsCompleted => false;\n            public void GetResult() { }\n\n            public void OnCompleted(Action continuation)\n            {\n                ThreadPool.QueueUserWorkItem(switchToCallback, continuation);\n            }\n\n            public void UnsafeOnCompleted(Action continuation)\n            {\n                ThreadPool.UnsafeQueueUserWorkItem(switchToCallback, continuation);\n            }\n\n            static void Callback(object state)\n            {\n                var continuation = (Action)state;\n                continuation();\n            }\n        }\n    }\n\n    public struct SwitchToTaskPoolAwaitable\n    {\n        public Awaiter GetAwaiter() => new Awaiter();\n\n        public struct Awaiter : ICriticalNotifyCompletion\n        {\n            static readonly Action<object> switchToCallback = Callback;\n\n            public bool IsCompleted => false;\n            public void GetResult() { }\n\n            public void OnCompleted(Action continuation)\n            {\n                Task.Factory.StartNew(switchToCallback, continuation, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);\n            }\n\n            public void UnsafeOnCompleted(Action continuation)\n            {\n                Task.Factory.StartNew(switchToCallback, continuation, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);\n            }\n\n            static void Callback(object state)\n            {\n                var continuation = (Action)state;\n                continuation();\n            }\n        }\n    }\n\n    public struct SwitchToSynchronizationContextAwaitable\n    {\n        readonly SynchronizationContext synchronizationContext;\n        readonly CancellationToken cancellationToken;\n\n        public SwitchToSynchronizationContextAwaitable(SynchronizationContext synchronizationContext, CancellationToken cancellationToken)\n        {\n            this.synchronizationContext = synchronizationContext;\n            this.cancellationToken = cancellationToken;\n        }\n\n        public Awaiter GetAwaiter() => new Awaiter(synchronizationContext, cancellationToken);\n\n        public struct Awaiter : ICriticalNotifyCompletion\n        {\n            static readonly SendOrPostCallback switchToCallback = Callback;\n            readonly SynchronizationContext synchronizationContext;\n            readonly CancellationToken cancellationToken;\n\n            public Awaiter(SynchronizationContext synchronizationContext, CancellationToken cancellationToken)\n            {\n                this.synchronizationContext = synchronizationContext;\n                this.cancellationToken = cancellationToken;\n            }\n\n            public bool IsCompleted => false;\n            public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); }\n\n            public void OnCompleted(Action continuation)\n            {\n                synchronizationContext.Post(switchToCallback, continuation);\n            }\n\n            public void UnsafeOnCompleted(Action continuation)\n            {\n                synchronizationContext.Post(switchToCallback, continuation);\n            }\n\n            static void Callback(object state)\n            {\n                var continuation = (Action)state;\n                continuation();\n            }\n        }\n    }\n\n    public struct ReturnToSynchronizationContext\n    {\n        readonly SynchronizationContext syncContext;\n        readonly bool dontPostWhenSameContext;\n        readonly CancellationToken cancellationToken;\n\n        public ReturnToSynchronizationContext(SynchronizationContext syncContext, bool dontPostWhenSameContext, CancellationToken cancellationToken)\n        {\n            this.syncContext = syncContext;\n            this.dontPostWhenSameContext = dontPostWhenSameContext;\n            this.cancellationToken = cancellationToken;\n        }\n\n        public Awaiter DisposeAsync()\n        {\n            return new Awaiter(syncContext, dontPostWhenSameContext, cancellationToken);\n        }\n\n        public struct Awaiter : ICriticalNotifyCompletion\n        {\n            static readonly SendOrPostCallback switchToCallback = Callback;\n\n            readonly SynchronizationContext synchronizationContext;\n            readonly bool dontPostWhenSameContext;\n            readonly CancellationToken cancellationToken;\n\n            public Awaiter(SynchronizationContext synchronizationContext, bool dontPostWhenSameContext, CancellationToken cancellationToken)\n            {\n                this.synchronizationContext = synchronizationContext;\n                this.dontPostWhenSameContext = dontPostWhenSameContext;\n                this.cancellationToken = cancellationToken;\n            }\n\n            public Awaiter GetAwaiter() => this;\n\n            public bool IsCompleted\n            {\n                get\n                {\n                    if (!dontPostWhenSameContext) return false;\n\n                    var current = SynchronizationContext.Current;\n                    if (current == synchronizationContext)\n                    {\n                        return true;\n                    }\n                    else\n                    {\n                        return false;\n                    }\n                }\n            }\n\n            public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); }\n\n            public void OnCompleted(Action continuation)\n            {\n                synchronizationContext.Post(switchToCallback, continuation);\n            }\n\n            public void UnsafeOnCompleted(Action continuation)\n            {\n                synchronizationContext.Post(switchToCallback, continuation);\n            }\n\n            static void Callback(object state)\n            {\n                var continuation = (Action)state;\n                continuation();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/GDTask.Threading.cs.uid",
    "content": "uid://dwpp8canxmyfw\n"
  },
  {
    "path": "addons/GDTask/GDTask.ToSignal.cs",
    "content": "﻿using Godot;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    public partial struct GDTask\n    {\n        public static async GDTask<Variant[]> ToSignal(GodotObject self, StringName signal)\n        {\n            return await self.ToSignal(self, signal);\n        }\n\n        public static async GDTask<Variant[]> ToSignal(GodotObject self, StringName signal, CancellationToken ct)\n        {\n            var tcs = new GDTaskCompletionSource<Variant[]>();\n            ct.Register(() => tcs.TrySetCanceled(ct));\n            Create(async () =>\n            {\n                var result = await self.ToSignal(self, signal);\n                tcs.TrySetResult(result);\n            }).Forget();\n            return await tcs.Task;\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/GDTask.ToSignal.cs.uid",
    "content": "uid://coomhn117gtgx\n"
  },
  {
    "path": "addons/GDTask/GDTask.WaitUntil.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing Fractural.Tasks.Internal;\nusing Godot;\n\nnamespace Fractural.Tasks\n{\n    public partial struct GDTask\n    {\n        public static GDTask WaitUntil(GodotObject target, Func<bool> predicate, PlayerLoopTiming timing = PlayerLoopTiming.Process, CancellationToken cancellationToken = default)\n        {\n            return new GDTask(WaitUntilPromise.Create(target, predicate, timing, cancellationToken, out var token), token);\n        }\n        public static GDTask WaitUntil(Func<bool> predicate, PlayerLoopTiming timing = PlayerLoopTiming.Process, CancellationToken cancellationToken = default)\n        {\n            return WaitUntil(null, predicate, timing, cancellationToken);\n        }\n\n        public static GDTask WaitWhile(GodotObject target, Func<bool> predicate, PlayerLoopTiming timing = PlayerLoopTiming.Process, CancellationToken cancellationToken = default)\n        {\n            return new GDTask(WaitWhilePromise.Create(target, predicate, timing, cancellationToken, out var token), token);\n        }\n        public static GDTask WaitWhile(Func<bool> predicate, PlayerLoopTiming timing = PlayerLoopTiming.Process, CancellationToken cancellationToken = default)\n        {\n            return WaitWhile(null, predicate, timing, cancellationToken);\n        }\n\n        public static GDTask WaitUntilCanceled(GodotObject target, CancellationToken cancellationToken, PlayerLoopTiming timing = PlayerLoopTiming.Process)\n        {\n            return new GDTask(WaitUntilCanceledPromise.Create(target, cancellationToken, timing, out var token), token);\n        }\n        public static GDTask WaitUntilCanceled(CancellationToken cancellationToken, PlayerLoopTiming timing = PlayerLoopTiming.Process)\n        {\n            return WaitUntilCanceled(null, cancellationToken, timing);\n        }\n\n        public static GDTask<U> WaitUntilValueChanged<T, U>(T target, Func<T, U> monitorFunction, PlayerLoopTiming monitorTiming = PlayerLoopTiming.Process, IEqualityComparer<U> equalityComparer = null, CancellationToken cancellationToken = default)\n          where T : class\n        {\n            return new GDTask<U>(target is GodotObject\n                ? WaitUntilValueChangedGodotObjectPromise<T, U>.Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, out var token)\n                : WaitUntilValueChangedStandardObjectPromise<T, U>.Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, out token), token);\n        }\n\n        sealed class WaitUntilPromise : IGDTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitUntilPromise>\n        {\n            static TaskPool<WaitUntilPromise> pool;\n            WaitUntilPromise nextNode;\n            public ref WaitUntilPromise NextNode => ref nextNode;\n\n            static WaitUntilPromise()\n            {\n                TaskPool.RegisterSizeGetter(typeof(WaitUntilPromise), () => pool.Size);\n            }\n\n            GodotObject target;\n            Func<bool> predicate;\n            CancellationToken cancellationToken;\n\n            GDTaskCompletionSourceCore<object> core;\n\n            WaitUntilPromise()\n            {\n            }\n\n            public static IGDTaskSource Create(GodotObject target, Func<bool> predicate, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    return AutoResetGDTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);\n                }\n\n                if (!pool.TryPop(out var result))\n                {\n                    result = new WaitUntilPromise();\n                }\n\n                result.target = target;\n                result.predicate = predicate;\n                result.cancellationToken = cancellationToken;\n\n                TaskTracker.TrackActiveTask(result, 3);\n\n                GDTaskPlayerLoopAutoload.AddAction(timing, result);\n\n                token = result.core.Version;\n                return result;\n            }\n\n            public void GetResult(short token)\n            {\n                try\n                {\n                    core.GetResult(token);\n                }\n                finally\n                {\n                    TryReturn();\n                }\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public bool MoveNext()\n            {\n                if (cancellationToken.IsCancellationRequested || (target is not null && !GodotObject.IsInstanceValid(target))) // Cancel when destroyed\n                {\n                    core.TrySetCanceled(cancellationToken);\n                    return false;\n                }\n\n                try\n                {\n                    if (!predicate())\n                    {\n                        return true;\n                    }\n                }\n                catch (Exception ex)\n                {\n                    core.TrySetException(ex);\n                    return false;\n                }\n\n                core.TrySetResult(null);\n                return false;\n            }\n\n            bool TryReturn()\n            {\n                TaskTracker.RemoveTracking(this);\n                core.Reset();\n                predicate = default;\n                cancellationToken = default;\n                return pool.TryPush(this);\n            }\n        }\n\n        sealed class WaitWhilePromise : IGDTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitWhilePromise>\n        {\n            static TaskPool<WaitWhilePromise> pool;\n            WaitWhilePromise nextNode;\n            public ref WaitWhilePromise NextNode => ref nextNode;\n\n            static WaitWhilePromise()\n            {\n                TaskPool.RegisterSizeGetter(typeof(WaitWhilePromise), () => pool.Size);\n            }\n\n            GodotObject target;\n            Func<bool> predicate;\n            CancellationToken cancellationToken;\n\n            GDTaskCompletionSourceCore<object> core;\n\n            WaitWhilePromise()\n            {\n            }\n\n            public static IGDTaskSource Create(GodotObject target, Func<bool> predicate, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    return AutoResetGDTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);\n                }\n\n                if (!pool.TryPop(out var result))\n                {\n                    result = new WaitWhilePromise();\n                }\n\n                result.target = target;\n                result.predicate = predicate;\n                result.cancellationToken = cancellationToken;\n\n                TaskTracker.TrackActiveTask(result, 3);\n\n                GDTaskPlayerLoopAutoload.AddAction(timing, result);\n\n                token = result.core.Version;\n                return result;\n            }\n\n            public void GetResult(short token)\n            {\n                try\n                {\n                    core.GetResult(token);\n                }\n                finally\n                {\n                    TryReturn();\n                }\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public bool MoveNext()\n            {\n                if (cancellationToken.IsCancellationRequested || (target is not null && !GodotObject.IsInstanceValid(target))) // Cancel when destroyed\n                {\n                    core.TrySetCanceled(cancellationToken);\n                    return false;\n                }\n\n                try\n                {\n                    if (predicate())\n                    {\n                        return true;\n                    }\n                }\n                catch (Exception ex)\n                {\n                    core.TrySetException(ex);\n                    return false;\n                }\n\n                core.TrySetResult(null);\n                return false;\n            }\n\n            bool TryReturn()\n            {\n                TaskTracker.RemoveTracking(this);\n                core.Reset();\n                predicate = default;\n                cancellationToken = default;\n                return pool.TryPush(this);\n            }\n        }\n\n        sealed class WaitUntilCanceledPromise : IGDTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitUntilCanceledPromise>\n        {\n            static TaskPool<WaitUntilCanceledPromise> pool;\n            WaitUntilCanceledPromise nextNode;\n            public ref WaitUntilCanceledPromise NextNode => ref nextNode;\n\n            static WaitUntilCanceledPromise()\n            {\n                TaskPool.RegisterSizeGetter(typeof(WaitUntilCanceledPromise), () => pool.Size);\n            }\n\n            GodotObject target;\n            CancellationToken cancellationToken;\n\n            GDTaskCompletionSourceCore<object> core;\n\n            WaitUntilCanceledPromise()\n            {\n            }\n\n            public static IGDTaskSource Create(GodotObject target, CancellationToken cancellationToken, PlayerLoopTiming timing, out short token)\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    return AutoResetGDTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);\n                }\n\n                if (!pool.TryPop(out var result))\n                {\n                    result = new WaitUntilCanceledPromise();\n                }\n\n                result.target = target;\n                result.cancellationToken = cancellationToken;\n\n                TaskTracker.TrackActiveTask(result, 3);\n\n                GDTaskPlayerLoopAutoload.AddAction(timing, result);\n\n                token = result.core.Version;\n                return result;\n            }\n\n            public void GetResult(short token)\n            {\n                try\n                {\n                    core.GetResult(token);\n                }\n                finally\n                {\n                    TryReturn();\n                }\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public bool MoveNext()\n            {\n                if (cancellationToken.IsCancellationRequested || (target is not null && !GodotObject.IsInstanceValid(target))) // Cancel when destroyed\n                {\n                    core.TrySetResult(null);\n                    return false;\n                }\n\n                return true;\n            }\n\n            bool TryReturn()\n            {\n                TaskTracker.RemoveTracking(this);\n                core.Reset();\n                cancellationToken = default;\n                return pool.TryPush(this);\n            }\n        }\n\n        // Cannot add `where T : GodotObject` because `WaitUntilValueChanged` doesn't have the constraint.\n        sealed class WaitUntilValueChangedGodotObjectPromise<T, U> : IGDTaskSource<U>, IPlayerLoopItem, ITaskPoolNode<WaitUntilValueChangedGodotObjectPromise<T, U>>\n        {\n            static TaskPool<WaitUntilValueChangedGodotObjectPromise<T, U>> pool;\n            WaitUntilValueChangedGodotObjectPromise<T, U> nextNode;\n            public ref WaitUntilValueChangedGodotObjectPromise<T, U> NextNode => ref nextNode;\n\n            static WaitUntilValueChangedGodotObjectPromise()\n            {\n                TaskPool.RegisterSizeGetter(typeof(WaitUntilValueChangedGodotObjectPromise<T, U>), () => pool.Size);\n            }\n\n            T target;\n            GodotObject targetGodotObject;\n            U currentValue;\n            Func<T, U> monitorFunction;\n            IEqualityComparer<U> equalityComparer;\n            CancellationToken cancellationToken;\n\n            GDTaskCompletionSourceCore<U> core;\n\n            WaitUntilValueChangedGodotObjectPromise()\n            {\n            }\n\n            public static IGDTaskSource<U> Create(T target, Func<T, U> monitorFunction, IEqualityComparer<U> equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    return AutoResetGDTaskCompletionSource<U>.CreateFromCanceled(cancellationToken, out token);\n                }\n\n                if (!pool.TryPop(out var result))\n                {\n                    result = new WaitUntilValueChangedGodotObjectPromise<T, U>();\n                }\n\n                result.target = target;\n                result.targetGodotObject = target as GodotObject;\n                result.monitorFunction = monitorFunction;\n                result.currentValue = monitorFunction(target);\n                result.equalityComparer = equalityComparer ?? GodotEqualityComparer.GetDefault<U>();\n                result.cancellationToken = cancellationToken;\n\n                TaskTracker.TrackActiveTask(result, 3);\n\n                GDTaskPlayerLoopAutoload.AddAction(timing, result);\n\n                token = result.core.Version;\n                return result;\n            }\n\n            public U GetResult(short token)\n            {\n                try\n                {\n                    return core.GetResult(token);\n                }\n                finally\n                {\n                    TryReturn();\n                }\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public bool MoveNext()\n            {\n                if (cancellationToken.IsCancellationRequested || (target is not null && !GodotObject.IsInstanceValid(targetGodotObject))) // Cancel when destroyed\n                {\n                    core.TrySetCanceled(cancellationToken);\n                    return false;\n                }\n\n                U nextValue = default;\n                try\n                {\n                    nextValue = monitorFunction(target);\n                    if (equalityComparer.Equals(currentValue, nextValue))\n                    {\n                        return true;\n                    }\n                }\n                catch (Exception ex)\n                {\n                    core.TrySetException(ex);\n                    return false;\n                }\n\n                core.TrySetResult(nextValue);\n                return false;\n            }\n\n            bool TryReturn()\n            {\n                TaskTracker.RemoveTracking(this);\n                core.Reset();\n                target = default;\n                currentValue = default;\n                monitorFunction = default;\n                equalityComparer = default;\n                cancellationToken = default;\n                return pool.TryPush(this);\n            }\n        }\n\n        sealed class WaitUntilValueChangedStandardObjectPromise<T, U> : IGDTaskSource<U>, IPlayerLoopItem, ITaskPoolNode<WaitUntilValueChangedStandardObjectPromise<T, U>>\n            where T : class\n        {\n            static TaskPool<WaitUntilValueChangedStandardObjectPromise<T, U>> pool;\n            WaitUntilValueChangedStandardObjectPromise<T, U> nextNode;\n            public ref WaitUntilValueChangedStandardObjectPromise<T, U> NextNode => ref nextNode;\n\n            static WaitUntilValueChangedStandardObjectPromise()\n            {\n                TaskPool.RegisterSizeGetter(typeof(WaitUntilValueChangedStandardObjectPromise<T, U>), () => pool.Size);\n            }\n\n            WeakReference<T> target;\n            U currentValue;\n            Func<T, U> monitorFunction;\n            IEqualityComparer<U> equalityComparer;\n            CancellationToken cancellationToken;\n\n            GDTaskCompletionSourceCore<U> core;\n\n            WaitUntilValueChangedStandardObjectPromise()\n            {\n            }\n\n            public static IGDTaskSource<U> Create(T target, Func<T, U> monitorFunction, IEqualityComparer<U> equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)\n            {\n                if (cancellationToken.IsCancellationRequested)\n                {\n                    return AutoResetGDTaskCompletionSource<U>.CreateFromCanceled(cancellationToken, out token);\n                }\n\n                if (!pool.TryPop(out var result))\n                {\n                    result = new WaitUntilValueChangedStandardObjectPromise<T, U>();\n                }\n\n                result.target = new WeakReference<T>(target, false); // wrap in WeakReference.\n                result.monitorFunction = monitorFunction;\n                result.currentValue = monitorFunction(target);\n                result.equalityComparer = equalityComparer ?? GodotEqualityComparer.GetDefault<U>();\n                result.cancellationToken = cancellationToken;\n\n                TaskTracker.TrackActiveTask(result, 3);\n\n                GDTaskPlayerLoopAutoload.AddAction(timing, result);\n\n                token = result.core.Version;\n                return result;\n            }\n\n            public U GetResult(short token)\n            {\n                try\n                {\n                    return core.GetResult(token);\n                }\n                finally\n                {\n                    TryReturn();\n                }\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public bool MoveNext()\n            {\n                if (cancellationToken.IsCancellationRequested || !target.TryGetTarget(out var t)) // doesn't find = cancel.\n                {\n                    core.TrySetCanceled(cancellationToken);\n                    return false;\n                }\n\n                U nextValue = default;\n                try\n                {\n                    nextValue = monitorFunction(t);\n                    if (equalityComparer.Equals(currentValue, nextValue))\n                    {\n                        return true;\n                    }\n                }\n                catch (Exception ex)\n                {\n                    core.TrySetException(ex);\n                    return false;\n                }\n\n                core.TrySetResult(nextValue);\n                return false;\n            }\n\n            bool TryReturn()\n            {\n                TaskTracker.RemoveTracking(this);\n                core.Reset();\n                target = default;\n                currentValue = default;\n                monitorFunction = default;\n                equalityComparer = default;\n                cancellationToken = default;\n                return pool.TryPush(this);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/GDTask.WaitUntil.cs.uid",
    "content": "uid://cxbbjjhs4etts\n"
  },
  {
    "path": "addons/GDTask/GDTask.WhenAll.Generated.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.ExceptionServices;\nusing System.Threading;\nusing Fractural.Tasks.Internal;\n\nnamespace Fractural.Tasks\n{\n    public partial struct GDTask\n    {\n\n        public static GDTask<(T1, T2)> WhenAll<T1, T2>(GDTask<T1> task1, GDTask<T2> task2)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2)>(new WhenAllPromise<T1, T2>(task1, task2), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2> : IGDTaskSource<(T1, T2)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 2)\n                {\n                    self.core.TrySetResult((self.t1, self.t2));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 2)\n                {\n                    self.core.TrySetResult((self.t1, self.t2));\n                }\n            }\n\n\n            public (T1, T2) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3)> WhenAll<T1, T2, T3>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3)>(new WhenAllPromise<T1, T2, T3>(task1, task2, task3), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3> : IGDTaskSource<(T1, T2, T3)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 3)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 3)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 3)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3));\n                }\n            }\n\n\n            public (T1, T2, T3) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4)> WhenAll<T1, T2, T3, T4>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4)>(new WhenAllPromise<T1, T2, T3, T4>(task1, task2, task3, task4), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4> : IGDTaskSource<(T1, T2, T3, T4)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 4)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 4)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 4)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 4)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4));\n                }\n            }\n\n\n            public (T1, T2, T3, T4) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5)> WhenAll<T1, T2, T3, T4, T5>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5)>(new WhenAllPromise<T1, T2, T3, T4, T5>(task1, task2, task3, task4, task5), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5> : IGDTaskSource<(T1, T2, T3, T4, T5)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 5)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 5)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 5)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 5)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 5)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6)> WhenAll<T1, T2, T3, T4, T5, T6>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5, T6)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5, T6)>(new WhenAllPromise<T1, T2, T3, T4, T5, T6>(task1, task2, task3, task4, task5, task6), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5, T6> : IGDTaskSource<(T1, T2, T3, T4, T5, T6)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            T6 t6 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 6)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 6)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 6)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 6)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 6)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAllPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t6 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 6)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5, T6) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7)> WhenAll<T1, T2, T3, T4, T5, T6, T7>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5, T6, T7)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5, T6, T7)>(new WhenAllPromise<T1, T2, T3, T4, T5, T6, T7>(task1, task2, task3, task4, task5, task6, task7), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5, T6, T7> : IGDTaskSource<(T1, T2, T3, T4, T5, T6, T7)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            T6 t6 = default;\n            T7 t7 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 7)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 7)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 7)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 7)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 7)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t6 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 7)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t7 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 7)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5, T6, T7) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8)>(new WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8>(task1, task2, task3, task4, task5, task6, task7, task8), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8> : IGDTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            T6 t6 = default;\n            T7 t7 = default;\n            T8 t8 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 8)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 8)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 8)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 8)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 8)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t6 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 8)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t7 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 8)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t8 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 8)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5, T6, T7, T8) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9)>(new WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>(task1, task2, task3, task4, task5, task6, task7, task8, task9), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> : IGDTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            T6 t6 = default;\n            T7 t7 = default;\n            T8 t8 = default;\n            T9 t9 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 9)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 9)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 9)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 9)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 9)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t6 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 9)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t7 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 9)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t8 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 9)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t9 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 9)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5, T6, T7, T8, T9) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>(new WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : IGDTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            T6 t6 = default;\n            T7 t7 = default;\n            T8 t8 = default;\n            T9 t9 = default;\n            T10 t10 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 10)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 10)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 10)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 10)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 10)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t6 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 10)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t7 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 10)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t8 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 10)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t9 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 10)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t10 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 10)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully() && task11.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult(), task11.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)>(new WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> : IGDTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            T6 t6 = default;\n            T7 t7 = default;\n            T8 t8 = default;\n            T9 t9 = default;\n            T10 t10 = default;\n            T11 t11 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task11.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT11(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T11>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT11(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t6 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t7 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t8 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t9 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t10 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n            static void TryInvokeContinuationT11(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T11>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t11 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 11)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully() && task11.Status.IsCompletedSuccessfully() && task12.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult(), task11.GetAwaiter().GetResult(), task12.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)>(new WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> : IGDTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            T6 t6 = default;\n            T7 t7 = default;\n            T8 t8 = default;\n            T9 t9 = default;\n            T10 t10 = default;\n            T11 t11 = default;\n            T12 t12 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task11.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT11(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T11>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT11(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task12.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT12(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T12>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT12(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t6 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t7 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t8 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t9 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t10 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT11(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T11>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t11 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n            static void TryInvokeContinuationT12(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T12>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t12 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 12)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully() && task11.Status.IsCompletedSuccessfully() && task12.Status.IsCompletedSuccessfully() && task13.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult(), task11.GetAwaiter().GetResult(), task12.GetAwaiter().GetResult(), task13.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)>(new WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> : IGDTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            T6 t6 = default;\n            T7 t7 = default;\n            T8 t8 = default;\n            T9 t9 = default;\n            T10 t10 = default;\n            T11 t11 = default;\n            T12 t12 = default;\n            T13 t13 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task11.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT11(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T11>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT11(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task12.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT12(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T12>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT12(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task13.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT13(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T13>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT13(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t6 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t7 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t8 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t9 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t10 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT11(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T11>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t11 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT12(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T12>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t12 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n            static void TryInvokeContinuationT13(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T13>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t13 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 13)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13, GDTask<T14> task14)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully() && task11.Status.IsCompletedSuccessfully() && task12.Status.IsCompletedSuccessfully() && task13.Status.IsCompletedSuccessfully() && task14.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult(), task11.GetAwaiter().GetResult(), task12.GetAwaiter().GetResult(), task13.GetAwaiter().GetResult(), task14.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)>(new WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> : IGDTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            T6 t6 = default;\n            T7 t7 = default;\n            T8 t8 = default;\n            T9 t9 = default;\n            T10 t10 = default;\n            T11 t11 = default;\n            T12 t12 = default;\n            T13 t13 = default;\n            T14 t14 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13, GDTask<T14> task14)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task11.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT11(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T11>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT11(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task12.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT12(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T12>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT12(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task13.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT13(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T13>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT13(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task14.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT14(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T14>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT14(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t6 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t7 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t8 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t9 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t10 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT11(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T11>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t11 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT12(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T12>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t12 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT13(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T13>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t13 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n            static void TryInvokeContinuationT14(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T14>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t14 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 14)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13, GDTask<T14> task14, GDTask<T15> task15)\n        {\n            if (task1.Status.IsCompletedSuccessfully() && task2.Status.IsCompletedSuccessfully() && task3.Status.IsCompletedSuccessfully() && task4.Status.IsCompletedSuccessfully() && task5.Status.IsCompletedSuccessfully() && task6.Status.IsCompletedSuccessfully() && task7.Status.IsCompletedSuccessfully() && task8.Status.IsCompletedSuccessfully() && task9.Status.IsCompletedSuccessfully() && task10.Status.IsCompletedSuccessfully() && task11.Status.IsCompletedSuccessfully() && task12.Status.IsCompletedSuccessfully() && task13.Status.IsCompletedSuccessfully() && task14.Status.IsCompletedSuccessfully() && task15.Status.IsCompletedSuccessfully())\n            {\n                return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>((task1.GetAwaiter().GetResult(), task2.GetAwaiter().GetResult(), task3.GetAwaiter().GetResult(), task4.GetAwaiter().GetResult(), task5.GetAwaiter().GetResult(), task6.GetAwaiter().GetResult(), task7.GetAwaiter().GetResult(), task8.GetAwaiter().GetResult(), task9.GetAwaiter().GetResult(), task10.GetAwaiter().GetResult(), task11.GetAwaiter().GetResult(), task12.GetAwaiter().GetResult(), task13.GetAwaiter().GetResult(), task14.GetAwaiter().GetResult(), task15.GetAwaiter().GetResult()));\n            }\n\n            return new GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>(new WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14, task15), 0);\n        }\n\n        sealed class WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> : IGDTaskSource<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>\n        {\n            T1 t1 = default;\n            T2 t2 = default;\n            T3 t3 = default;\n            T4 t4 = default;\n            T5 t5 = default;\n            T6 t6 = default;\n            T7 t7 = default;\n            T8 t8 = default;\n            T9 t9 = default;\n            T10 t10 = default;\n            T11 t11 = default;\n            T12 t12 = default;\n            T13 t13 = default;\n            T14 t14 = default;\n            T15 t15 = default;\n            int completedCount;\n            GDTaskCompletionSourceCore<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)> core;\n\n            public WhenAllPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13, GDTask<T14> task14, GDTask<T15> task15)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task11.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT11(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T11>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT11(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task12.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT12(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T12>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT12(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task13.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT13(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T13>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT13(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task14.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT14(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T14>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT14(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task15.GetAwaiter();\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT15(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T15>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT15(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t1 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t2 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t3 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t4 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t5 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t6 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t7 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t8 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t9 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t10 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT11(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T11>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t11 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT12(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T12>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t12 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT13(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T13>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t13 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT14(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T14>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t14 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n            static void TryInvokeContinuationT15(WhenAllPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T15>.Awaiter awaiter)\n            {\n                try\n                {\n                    self.t15 = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 15)\n                {\n                    self.core.TrySetResult((self.t1, self.t2, self.t3, self.t4, self.t5, self.t6, self.t7, self.t8, self.t9, self.t10, self.t11, self.t12, self.t13, self.t14, self.t15));\n                }\n            }\n\n\n            public (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/GDTask.WhenAll.Generated.cs.uid",
    "content": "uid://dymqkcsrwsqun\n"
  },
  {
    "path": "addons/GDTask/GDTask.WhenAll.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing Fractural.Tasks.Internal;\n\nnamespace Fractural.Tasks\n{\n    public partial struct GDTask\n    {\n        public static GDTask<T[]> WhenAll<T>(params GDTask<T>[] tasks)\n        {\n            if (tasks.Length == 0)\n            {\n                return GDTask.FromResult(Array.Empty<T>());\n            }\n\n            return new GDTask<T[]>(new WhenAllPromise<T>(tasks, tasks.Length), 0);\n        }\n\n        public static GDTask<T[]> WhenAll<T>(IEnumerable<GDTask<T>> tasks)\n        {\n            using (var span = ArrayPoolUtil.Materialize(tasks))\n            {\n                var promise = new WhenAllPromise<T>(span.Array, span.Length); // consumed array in constructor.\n                return new GDTask<T[]>(promise, 0);\n            }\n        }\n\n        public static GDTask WhenAll(params GDTask[] tasks)\n        {\n            if (tasks.Length == 0)\n            {\n                return GDTask.CompletedTask;\n            }\n\n            return new GDTask(new WhenAllPromise(tasks, tasks.Length), 0);\n        }\n\n        public static GDTask WhenAll(IEnumerable<GDTask> tasks)\n        {\n            using (var span = ArrayPoolUtil.Materialize(tasks))\n            {\n                var promise = new WhenAllPromise(span.Array, span.Length); // consumed array in constructor.\n                return new GDTask(promise, 0);\n            }\n        }\n\n        sealed class WhenAllPromise<T> : IGDTaskSource<T[]>\n        {\n            T[] result;\n            int completeCount;\n            GDTaskCompletionSourceCore<T[]> core; // don't reset(called after GetResult, will invoke TrySetException.)\n\n            public WhenAllPromise(GDTask<T>[] tasks, int tasksLength)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completeCount = 0;\n\n                if (tasksLength == 0)\n                {\n                    this.result = Array.Empty<T>();\n                    core.TrySetResult(result);\n                    return;\n                }\n\n                this.result = new T[tasksLength];\n\n                for (int i = 0; i < tasksLength; i++)\n                {\n                    GDTask<T>.Awaiter awaiter;\n                    try\n                    {\n                        awaiter = tasks[i].GetAwaiter();\n                    }\n                    catch (Exception ex)\n                    {\n                        core.TrySetException(ex);\n                        continue;\n                    }\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuation(this, awaiter, i);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise<T>, GDTask<T>.Awaiter, int>)state)\n                            {\n                                TryInvokeContinuation(t.Item1, t.Item2, t.Item3);\n                            }\n                        }, StateTuple.Create(this, awaiter, i));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuation(WhenAllPromise<T> self, in GDTask<T>.Awaiter awaiter, int i)\n            {\n                try\n                {\n                    self.result[i] = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completeCount) == self.result.Length)\n                {\n                    self.core.TrySetResult(self.result);\n                }\n            }\n\n            public T[] GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n\n        sealed class WhenAllPromise : IGDTaskSource\n        {\n            int completeCount;\n            int tasksLength;\n            GDTaskCompletionSourceCore<AsyncUnit> core; // don't reset(called after GetResult, will invoke TrySetException.)\n\n            public WhenAllPromise(GDTask[] tasks, int tasksLength)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.tasksLength = tasksLength;\n                this.completeCount = 0;\n\n                if (tasksLength == 0)\n                {\n                    core.TrySetResult(AsyncUnit.Default);\n                    return;\n                }\n\n                for (int i = 0; i < tasksLength; i++)\n                {\n                    GDTask.Awaiter awaiter;\n                    try\n                    {\n                        awaiter = tasks[i].GetAwaiter();\n                    }\n                    catch (Exception ex)\n                    {\n                        core.TrySetException(ex);\n                        continue;\n                    }\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuation(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAllPromise, GDTask.Awaiter>)state)\n                            {\n                                TryInvokeContinuation(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuation(WhenAllPromise self, in GDTask.Awaiter awaiter)\n            {\n                try\n                {\n                    awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completeCount) == self.tasksLength)\n                {\n                    self.core.TrySetResult(AsyncUnit.Default);\n                }\n            }\n\n            public void GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/GDTask.WhenAll.cs.uid",
    "content": "uid://21c8h3tf3ihy\n"
  },
  {
    "path": "addons/GDTask/GDTask.WhenAny.Generated.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.ExceptionServices;\nusing System.Threading;\nusing Fractural.Tasks.Internal;\n\nnamespace Fractural.Tasks\n{\n    public partial struct GDTask\n    {\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2)> WhenAny<T1, T2>(GDTask<T1> task1, GDTask<T2> task2)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2)>(new WhenAnyPromise<T1, T2>(task1, task2), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2> : IGDTaskSource<(int, T1 result1, T2 result2)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3)> WhenAny<T1, T2, T3>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3)>(new WhenAnyPromise<T1, T2, T3>(task1, task2, task3), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4)> WhenAny<T1, T2, T3, T4>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4)>(new WhenAnyPromise<T1, T2, T3, T4>(task1, task2, task3, task4), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)> WhenAny<T1, T2, T3, T4, T5>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)>(new WhenAnyPromise<T1, T2, T3, T4, T5>(task1, task2, task3, task4, task5), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)> WhenAny<T1, T2, T3, T4, T5, T6>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6>(task1, task2, task3, task4, task5, task6), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                T6 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((5, default, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)> WhenAny<T1, T2, T3, T4, T5, T6, T7>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>(task1, task2, task3, task4, task5, task6, task7), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                T6 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((5, default, default, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                T7 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((6, default, default, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>(task1, task2, task3, task4, task5, task6, task7, task8), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                T6 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((5, default, default, default, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                T7 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((6, default, default, default, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                T8 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((7, default, default, default, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>(task1, task2, task3, task4, task5, task6, task7, task8, task9), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                T6 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                T7 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                T8 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                T9 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                T6 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                T7 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                T8 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                T9 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                T10 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task11.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT11(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, GDTask<T11>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT11(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                T6 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                T7 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                T8 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                T9 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                T10 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT11(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> self, in GDTask<T11>.Awaiter awaiter)\n            {\n                T11 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task11.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT11(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T11>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT11(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task12.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT12(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, GDTask<T12>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT12(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                T6 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                T7 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                T8 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                T9 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                T10 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT11(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T11>.Awaiter awaiter)\n            {\n                T11 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT12(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> self, in GDTask<T12>.Awaiter awaiter)\n            {\n                T12 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task11.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT11(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T11>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT11(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task12.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT12(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T12>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT12(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task13.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT13(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, GDTask<T13>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT13(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                T6 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                T7 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                T8 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                T9 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                T10 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT11(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T11>.Awaiter awaiter)\n            {\n                T11 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT12(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T12>.Awaiter awaiter)\n            {\n                T12 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT13(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> self, in GDTask<T13>.Awaiter awaiter)\n            {\n                T13 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((12, default, default, default, default, default, default, default, default, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13, GDTask<T14> task14)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13, GDTask<T14> task14)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task11.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT11(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T11>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT11(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task12.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT12(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T12>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT12(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task13.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT13(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T13>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT13(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task14.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT14(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, GDTask<T14>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT14(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                T6 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                T7 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                T8 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                T9 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                T10 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT11(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T11>.Awaiter awaiter)\n            {\n                T11 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT12(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T12>.Awaiter awaiter)\n            {\n                T12 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT13(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T13>.Awaiter awaiter)\n            {\n                T13 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((12, default, default, default, default, default, default, default, default, default, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT14(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> self, in GDTask<T14>.Awaiter awaiter)\n            {\n                T14 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((13, default, default, default, default, default, default, default, default, default, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        public static GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13, GDTask<T14> task14, GDTask<T15> task15)\n        {\n            return new GDTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)>(new WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14, task15), 0);\n        }\n\n        sealed class WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> : IGDTaskSource<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)> core;\n\n            public WhenAnyPromise(GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13, GDTask<T14> task14, GDTask<T15> task15)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                this.completedCount = 0;\n                {\n                    var awaiter = task1.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT1(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T1>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT1(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task2.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT2(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T2>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT2(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task3.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT3(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T3>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT3(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task4.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT4(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T4>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT4(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task5.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT5(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T5>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT5(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task6.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT6(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T6>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT6(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task7.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT7(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T7>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT7(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task8.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT8(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T8>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT8(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task9.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT9(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T9>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT9(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task10.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT10(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T10>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT10(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task11.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT11(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T11>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT11(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task12.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT12(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T12>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT12(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task13.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT13(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T13>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT13(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task14.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT14(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T14>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT14(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                {\n                    var awaiter = task15.GetAwaiter();\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuationT15(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, GDTask<T15>.Awaiter>)state)\n                            {\n                                TryInvokeContinuationT15(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuationT1(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T1>.Awaiter awaiter)\n            {\n                T1 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((0, result, default, default, default, default, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT2(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T2>.Awaiter awaiter)\n            {\n                T2 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((1, default, result, default, default, default, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT3(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T3>.Awaiter awaiter)\n            {\n                T3 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((2, default, default, result, default, default, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT4(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T4>.Awaiter awaiter)\n            {\n                T4 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((3, default, default, default, result, default, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT5(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T5>.Awaiter awaiter)\n            {\n                T5 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((4, default, default, default, default, result, default, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT6(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T6>.Awaiter awaiter)\n            {\n                T6 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((5, default, default, default, default, default, result, default, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT7(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T7>.Awaiter awaiter)\n            {\n                T7 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((6, default, default, default, default, default, default, result, default, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT8(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T8>.Awaiter awaiter)\n            {\n                T8 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((7, default, default, default, default, default, default, default, result, default, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT9(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T9>.Awaiter awaiter)\n            {\n                T9 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((8, default, default, default, default, default, default, default, default, result, default, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT10(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T10>.Awaiter awaiter)\n            {\n                T10 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((9, default, default, default, default, default, default, default, default, default, result, default, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT11(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T11>.Awaiter awaiter)\n            {\n                T11 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((10, default, default, default, default, default, default, default, default, default, default, result, default, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT12(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T12>.Awaiter awaiter)\n            {\n                T12 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((11, default, default, default, default, default, default, default, default, default, default, default, result, default, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT13(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T13>.Awaiter awaiter)\n            {\n                T13 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((12, default, default, default, default, default, default, default, default, default, default, default, default, result, default, default));\n                }\n            }\n\n            static void TryInvokeContinuationT14(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T14>.Awaiter awaiter)\n            {\n                T14 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((13, default, default, default, default, default, default, default, default, default, default, default, default, default, result, default));\n                }\n            }\n\n            static void TryInvokeContinuationT15(WhenAnyPromise<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> self, in GDTask<T15>.Awaiter awaiter)\n            {\n                T15 result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((14, default, default, default, default, default, default, default, default, default, default, default, default, default, default, result));\n                }\n            }\n\n\n            public (int, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "addons/GDTask/GDTask.WhenAny.Generated.cs.uid",
    "content": "uid://d4nthwpweeb5l\n"
  },
  {
    "path": "addons/GDTask/GDTask.WhenAny.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing Fractural.Tasks.Internal;\n\nnamespace Fractural.Tasks\n{\n    public partial struct GDTask\n    {\n        public static GDTask<(bool hasResultLeft, T result)> WhenAny<T>(GDTask<T> leftTask, GDTask rightTask)\n        {\n            return new GDTask<(bool, T)>(new WhenAnyLRPromise<T>(leftTask, rightTask), 0);\n        }\n\n        public static GDTask<(int winArgumentIndex, T result)> WhenAny<T>(params GDTask<T>[] tasks)\n        {\n            return new GDTask<(int, T)>(new WhenAnyPromise<T>(tasks, tasks.Length), 0);\n        }\n\n        public static GDTask<(int winArgumentIndex, T result)> WhenAny<T>(IEnumerable<GDTask<T>> tasks)\n        {\n            using (var span = ArrayPoolUtil.Materialize(tasks))\n            {\n                return new GDTask<(int, T)>(new WhenAnyPromise<T>(span.Array, span.Length), 0);\n            }\n        }\n\n        /// <summary>Return value is winArgumentIndex</summary>\n        public static GDTask<int> WhenAny(params GDTask[] tasks)\n        {\n            return new GDTask<int>(new WhenAnyPromise(tasks, tasks.Length), 0);\n        }\n\n        /// <summary>Return value is winArgumentIndex</summary>\n        public static GDTask<int> WhenAny(IEnumerable<GDTask> tasks)\n        {\n            using (var span = ArrayPoolUtil.Materialize(tasks))\n            {\n                return new GDTask<int>(new WhenAnyPromise(span.Array, span.Length), 0);\n            }\n        }\n\n        sealed class WhenAnyLRPromise<T> : IGDTaskSource<(bool, T)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(bool, T)> core;\n\n            public WhenAnyLRPromise(GDTask<T> leftTask, GDTask rightTask)\n            {\n                TaskTracker.TrackActiveTask(this, 3);\n\n                {\n                    GDTask<T>.Awaiter awaiter;\n                    try\n                    {\n                        awaiter = leftTask.GetAwaiter();\n                    }\n                    catch (Exception ex)\n                    {\n                        core.TrySetException(ex);\n                        goto RIGHT;\n                    }\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryLeftInvokeContinuation(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyLRPromise<T>, GDTask<T>.Awaiter>)state)\n                            {\n                                TryLeftInvokeContinuation(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n                RIGHT:\n                {\n                    GDTask.Awaiter awaiter;\n                    try\n                    {\n                        awaiter = rightTask.GetAwaiter();\n                    }\n                    catch (Exception ex)\n                    {\n                        core.TrySetException(ex);\n                        return;\n                    }\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryRightInvokeContinuation(this, awaiter);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyLRPromise<T>, GDTask.Awaiter>)state)\n                            {\n                                TryRightInvokeContinuation(t.Item1, t.Item2);\n                            }\n                        }, StateTuple.Create(this, awaiter));\n                    }\n                }\n            }\n\n            static void TryLeftInvokeContinuation(WhenAnyLRPromise<T> self, in GDTask<T>.Awaiter awaiter)\n            {\n                T result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((true, result));\n                }\n            }\n\n            static void TryRightInvokeContinuation(WhenAnyLRPromise<T> self, in GDTask.Awaiter awaiter)\n            {\n                try\n                {\n                    awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((false, default));\n                }\n            }\n\n            public (bool, T) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n\n        sealed class WhenAnyPromise<T> : IGDTaskSource<(int, T)>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<(int, T)> core;\n\n            public WhenAnyPromise(GDTask<T>[] tasks, int tasksLength)\n            {\n                if (tasksLength == 0)\n                {\n                    throw new ArgumentException(\"The tasks argument contains no tasks.\");\n                }\n\n                TaskTracker.TrackActiveTask(this, 3);\n\n                for (int i = 0; i < tasksLength; i++)\n                {\n                    GDTask<T>.Awaiter awaiter;\n                    try\n                    {\n                        awaiter = tasks[i].GetAwaiter();\n                    }\n                    catch (Exception ex)\n                    {\n                        core.TrySetException(ex);\n                        continue; // consume others.\n                    }\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuation(this, awaiter, i);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise<T>, GDTask<T>.Awaiter, int>)state)\n                            {\n                                TryInvokeContinuation(t.Item1, t.Item2, t.Item3);\n                            }\n                        }, StateTuple.Create(this, awaiter, i));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuation(WhenAnyPromise<T> self, in GDTask<T>.Awaiter awaiter, int i)\n            {\n                T result;\n                try\n                {\n                    result = awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult((i, result));\n                }\n            }\n\n            public (int, T) GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        sealed class WhenAnyPromise : IGDTaskSource<int>\n        {\n            int completedCount;\n            GDTaskCompletionSourceCore<int> core;\n\n            public WhenAnyPromise(GDTask[] tasks, int tasksLength)\n            {\n                if (tasksLength == 0)\n                {\n                    throw new ArgumentException(\"The tasks argument contains no tasks.\");\n                }\n\n                TaskTracker.TrackActiveTask(this, 3);\n\n                for (int i = 0; i < tasksLength; i++)\n                {\n                    GDTask.Awaiter awaiter;\n                    try\n                    {\n                        awaiter = tasks[i].GetAwaiter();\n                    }\n                    catch (Exception ex)\n                    {\n                        core.TrySetException(ex);\n                        continue; // consume others.\n                    }\n\n                    if (awaiter.IsCompleted)\n                    {\n                        TryInvokeContinuation(this, awaiter, i);\n                    }\n                    else\n                    {\n                        awaiter.SourceOnCompleted(state =>\n                        {\n                            using (var t = (StateTuple<WhenAnyPromise, GDTask.Awaiter, int>)state)\n                            {\n                                TryInvokeContinuation(t.Item1, t.Item2, t.Item3);\n                            }\n                        }, StateTuple.Create(this, awaiter, i));\n                    }\n                }\n            }\n\n            static void TryInvokeContinuation(WhenAnyPromise self, in GDTask.Awaiter awaiter, int i)\n            {\n                try\n                {\n                    awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    self.core.TrySetException(ex);\n                    return;\n                }\n\n                if (Interlocked.Increment(ref self.completedCount) == 1)\n                {\n                    self.core.TrySetResult(i);\n                }\n            }\n\n            public int GetResult(short token)\n            {\n                TaskTracker.RemoveTracking(this);\n                GC.SuppressFinalize(this);\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/GDTask.WhenAny.cs.uid",
    "content": "uid://uleke6fyl60\n"
  },
  {
    "path": "addons/GDTask/GDTask.cs",
    "content": "using Fractural.Tasks.CompilerServices;\nusing System;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.ExceptionServices;\nusing System.Runtime.InteropServices;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    internal static class AwaiterActions\n    {\n        internal static readonly Action<object> InvokeContinuationDelegate = Continuation;\n\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        static void Continuation(object state)\n        {\n            ((Action)state).Invoke();\n        }\n    }\n\n    /// <summary>\n    /// Lightweight Godot specific task-like object with a void return value.\n    /// </summary>\n    [AsyncMethodBuilder(typeof(AsyncGDTaskMethodBuilder))]\n    [StructLayout(LayoutKind.Auto)]\n    public readonly partial struct GDTask\n    {\n        readonly IGDTaskSource source;\n        readonly short token;\n\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public GDTask(IGDTaskSource source, short token)\n        {\n            this.source = source;\n            this.token = token;\n        }\n\n        public GDTaskStatus Status\n        {\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            get\n            {\n                if (source == null) return GDTaskStatus.Succeeded;\n                return source.GetStatus(token);\n            }\n        }\n\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public Awaiter GetAwaiter()\n        {\n            return new Awaiter(this);\n        }\n\n        /// <summary>\n        /// returns (bool IsCanceled) instead of throws OperationCanceledException.\n        /// </summary>\n        public GDTask<bool> SuppressCancellationThrow()\n        {\n            var status = Status;\n            if (status == GDTaskStatus.Succeeded) return CompletedTasks.False;\n            if (status == GDTaskStatus.Canceled) return CompletedTasks.True;\n            return new GDTask<bool>(new IsCanceledSource(source), token);\n        }\n        public override string ToString()\n        {\n            if (source == null) return \"()\";\n            return \"(\" + source.UnsafeGetStatus() + \")\";\n        }\n\n        /// <summary>\n        /// Memoizing inner IValueTaskSource. The result GDTask can await multiple.\n        /// </summary>\n        public GDTask Preserve()\n        {\n            if (source == null)\n            {\n                return this;\n            }\n            else\n            {\n                return new GDTask(new MemoizeSource(source), token);\n            }\n        }\n\n        public GDTask<AsyncUnit> AsAsyncUnitGDTask()\n        {\n            if (this.source == null) return CompletedTasks.AsyncUnit;\n\n            var status = this.source.GetStatus(this.token);\n            if (status.IsCompletedSuccessfully())\n            {\n                this.source.GetResult(this.token);\n                return CompletedTasks.AsyncUnit;\n            }\n            else if (this.source is IGDTaskSource<AsyncUnit> asyncUnitSource)\n            {\n                return new GDTask<AsyncUnit>(asyncUnitSource, this.token);\n            }\n\n            return new GDTask<AsyncUnit>(new AsyncUnitSource(this.source), this.token);\n        }\n\n        sealed class AsyncUnitSource : IGDTaskSource<AsyncUnit>\n        {\n            readonly IGDTaskSource source;\n\n            public AsyncUnitSource(IGDTaskSource source)\n            {\n                this.source = source;\n            }\n\n            public AsyncUnit GetResult(short token)\n            {\n                source.GetResult(token);\n                return AsyncUnit.Default;\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return source.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                source.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return source.UnsafeGetStatus();\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n        }\n\n        sealed class IsCanceledSource : IGDTaskSource<bool>\n        {\n            readonly IGDTaskSource source;\n\n            public IsCanceledSource(IGDTaskSource source)\n            {\n                this.source = source;\n            }\n\n            public bool GetResult(short token)\n            {\n                if (source.GetStatus(token) == GDTaskStatus.Canceled)\n                {\n                    return true;\n                }\n\n                source.GetResult(token);\n                return false;\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return source.GetStatus(token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return source.UnsafeGetStatus();\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                source.OnCompleted(continuation, state, token);\n            }\n        }\n\n        sealed class MemoizeSource : IGDTaskSource\n        {\n            IGDTaskSource source;\n            ExceptionDispatchInfo exception;\n            GDTaskStatus status;\n\n            public MemoizeSource(IGDTaskSource source)\n            {\n                this.source = source;\n            }\n\n            public void GetResult(short token)\n            {\n                if (source == null)\n                {\n                    if (exception != null)\n                    {\n                        exception.Throw();\n                    }\n                }\n                else\n                {\n                    try\n                    {\n                        source.GetResult(token);\n                        status = GDTaskStatus.Succeeded;\n                    }\n                    catch (Exception ex)\n                    {\n                        exception = ExceptionDispatchInfo.Capture(ex);\n                        if (ex is OperationCanceledException)\n                        {\n                            status = GDTaskStatus.Canceled;\n                        }\n                        else\n                        {\n                            status = GDTaskStatus.Faulted;\n                        }\n                        throw;\n                    }\n                    finally\n                    {\n                        source = null;\n                    }\n                }\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                if (source == null)\n                {\n                    return status;\n                }\n\n                return source.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                if (source == null)\n                {\n                    continuation(state);\n                }\n                else\n                {\n                    source.OnCompleted(continuation, state, token);\n                }\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                if (source == null)\n                {\n                    return status;\n                }\n\n                return source.UnsafeGetStatus();\n            }\n        }\n\n        public readonly struct Awaiter : ICriticalNotifyCompletion\n        {\n            readonly GDTask task;\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public Awaiter(in GDTask task)\n            {\n                this.task = task;\n            }\n\n            public bool IsCompleted\n            {\n                [DebuggerHidden]\n                [MethodImpl(MethodImplOptions.AggressiveInlining)]\n                get\n                {\n                    return task.Status.IsCompleted();\n                }\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public void GetResult()\n            {\n                if (task.source == null) return;\n                task.source.GetResult(task.token);\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public void OnCompleted(Action continuation)\n            {\n                if (task.source == null)\n                {\n                    continuation();\n                }\n                else\n                {\n                    task.source.OnCompleted(AwaiterActions.InvokeContinuationDelegate, continuation, task.token);\n                }\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public void UnsafeOnCompleted(Action continuation)\n            {\n                if (task.source == null)\n                {\n                    continuation();\n                }\n                else\n                {\n                    task.source.OnCompleted(AwaiterActions.InvokeContinuationDelegate, continuation, task.token);\n                }\n            }\n\n            /// <summary>\n            /// If register manually continuation, you can use it instead of for compiler OnCompleted methods.\n            /// </summary>\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public void SourceOnCompleted(Action<object> continuation, object state)\n            {\n                if (task.source == null)\n                {\n                    continuation(state);\n                }\n                else\n                {\n                    task.source.OnCompleted(continuation, state, task.token);\n                }\n            }\n        }\n    }\n\n    /// <summary>\n    /// Lightweight Godot specified task-like object with a return value.\n    /// </summary>\n    /// <typeparam name=\"T\">Return value of the task</typeparam>\n    [AsyncMethodBuilder(typeof(AsyncGDTaskMethodBuilder<>))]\n    [StructLayout(LayoutKind.Auto)]\n    public readonly struct GDTask<T>\n    {\n        readonly IGDTaskSource<T> source;\n        readonly T result;\n        readonly short token;\n\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public GDTask(T result)\n        {\n            this.source = default;\n            this.token = default;\n            this.result = result;\n        }\n\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public GDTask(IGDTaskSource<T> source, short token)\n        {\n            this.source = source;\n            this.token = token;\n            this.result = default;\n        }\n\n        public GDTaskStatus Status\n        {\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            get\n            {\n                return (source == null) ? GDTaskStatus.Succeeded : source.GetStatus(token);\n            }\n        }\n\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public Awaiter GetAwaiter()\n        {\n            return new Awaiter(this);\n        }\n\n        /// <summary>\n        /// Memoizing inner IValueTaskSource. The result GDTask can await multiple.\n        /// </summary>\n        public GDTask<T> Preserve()\n        {\n            if (source == null)\n            {\n                return this;\n            }\n            else\n            {\n                return new GDTask<T>(new MemoizeSource(source), token);\n            }\n        }\n\n        public GDTask AsGDTask()\n        {\n            if (this.source == null) return GDTask.CompletedTask;\n\n            var status = this.source.GetStatus(this.token);\n            if (status.IsCompletedSuccessfully())\n            {\n                this.source.GetResult(this.token);\n                return GDTask.CompletedTask;\n            }\n\n            // Converting GDTask<T> -> GDTask is zero overhead.\n            return new GDTask(this.source, this.token);\n        }\n\n        public static implicit operator GDTask(GDTask<T> self)\n        {\n            return self.AsGDTask();\n        }\n\n        /// <summary>\n        /// returns (bool IsCanceled, T Result) instead of throws OperationCanceledException.\n        /// </summary>\n        public GDTask<(bool IsCanceled, T Result)> SuppressCancellationThrow()\n        {\n            if (source == null)\n            {\n                return new GDTask<(bool IsCanceled, T Result)>((false, result));\n            }\n\n            return new GDTask<(bool, T)>(new IsCanceledSource(source), token);\n        }\n\n        public override string ToString()\n        {\n            return (this.source == null) ? result?.ToString()\n                 : \"(\" + this.source.UnsafeGetStatus() + \")\";\n        }\n\n        sealed class IsCanceledSource : IGDTaskSource<(bool, T)>\n        {\n            readonly IGDTaskSource<T> source;\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public IsCanceledSource(IGDTaskSource<T> source)\n            {\n                this.source = source;\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public (bool, T) GetResult(short token)\n            {\n                if (source.GetStatus(token) == GDTaskStatus.Canceled)\n                {\n                    return (true, default);\n                }\n\n                var result = source.GetResult(token);\n                return (false, result);\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public GDTaskStatus GetStatus(short token)\n            {\n                return source.GetStatus(token);\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return source.UnsafeGetStatus();\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                source.OnCompleted(continuation, state, token);\n            }\n        }\n\n        sealed class MemoizeSource : IGDTaskSource<T>\n        {\n            IGDTaskSource<T> source;\n            T result;\n            ExceptionDispatchInfo exception;\n            GDTaskStatus status;\n\n            public MemoizeSource(IGDTaskSource<T> source)\n            {\n                this.source = source;\n            }\n\n            public T GetResult(short token)\n            {\n                if (source == null)\n                {\n                    if (exception != null)\n                    {\n                        exception.Throw();\n                    }\n                    return result;\n                }\n                else\n                {\n                    try\n                    {\n                        result = source.GetResult(token);\n                        status = GDTaskStatus.Succeeded;\n                        return result;\n                    }\n                    catch (Exception ex)\n                    {\n                        exception = ExceptionDispatchInfo.Capture(ex);\n                        if (ex is OperationCanceledException)\n                        {\n                            status = GDTaskStatus.Canceled;\n                        }\n                        else\n                        {\n                            status = GDTaskStatus.Faulted;\n                        }\n                        throw;\n                    }\n                    finally\n                    {\n                        source = null;\n                    }\n                }\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                if (source == null)\n                {\n                    return status;\n                }\n\n                return source.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                if (source == null)\n                {\n                    continuation(state);\n                }\n                else\n                {\n                    source.OnCompleted(continuation, state, token);\n                }\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                if (source == null)\n                {\n                    return status;\n                }\n\n                return source.UnsafeGetStatus();\n            }\n        }\n\n        public readonly struct Awaiter : ICriticalNotifyCompletion\n        {\n            readonly GDTask<T> task;\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public Awaiter(in GDTask<T> task)\n            {\n                this.task = task;\n            }\n\n            public bool IsCompleted\n            {\n                [DebuggerHidden]\n                [MethodImpl(MethodImplOptions.AggressiveInlining)]\n                get\n                {\n                    return task.Status.IsCompleted();\n                }\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public T GetResult()\n            {\n                var s = task.source;\n                if (s == null)\n                {\n                    return task.result;\n                }\n                else\n                {\n                    return s.GetResult(task.token);\n                }\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public void OnCompleted(Action continuation)\n            {\n                var s = task.source;\n                if (s == null)\n                {\n                    continuation();\n                }\n                else\n                {\n                    s.OnCompleted(AwaiterActions.InvokeContinuationDelegate, continuation, task.token);\n                }\n            }\n\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public void UnsafeOnCompleted(Action continuation)\n            {\n                var s = task.source;\n                if (s == null)\n                {\n                    continuation();\n                }\n                else\n                {\n                    s.OnCompleted(AwaiterActions.InvokeContinuationDelegate, continuation, task.token);\n                }\n            }\n\n            /// <summary>\n            /// If register manually continuation, you can use it instead of for compiler OnCompleted methods.\n            /// </summary>\n            [DebuggerHidden]\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public void SourceOnCompleted(Action<object> continuation, object state)\n            {\n                var s = task.source;\n                if (s == null)\n                {\n                    continuation(state);\n                }\n                else\n                {\n                    s.OnCompleted(continuation, state, task.token);\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/GDTask.cs.uid",
    "content": "uid://c8flrnm5gs57i\n"
  },
  {
    "path": "addons/GDTask/GDTaskCompletionSource.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.ExceptionServices;\nusing System.Runtime.InteropServices;\nusing System.Threading;\nusing Fractural.Tasks.Internal;\n\nnamespace Fractural.Tasks\n{\n    public interface IResolvePromise\n    {\n        bool TrySetResult();\n    }\n\n    public interface IResolvePromise<T>\n    {\n        bool TrySetResult(T value);\n    }\n\n    public interface IRejectPromise\n    {\n        bool TrySetException(Exception exception);\n    }\n\n    public interface ICancelPromise\n    {\n        bool TrySetCanceled(CancellationToken cancellationToken = default);\n    }\n\n    public interface IPromise<T> : IResolvePromise<T>, IRejectPromise, ICancelPromise\n    {\n    }\n\n    public interface IPromise : IResolvePromise, IRejectPromise, ICancelPromise\n    {\n    }\n\n    internal class ExceptionHolder\n    {\n        ExceptionDispatchInfo exception;\n        bool calledGet = false;\n\n        public ExceptionHolder(ExceptionDispatchInfo exception)\n        {\n            this.exception = exception;\n        }\n\n        public ExceptionDispatchInfo GetException()\n        {\n            if (!calledGet)\n            {\n                calledGet = true;\n                GC.SuppressFinalize(this);\n            }\n            return exception;\n        }\n\n        ~ExceptionHolder()\n        {\n            if (!calledGet)\n            {\n                GDTaskScheduler.PublishUnobservedTaskException(exception.SourceException);\n            }\n        }\n    }\n\n    [StructLayout(LayoutKind.Auto)]\n    public struct GDTaskCompletionSourceCore<TResult>\n    {\n        // Struct Size: TResult + (8 + 2 + 1 + 1 + 8 + 8)\n\n        TResult result;\n        object error; // ExceptionHolder or OperationCanceledException\n        short version;\n        bool hasUnhandledError;\n        int completedCount; // 0: completed == false\n        Action<object> continuation;\n        object continuationState;\n\n        [DebuggerHidden]\n        public void Reset()\n        {\n            ReportUnhandledError();\n\n            unchecked\n            {\n                version += 1; // incr version.\n            }\n            completedCount = 0;\n            result = default;\n            error = null;\n            hasUnhandledError = false;\n            continuation = null;\n            continuationState = null;\n        }\n\n        void ReportUnhandledError()\n        {\n            if (hasUnhandledError)\n            {\n                try\n                {\n                    if (error is OperationCanceledException oc)\n                    {\n                        GDTaskScheduler.PublishUnobservedTaskException(oc);\n                    }\n                    else if (error is ExceptionHolder e)\n                    {\n                        GDTaskScheduler.PublishUnobservedTaskException(e.GetException().SourceException);\n                    }\n                }\n                catch\n                {\n                }\n            }\n        }\n\n        internal void MarkHandled()\n        {\n            hasUnhandledError = false;\n        }\n\n        /// <summary>Completes with a successful result.</summary>\n        /// <param name=\"result\">The result.</param>\n        [DebuggerHidden]\n        public bool TrySetResult(TResult result)\n        {\n            if (Interlocked.Increment(ref completedCount) == 1)\n            {\n                // setup result\n                this.result = result;\n\n                if (continuation != null || Interlocked.CompareExchange(ref this.continuation, GDTaskCompletionSourceCoreShared.s_sentinel, null) != null)\n                {\n                    continuation(continuationState);\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        /// <summary>Completes with an error.</summary>\n        /// <param name=\"error\">The exception.</param>\n        [DebuggerHidden]\n        public bool TrySetException(Exception error)\n        {\n            if (Interlocked.Increment(ref completedCount) == 1)\n            {\n                // setup result\n                this.hasUnhandledError = true;\n                if (error is OperationCanceledException)\n                {\n                    this.error = error;\n                }\n                else\n                {\n                    this.error = new ExceptionHolder(ExceptionDispatchInfo.Capture(error));\n                }\n\n                if (continuation != null || Interlocked.CompareExchange(ref this.continuation, GDTaskCompletionSourceCoreShared.s_sentinel, null) != null)\n                {\n                    continuation(continuationState);\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        [DebuggerHidden]\n        public bool TrySetCanceled(CancellationToken cancellationToken = default)\n        {\n            if (Interlocked.Increment(ref completedCount) == 1)\n            {\n                // setup result\n                this.hasUnhandledError = true;\n                this.error = new OperationCanceledException(cancellationToken);\n\n                if (continuation != null || Interlocked.CompareExchange(ref this.continuation, GDTaskCompletionSourceCoreShared.s_sentinel, null) != null)\n                {\n                    continuation(continuationState);\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        /// <summary>Gets the operation version.</summary>\n        [DebuggerHidden]\n        public short Version => version;\n\n        /// <summary>Gets the status of the operation.</summary>\n        /// <param name=\"token\">Opaque value that was provided to the <see cref=\"GDTask\"/>'s constructor.</param>\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public GDTaskStatus GetStatus(short token)\n        {\n            ValidateToken(token);\n            return (continuation == null || (completedCount == 0)) ? GDTaskStatus.Pending\n                 : (error == null) ? GDTaskStatus.Succeeded\n                 : (error is OperationCanceledException) ? GDTaskStatus.Canceled\n                 : GDTaskStatus.Faulted;\n        }\n\n        /// <summary>Gets the status of the operation without token validation.</summary>\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public GDTaskStatus UnsafeGetStatus()\n        {\n            return (continuation == null || (completedCount == 0)) ? GDTaskStatus.Pending\n                 : (error == null) ? GDTaskStatus.Succeeded\n                 : (error is OperationCanceledException) ? GDTaskStatus.Canceled\n                 : GDTaskStatus.Faulted;\n        }\n\n        /// <summary>Gets the result of the operation.</summary>\n        /// <param name=\"token\">Opaque value that was provided to the <see cref=\"GDTask\"/>'s constructor.</param>\n        // [StackTraceHidden]\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public TResult GetResult(short token)\n        {\n            ValidateToken(token);\n            if (completedCount == 0)\n            {\n                throw new InvalidOperationException(\"Not yet completed, GDTask only allow to use await.\");\n            }\n\n            if (error != null)\n            {\n                hasUnhandledError = false;\n                if (error is OperationCanceledException oce)\n                {\n                    throw oce;\n                }\n                else if (error is ExceptionHolder eh)\n                {\n                    eh.GetException().Throw();\n                }\n\n                throw new InvalidOperationException(\"Critical: invalid exception type was held.\");\n            }\n\n            return result;\n        }\n\n        /// <summary>Schedules the continuation action for this operation.</summary>\n        /// <param name=\"continuation\">The continuation to invoke when the operation has completed.</param>\n        /// <param name=\"state\">The state object to pass to <paramref name=\"continuation\"/> when it's invoked.</param>\n        /// <param name=\"token\">Opaque value that was provided to the <see cref=\"GDTask\"/>'s constructor.</param>\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void OnCompleted(Action<object> continuation, object state, short token /*, ValueTaskSourceOnCompletedFlags flags */)\n        {\n            if (continuation == null)\n            {\n                throw new ArgumentNullException(nameof(continuation));\n            }\n            ValidateToken(token);\n\n            /* no use ValueTaskSourceOnCOmpletedFlags, always no capture ExecutionContext and SynchronizationContext. */\n\n            /*\n                PatternA: GetStatus=Pending => OnCompleted => TrySet*** => GetResult\n                PatternB: TrySet*** => GetStatus=!Pending => GetResult\n                PatternC: GetStatus=Pending => TrySet/OnCompleted(race condition) => GetResult\n                C.1: win OnCompleted -> TrySet invoke saved continuation\n                C.2: win TrySet -> should invoke continuation here.\n            */\n\n            // not set continuation yet.\n            object oldContinuation = this.continuation;\n            if (oldContinuation == null)\n            {\n                continuationState = state;\n                oldContinuation = Interlocked.CompareExchange(ref this.continuation, continuation, null);\n            }\n\n            if (oldContinuation != null)\n            {\n                // already running continuation in TrySet.\n                // It will cause call OnCompleted multiple time, invalid.\n                if (!ReferenceEquals(oldContinuation, GDTaskCompletionSourceCoreShared.s_sentinel))\n                {\n                    throw new InvalidOperationException(\"Already continuation registered, can not await twice or get Status after await.\");\n                }\n\n                continuation(state);\n            }\n        }\n\n        [DebuggerHidden]\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        private void ValidateToken(short token)\n        {\n            if (token != version)\n            {\n                throw new InvalidOperationException(\"Token version is not matched, can not await twice or get Status after await.\");\n            }\n        }\n    }\n\n    internal static class GDTaskCompletionSourceCoreShared // separated out of generic to avoid unnecessary duplication\n    {\n        internal static readonly Action<object> s_sentinel = CompletionSentinel;\n\n        private static void CompletionSentinel(object _) // named method to aid debugging\n        {\n            throw new InvalidOperationException(\"The sentinel delegate should never be invoked.\");\n        }\n    }\n\n    public partial class AutoResetGDTaskCompletionSource : IGDTaskSource, ITaskPoolNode<AutoResetGDTaskCompletionSource>, IPromise\n    {\n        static TaskPool<AutoResetGDTaskCompletionSource> pool;\n        AutoResetGDTaskCompletionSource nextNode;\n        public ref AutoResetGDTaskCompletionSource NextNode => ref nextNode;\n\n        static AutoResetGDTaskCompletionSource()\n        {\n            TaskPool.RegisterSizeGetter(typeof(AutoResetGDTaskCompletionSource), () => pool.Size);\n        }\n\n        GDTaskCompletionSourceCore<AsyncUnit> core;\n\n        AutoResetGDTaskCompletionSource()\n        {\n        }\n\n        [DebuggerHidden]\n        public static AutoResetGDTaskCompletionSource Create()\n        {\n            if (!pool.TryPop(out var result))\n            {\n                result = new AutoResetGDTaskCompletionSource();\n            }\n            TaskTracker.TrackActiveTask(result, 2);\n            return result;\n        }\n\n        [DebuggerHidden]\n        public static AutoResetGDTaskCompletionSource CreateFromCanceled(CancellationToken cancellationToken, out short token)\n        {\n            var source = Create();\n            source.TrySetCanceled(cancellationToken);\n            token = source.core.Version;\n            return source;\n        }\n\n        [DebuggerHidden]\n        public static AutoResetGDTaskCompletionSource CreateFromException(Exception exception, out short token)\n        {\n            var source = Create();\n            source.TrySetException(exception);\n            token = source.core.Version;\n            return source;\n        }\n\n        [DebuggerHidden]\n        public static AutoResetGDTaskCompletionSource CreateCompleted(out short token)\n        {\n            var source = Create();\n            source.TrySetResult();\n            token = source.core.Version;\n            return source;\n        }\n\n        public GDTask Task\n        {\n            [DebuggerHidden]\n            get\n            {\n                return new GDTask(this, core.Version);\n            }\n        }\n\n        [DebuggerHidden]\n        public bool TrySetResult()\n        {\n            return core.TrySetResult(AsyncUnit.Default);\n        }\n\n        [DebuggerHidden]\n        public bool TrySetCanceled(CancellationToken cancellationToken = default)\n        {\n            return core.TrySetCanceled(cancellationToken);\n        }\n\n        [DebuggerHidden]\n        public bool TrySetException(Exception exception)\n        {\n            return core.TrySetException(exception);\n        }\n\n        [DebuggerHidden]\n        public void GetResult(short token)\n        {\n            try\n            {\n                core.GetResult(token);\n            }\n            finally\n            {\n                TryReturn();\n            }\n\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus GetStatus(short token)\n        {\n            return core.GetStatus(token);\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus UnsafeGetStatus()\n        {\n            return core.UnsafeGetStatus();\n        }\n\n        [DebuggerHidden]\n        public void OnCompleted(Action<object> continuation, object state, short token)\n        {\n            core.OnCompleted(continuation, state, token);\n        }\n\n        [DebuggerHidden]\n        bool TryReturn()\n        {\n            TaskTracker.RemoveTracking(this);\n            core.Reset();\n            return pool.TryPush(this);\n        }\n    }\n\n    public partial class AutoResetGDTaskCompletionSource<T> : IGDTaskSource<T>, ITaskPoolNode<AutoResetGDTaskCompletionSource<T>>, IPromise<T>\n    {\n        static TaskPool<AutoResetGDTaskCompletionSource<T>> pool;\n        AutoResetGDTaskCompletionSource<T> nextNode;\n        public ref AutoResetGDTaskCompletionSource<T> NextNode => ref nextNode;\n\n        static AutoResetGDTaskCompletionSource()\n        {\n            TaskPool.RegisterSizeGetter(typeof(AutoResetGDTaskCompletionSource<T>), () => pool.Size);\n        }\n\n        GDTaskCompletionSourceCore<T> core;\n\n        AutoResetGDTaskCompletionSource()\n        {\n        }\n\n        [DebuggerHidden]\n        public static AutoResetGDTaskCompletionSource<T> Create()\n        {\n            if (!pool.TryPop(out var result))\n            {\n                result = new AutoResetGDTaskCompletionSource<T>();\n            }\n            TaskTracker.TrackActiveTask(result, 2);\n            return result;\n        }\n\n        [DebuggerHidden]\n        public static AutoResetGDTaskCompletionSource<T> CreateFromCanceled(CancellationToken cancellationToken, out short token)\n        {\n            var source = Create();\n            source.TrySetCanceled(cancellationToken);\n            token = source.core.Version;\n            return source;\n        }\n\n        [DebuggerHidden]\n        public static AutoResetGDTaskCompletionSource<T> CreateFromException(Exception exception, out short token)\n        {\n            var source = Create();\n            source.TrySetException(exception);\n            token = source.core.Version;\n            return source;\n        }\n\n        [DebuggerHidden]\n        public static AutoResetGDTaskCompletionSource<T> CreateFromResult(T result, out short token)\n        {\n            var source = Create();\n            source.TrySetResult(result);\n            token = source.core.Version;\n            return source;\n        }\n\n        public GDTask<T> Task\n        {\n            [DebuggerHidden]\n            get\n            {\n                return new GDTask<T>(this, core.Version);\n            }\n        }\n\n        [DebuggerHidden]\n        public bool TrySetResult(T result)\n        {\n            return core.TrySetResult(result);\n        }\n\n        [DebuggerHidden]\n        public bool TrySetCanceled(CancellationToken cancellationToken = default)\n        {\n            return core.TrySetCanceled(cancellationToken);\n        }\n\n        [DebuggerHidden]\n        public bool TrySetException(Exception exception)\n        {\n            return core.TrySetException(exception);\n        }\n\n        [DebuggerHidden]\n        public T GetResult(short token)\n        {\n            try\n            {\n                return core.GetResult(token);\n            }\n            finally\n            {\n                TryReturn();\n            }\n        }\n\n        [DebuggerHidden]\n        void IGDTaskSource.GetResult(short token)\n        {\n            GetResult(token);\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus GetStatus(short token)\n        {\n            return core.GetStatus(token);\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus UnsafeGetStatus()\n        {\n            return core.UnsafeGetStatus();\n        }\n\n        [DebuggerHidden]\n        public void OnCompleted(Action<object> continuation, object state, short token)\n        {\n            core.OnCompleted(continuation, state, token);\n        }\n\n        [DebuggerHidden]\n        bool TryReturn()\n        {\n            TaskTracker.RemoveTracking(this);\n            core.Reset();\n            return pool.TryPush(this);\n        }\n    }\n\n    public partial class GDTaskCompletionSource : IGDTaskSource, IPromise\n    {\n        CancellationToken cancellationToken;\n        ExceptionHolder exception;\n        object gate;\n        Action<object> singleContinuation;\n        object singleState;\n        List<(Action<object>, object)> secondaryContinuationList;\n\n        int intStatus; // GDTaskStatus\n        bool handled = false;\n\n        public GDTaskCompletionSource()\n        {\n            TaskTracker.TrackActiveTask(this, 2);\n        }\n\n        [DebuggerHidden]\n        internal void MarkHandled()\n        {\n            if (!handled)\n            {\n                handled = true;\n                TaskTracker.RemoveTracking(this);\n            }\n        }\n\n        public GDTask Task\n        {\n            [DebuggerHidden]\n            get\n            {\n                return new GDTask(this, 0);\n            }\n        }\n\n        [DebuggerHidden]\n        public bool TrySetResult()\n        {\n            return TrySignalCompletion(GDTaskStatus.Succeeded);\n        }\n\n        [DebuggerHidden]\n        public bool TrySetCanceled(CancellationToken cancellationToken = default)\n        {\n            if (UnsafeGetStatus() != GDTaskStatus.Pending) return false;\n\n            this.cancellationToken = cancellationToken;\n            return TrySignalCompletion(GDTaskStatus.Canceled);\n        }\n\n        [DebuggerHidden]\n        public bool TrySetException(Exception exception)\n        {\n            if (exception is OperationCanceledException oce)\n            {\n                return TrySetCanceled(oce.CancellationToken);\n            }\n\n            if (UnsafeGetStatus() != GDTaskStatus.Pending) return false;\n\n            this.exception = new ExceptionHolder(ExceptionDispatchInfo.Capture(exception));\n            return TrySignalCompletion(GDTaskStatus.Faulted);\n        }\n\n        [DebuggerHidden]\n        public void GetResult(short token)\n        {\n            MarkHandled();\n\n            var status = (GDTaskStatus)intStatus;\n            switch (status)\n            {\n                case GDTaskStatus.Succeeded:\n                    return;\n                case GDTaskStatus.Faulted:\n                    exception.GetException().Throw();\n                    return;\n                case GDTaskStatus.Canceled:\n                    throw new OperationCanceledException(cancellationToken);\n                default:\n                case GDTaskStatus.Pending:\n                    throw new InvalidOperationException(\"not yet completed.\");\n            }\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus GetStatus(short token)\n        {\n            return (GDTaskStatus)intStatus;\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus UnsafeGetStatus()\n        {\n            return (GDTaskStatus)intStatus;\n        }\n\n        [DebuggerHidden]\n        public void OnCompleted(Action<object> continuation, object state, short token)\n        {\n            if (gate == null)\n            {\n                Interlocked.CompareExchange(ref gate, new object(), null);\n            }\n\n            var lockGate = Thread.VolatileRead(ref gate);\n            lock (lockGate) // wait TrySignalCompletion, after status is not pending.\n            {\n                if ((GDTaskStatus)intStatus != GDTaskStatus.Pending)\n                {\n                    continuation(state);\n                    return;\n                }\n\n                if (singleContinuation == null)\n                {\n                    singleContinuation = continuation;\n                    singleState = state;\n                }\n                else\n                {\n                    if (secondaryContinuationList == null)\n                    {\n                        secondaryContinuationList = new List<(Action<object>, object)>();\n                    }\n                    secondaryContinuationList.Add((continuation, state));\n                }\n            }\n        }\n\n        [DebuggerHidden]\n        bool TrySignalCompletion(GDTaskStatus status)\n        {\n            if (Interlocked.CompareExchange(ref intStatus, (int)status, (int)GDTaskStatus.Pending) == (int)GDTaskStatus.Pending)\n            {\n                if (gate == null)\n                {\n                    Interlocked.CompareExchange(ref gate, new object(), null);\n                }\n\n                var lockGate = Thread.VolatileRead(ref gate);\n                lock (lockGate) // wait OnCompleted.\n                {\n                    if (singleContinuation != null)\n                    {\n                        try\n                        {\n                            singleContinuation(singleState);\n                        }\n                        catch (Exception ex)\n                        {\n                            GDTaskScheduler.PublishUnobservedTaskException(ex);\n                        }\n                    }\n\n                    if (secondaryContinuationList != null)\n                    {\n                        foreach (var (c, state) in secondaryContinuationList)\n                        {\n                            try\n                            {\n                                c(state);\n                            }\n                            catch (Exception ex)\n                            {\n                                GDTaskScheduler.PublishUnobservedTaskException(ex);\n                            }\n                        }\n                    }\n\n                    singleContinuation = null;\n                    singleState = null;\n                    secondaryContinuationList = null;\n                }\n                return true;\n            }\n            return false;\n        }\n    }\n\n    public partial class GDTaskCompletionSource<T> : IGDTaskSource<T>, IPromise<T>\n    {\n        CancellationToken cancellationToken;\n        T result;\n        ExceptionHolder exception;\n        object gate;\n        Action<object> singleContinuation;\n        object singleState;\n        List<(Action<object>, object)> secondaryContinuationList;\n\n        int intStatus; // GDTaskStatus\n        bool handled = false;\n\n        public GDTaskCompletionSource()\n        {\n            TaskTracker.TrackActiveTask(this, 2);\n        }\n\n        [DebuggerHidden]\n        internal void MarkHandled()\n        {\n            if (!handled)\n            {\n                handled = true;\n                TaskTracker.RemoveTracking(this);\n            }\n        }\n\n        public GDTask<T> Task\n        {\n            [DebuggerHidden]\n            get\n            {\n                return new GDTask<T>(this, 0);\n            }\n        }\n\n        [DebuggerHidden]\n        public bool TrySetResult(T result)\n        {\n            if (UnsafeGetStatus() != GDTaskStatus.Pending) return false;\n\n            this.result = result;\n            return TrySignalCompletion(GDTaskStatus.Succeeded);\n        }\n\n        [DebuggerHidden]\n        public bool TrySetCanceled(CancellationToken cancellationToken = default)\n        {\n            if (UnsafeGetStatus() != GDTaskStatus.Pending) return false;\n\n            this.cancellationToken = cancellationToken;\n            return TrySignalCompletion(GDTaskStatus.Canceled);\n        }\n\n        [DebuggerHidden]\n        public bool TrySetException(Exception exception)\n        {\n            if (exception is OperationCanceledException oce)\n            {\n                return TrySetCanceled(oce.CancellationToken);\n            }\n\n            if (UnsafeGetStatus() != GDTaskStatus.Pending) return false;\n\n            this.exception = new ExceptionHolder(ExceptionDispatchInfo.Capture(exception));\n            return TrySignalCompletion(GDTaskStatus.Faulted);\n        }\n\n        [DebuggerHidden]\n        public T GetResult(short token)\n        {\n            MarkHandled();\n\n            var status = (GDTaskStatus)intStatus;\n            switch (status)\n            {\n                case GDTaskStatus.Succeeded:\n                    return result;\n                case GDTaskStatus.Faulted:\n                    exception.GetException().Throw();\n                    return default;\n                case GDTaskStatus.Canceled:\n                    throw new OperationCanceledException(cancellationToken);\n                default:\n                case GDTaskStatus.Pending:\n                    throw new InvalidOperationException(\"not yet completed.\");\n            }\n        }\n\n        [DebuggerHidden]\n        void IGDTaskSource.GetResult(short token)\n        {\n            GetResult(token);\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus GetStatus(short token)\n        {\n            return (GDTaskStatus)intStatus;\n        }\n\n        [DebuggerHidden]\n        public GDTaskStatus UnsafeGetStatus()\n        {\n            return (GDTaskStatus)intStatus;\n        }\n\n        [DebuggerHidden]\n        public void OnCompleted(Action<object> continuation, object state, short token)\n        {\n            if (gate == null)\n            {\n                Interlocked.CompareExchange(ref gate, new object(), null);\n            }\n\n            var lockGate = Thread.VolatileRead(ref gate);\n            lock (lockGate) // wait TrySignalCompletion, after status is not pending.\n            {\n                if ((GDTaskStatus)intStatus != GDTaskStatus.Pending)\n                {\n                    continuation(state);\n                    return;\n                }\n\n                if (singleContinuation == null)\n                {\n                    singleContinuation = continuation;\n                    singleState = state;\n                }\n                else\n                {\n                    if (secondaryContinuationList == null)\n                    {\n                        secondaryContinuationList = new List<(Action<object>, object)>();\n                    }\n                    secondaryContinuationList.Add((continuation, state));\n                }\n            }\n        }\n\n        [DebuggerHidden]\n        bool TrySignalCompletion(GDTaskStatus status)\n        {\n            if (Interlocked.CompareExchange(ref intStatus, (int)status, (int)GDTaskStatus.Pending) == (int)GDTaskStatus.Pending)\n            {\n                if (gate == null)\n                {\n                    Interlocked.CompareExchange(ref gate, new object(), null);\n                }\n\n                var lockGate = Thread.VolatileRead(ref gate);\n                lock (lockGate) // wait OnCompleted.\n                {\n                    if (singleContinuation != null)\n                    {\n                        try\n                        {\n                            singleContinuation(singleState);\n                        }\n                        catch (Exception ex)\n                        {\n                            GDTaskScheduler.PublishUnobservedTaskException(ex);\n                        }\n                    }\n\n                    if (secondaryContinuationList != null)\n                    {\n                        foreach (var (c, state) in secondaryContinuationList)\n                        {\n                            try\n                            {\n                                c(state);\n                            }\n                            catch (Exception ex)\n                            {\n                                GDTaskScheduler.PublishUnobservedTaskException(ex);\n                            }\n                        }\n                    }\n\n                    singleContinuation = null;\n                    singleState = null;\n                    secondaryContinuationList = null;\n                }\n                return true;\n            }\n            return false;\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/GDTaskCompletionSource.cs.uid",
    "content": "uid://lh2yoqrvk0fp\n"
  },
  {
    "path": "addons/GDTask/GDTaskExtensions.Shorthand.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Fractural.Tasks\n{\n    public static partial class GDTaskExtensions\n    {\n        // shorthand of WhenAll\n\n        public static GDTask.Awaiter GetAwaiter(this GDTask[] tasks)\n        {\n            return GDTask.WhenAll(tasks).GetAwaiter();\n        }\n\n        public static GDTask.Awaiter GetAwaiter(this IEnumerable<GDTask> tasks)\n        {\n            return GDTask.WhenAll(tasks).GetAwaiter();\n        }\n\n        public static GDTask<T[]>.Awaiter GetAwaiter<T>(this GDTask<T>[] tasks)\n        {\n            return GDTask.WhenAll(tasks).GetAwaiter();\n        }\n\n        public static GDTask<T[]>.Awaiter GetAwaiter<T>(this IEnumerable<GDTask<T>> tasks)\n        {\n            return GDTask.WhenAll(tasks).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2)>.Awaiter GetAwaiter<T1, T2>(this (GDTask<T1> task1, GDTask<T2> task2) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3)>.Awaiter GetAwaiter<T1, T2, T3>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4)>.Awaiter GetAwaiter<T1, T2, T3, T4>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5, T6>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5, T6, T7>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5, T6, T7, T8>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5, T6, T7, T8, T9>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13, GDTask<T14> task14) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13, tasks.Item14).GetAwaiter();\n        }\n\n        public static GDTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>.Awaiter GetAwaiter<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(this (GDTask<T1> task1, GDTask<T2> task2, GDTask<T3> task3, GDTask<T4> task4, GDTask<T5> task5, GDTask<T6> task6, GDTask<T7> task7, GDTask<T8> task8, GDTask<T9> task9, GDTask<T10> task10, GDTask<T11> task11, GDTask<T12> task12, GDTask<T13> task13, GDTask<T14> task14, GDTask<T15> task15) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13, tasks.Item14, tasks.Item15).GetAwaiter();\n        }\n\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5, GDTask task6) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5, GDTask task6, GDTask task7) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5, GDTask task6, GDTask task7, GDTask task8) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5, GDTask task6, GDTask task7, GDTask task8, GDTask task9) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5, GDTask task6, GDTask task7, GDTask task8, GDTask task9, GDTask task10) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5, GDTask task6, GDTask task7, GDTask task8, GDTask task9, GDTask task10, GDTask task11) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5, GDTask task6, GDTask task7, GDTask task8, GDTask task9, GDTask task10, GDTask task11, GDTask task12) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5, GDTask task6, GDTask task7, GDTask task8, GDTask task9, GDTask task10, GDTask task11, GDTask task12, GDTask task13) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5, GDTask task6, GDTask task7, GDTask task8, GDTask task9, GDTask task10, GDTask task11, GDTask task12, GDTask task13, GDTask task14) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13, tasks.Item14).GetAwaiter();\n        }\n\n\n        public static GDTask.Awaiter GetAwaiter(this (GDTask task1, GDTask task2, GDTask task3, GDTask task4, GDTask task5, GDTask task6, GDTask task7, GDTask task8, GDTask task9, GDTask task10, GDTask task11, GDTask task12, GDTask task13, GDTask task14, GDTask task15) tasks)\n        {\n            return GDTask.WhenAll(tasks.Item1, tasks.Item2, tasks.Item3, tasks.Item4, tasks.Item5, tasks.Item6, tasks.Item7, tasks.Item8, tasks.Item9, tasks.Item10, tasks.Item11, tasks.Item12, tasks.Item13, tasks.Item14, tasks.Item15).GetAwaiter();\n        }\n\n\n    }\n}"
  },
  {
    "path": "addons/GDTask/GDTaskExtensions.Shorthand.cs.uid",
    "content": "uid://3sn3amfk43em\n"
  },
  {
    "path": "addons/GDTask/GDTaskExtensions.cs",
    "content": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Fractural.Tasks.Internal;\n\nnamespace Fractural.Tasks\n{\n    public static partial class GDTaskExtensions\n    {\n        /// <summary>\n        /// Convert Task[T] -> GDTask[T].\n        /// </summary>\n        public static GDTask<T> AsGDTask<T>(this Task<T> task, bool useCurrentSynchronizationContext = true)\n        {\n            var promise = new GDTaskCompletionSource<T>();\n\n            task.ContinueWith((x, state) =>\n            {\n                var p = (GDTaskCompletionSource<T>)state;\n\n                switch (x.Status)\n                {\n                    case TaskStatus.Canceled:\n                        p.TrySetCanceled();\n                        break;\n                    case TaskStatus.Faulted:\n                        p.TrySetException(x.Exception);\n                        break;\n                    case TaskStatus.RanToCompletion:\n                        p.TrySetResult(x.Result);\n                        break;\n                    default:\n                        throw new NotSupportedException();\n                }\n            }, promise, useCurrentSynchronizationContext ? TaskScheduler.FromCurrentSynchronizationContext() : TaskScheduler.Current);\n\n            return promise.Task;\n        }\n\n        /// <summary>\n        /// Convert Task -> GDTask.\n        /// </summary>\n        public static GDTask AsGDTask(this Task task, bool useCurrentSynchronizationContext = true)\n        {\n            var promise = new GDTaskCompletionSource();\n\n            task.ContinueWith((x, state) =>\n            {\n                var p = (GDTaskCompletionSource)state;\n\n                switch (x.Status)\n                {\n                    case TaskStatus.Canceled:\n                        p.TrySetCanceled();\n                        break;\n                    case TaskStatus.Faulted:\n                        p.TrySetException(x.Exception);\n                        break;\n                    case TaskStatus.RanToCompletion:\n                        p.TrySetResult();\n                        break;\n                    default:\n                        throw new NotSupportedException();\n                }\n            }, promise, useCurrentSynchronizationContext ? TaskScheduler.FromCurrentSynchronizationContext() : TaskScheduler.Current);\n\n            return promise.Task;\n        }\n\n        public static Task<T> AsTask<T>(this GDTask<T> task)\n        {\n            try\n            {\n                GDTask<T>.Awaiter awaiter;\n                try\n                {\n                    awaiter = task.GetAwaiter();\n                }\n                catch (Exception ex)\n                {\n                    return Task.FromException<T>(ex);\n                }\n\n                if (awaiter.IsCompleted)\n                {\n                    try\n                    {\n                        var result = awaiter.GetResult();\n                        return Task.FromResult(result);\n                    }\n                    catch (Exception ex)\n                    {\n                        return Task.FromException<T>(ex);\n                    }\n                }\n\n                var tcs = new TaskCompletionSource<T>();\n\n                awaiter.SourceOnCompleted(state =>\n                {\n                    using (var tuple = (StateTuple<TaskCompletionSource<T>, GDTask<T>.Awaiter>)state)\n                    {\n                        var (inTcs, inAwaiter) = tuple;\n                        try\n                        {\n                            var result = inAwaiter.GetResult();\n                            inTcs.SetResult(result);\n                        }\n                        catch (Exception ex)\n                        {\n                            inTcs.SetException(ex);\n                        }\n                    }\n                }, StateTuple.Create(tcs, awaiter));\n\n                return tcs.Task;\n            }\n            catch (Exception ex)\n            {\n                return Task.FromException<T>(ex);\n            }\n        }\n\n        public static Task AsTask(this GDTask task)\n        {\n            try\n            {\n                GDTask.Awaiter awaiter;\n                try\n                {\n                    awaiter = task.GetAwaiter();\n                }\n                catch (Exception ex)\n                {\n                    return Task.FromException(ex);\n                }\n\n                if (awaiter.IsCompleted)\n                {\n                    try\n                    {\n                        awaiter.GetResult(); // check token valid on Succeeded\n                        return Task.CompletedTask;\n                    }\n                    catch (Exception ex)\n                    {\n                        return Task.FromException(ex);\n                    }\n                }\n\n                var tcs = new TaskCompletionSource<object>();\n\n                awaiter.SourceOnCompleted(state =>\n                {\n                    using (var tuple = (StateTuple<TaskCompletionSource<object>, GDTask.Awaiter>)state)\n                    {\n                        var (inTcs, inAwaiter) = tuple;\n                        try\n                        {\n                            inAwaiter.GetResult();\n                            inTcs.SetResult(null);\n                        }\n                        catch (Exception ex)\n                        {\n                            inTcs.SetException(ex);\n                        }\n                    }\n                }, StateTuple.Create(tcs, awaiter));\n\n                return tcs.Task;\n            }\n            catch (Exception ex)\n            {\n                return Task.FromException(ex);\n            }\n        }\n\n        public static AsyncLazy ToAsyncLazy(this GDTask task)\n        {\n            return new AsyncLazy(task);\n        }\n\n        public static AsyncLazy<T> ToAsyncLazy<T>(this GDTask<T> task)\n        {\n            return new AsyncLazy<T>(task);\n        }\n\n        /// <summary>\n        /// Ignore task result when cancel raised first.\n        /// </summary>\n        public static GDTask AttachExternalCancellation(this GDTask task, CancellationToken cancellationToken)\n        {\n            if (!cancellationToken.CanBeCanceled)\n            {\n                return task;\n            }\n\n            if (cancellationToken.IsCancellationRequested)\n            {\n                return GDTask.FromCanceled(cancellationToken);\n            }\n\n            if (task.Status.IsCompleted())\n            {\n                return task;\n            }\n\n            return new GDTask(new AttachExternalCancellationSource(task, cancellationToken), 0);\n        }\n\n        /// <summary>\n        /// Ignore task result when cancel raised first.\n        /// </summary>\n        public static GDTask<T> AttachExternalCancellation<T>(this GDTask<T> task, CancellationToken cancellationToken)\n        {\n            if (!cancellationToken.CanBeCanceled)\n            {\n                return task;\n            }\n\n            if (cancellationToken.IsCancellationRequested)\n            {\n                return GDTask.FromCanceled<T>(cancellationToken);\n            }\n\n            if (task.Status.IsCompleted())\n            {\n                return task;\n            }\n\n            return new GDTask<T>(new AttachExternalCancellationSource<T>(task, cancellationToken), 0);\n        }\n\n        sealed class AttachExternalCancellationSource : IGDTaskSource\n        {\n            static readonly Action<object> cancellationCallbackDelegate = CancellationCallback;\n\n            CancellationToken cancellationToken;\n            CancellationTokenRegistration tokenRegistration;\n            GDTaskCompletionSourceCore<AsyncUnit> core;\n\n            public AttachExternalCancellationSource(GDTask task, CancellationToken cancellationToken)\n            {\n                this.cancellationToken = cancellationToken;\n                this.tokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallbackDelegate, this);\n                RunTask(task).Forget();\n            }\n\n            async GDTaskVoid RunTask(GDTask task)\n            {\n                try\n                {\n                    await task;\n                    core.TrySetResult(AsyncUnit.Default);\n                }\n                catch (Exception ex)\n                {\n                    core.TrySetException(ex);\n                }\n                finally\n                {\n                    tokenRegistration.Dispose();\n                }\n            }\n\n            static void CancellationCallback(object state)\n            {\n                var self = (AttachExternalCancellationSource)state;\n                self.core.TrySetCanceled(self.cancellationToken);\n            }\n\n            public void GetResult(short token)\n            {\n                core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n        }\n\n        sealed class AttachExternalCancellationSource<T> : IGDTaskSource<T>\n        {\n            static readonly Action<object> cancellationCallbackDelegate = CancellationCallback;\n\n            CancellationToken cancellationToken;\n            CancellationTokenRegistration tokenRegistration;\n            GDTaskCompletionSourceCore<T> core;\n\n            public AttachExternalCancellationSource(GDTask<T> task, CancellationToken cancellationToken)\n            {\n                this.cancellationToken = cancellationToken;\n                this.tokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallbackDelegate, this);\n                RunTask(task).Forget();\n            }\n\n            async GDTaskVoid RunTask(GDTask<T> task)\n            {\n                try\n                {\n                    core.TrySetResult(await task);\n                }\n                catch (Exception ex)\n                {\n                    core.TrySetException(ex);\n                }\n                finally\n                {\n                    tokenRegistration.Dispose();\n                }\n            }\n\n            static void CancellationCallback(object state)\n            {\n                var self = (AttachExternalCancellationSource<T>)state;\n                self.core.TrySetCanceled(self.cancellationToken);\n            }\n\n            void IGDTaskSource.GetResult(short token)\n            {\n                core.GetResult(token);\n            }\n\n            public T GetResult(short token)\n            {\n                return core.GetResult(token);\n            }\n\n            public GDTaskStatus GetStatus(short token)\n            {\n                return core.GetStatus(token);\n            }\n\n            public void OnCompleted(Action<object> continuation, object state, short token)\n            {\n                core.OnCompleted(continuation, state, token);\n            }\n\n            public GDTaskStatus UnsafeGetStatus()\n            {\n                return core.UnsafeGetStatus();\n            }\n        }\n\n        public static async GDTask Timeout(this GDTask task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Process, CancellationTokenSource taskCancellationTokenSource = null)\n        {\n            var delayCancellationTokenSource = new CancellationTokenSource();\n            var timeoutTask = GDTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();\n\n            int winArgIndex;\n            bool taskResultIsCanceled;\n            try\n            {\n                (winArgIndex, taskResultIsCanceled, _) = await GDTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask);\n            }\n            catch\n            {\n                delayCancellationTokenSource.Cancel();\n                delayCancellationTokenSource.Dispose();\n                throw;\n            }\n\n            // timeout\n            if (winArgIndex == 1)\n            {\n                if (taskCancellationTokenSource != null)\n                {\n                    taskCancellationTokenSource.Cancel();\n                    taskCancellationTokenSource.Dispose();\n                }\n\n                throw new TimeoutException(\"Exceed Timeout:\" + timeout);\n            }\n            else\n            {\n                delayCancellationTokenSource.Cancel();\n                delayCancellationTokenSource.Dispose();\n            }\n\n            if (taskResultIsCanceled)\n            {\n                Error.ThrowOperationCanceledException();\n            }\n        }\n\n        public static async GDTask<T> Timeout<T>(this GDTask<T> task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Process, CancellationTokenSource taskCancellationTokenSource = null)\n        {\n            var delayCancellationTokenSource = new CancellationTokenSource();\n            var timeoutTask = GDTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();\n\n            int winArgIndex;\n            (bool IsCanceled, T Result) taskResult;\n            try\n            {\n                (winArgIndex, taskResult, _) = await GDTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask);\n            }\n            catch\n            {\n                delayCancellationTokenSource.Cancel();\n                delayCancellationTokenSource.Dispose();\n                throw;\n            }\n\n            // timeout\n            if (winArgIndex == 1)\n            {\n                if (taskCancellationTokenSource != null)\n                {\n                    taskCancellationTokenSource.Cancel();\n                    taskCancellationTokenSource.Dispose();\n                }\n\n                throw new TimeoutException(\"Exceed Timeout:\" + timeout);\n            }\n            else\n            {\n                delayCancellationTokenSource.Cancel();\n                delayCancellationTokenSource.Dispose();\n            }\n\n            if (taskResult.IsCanceled)\n            {\n                Error.ThrowOperationCanceledException();\n            }\n\n            return taskResult.Result;\n        }\n\n        /// <summary>\n        /// Timeout with suppress OperationCanceledException. Returns (bool, IsCacneled).\n        /// </summary>\n        public static async GDTask<bool> TimeoutWithoutException(this GDTask task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Process, CancellationTokenSource taskCancellationTokenSource = null)\n        {\n            var delayCancellationTokenSource = new CancellationTokenSource();\n            var timeoutTask = GDTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();\n\n            int winArgIndex;\n            bool taskResultIsCanceled;\n            try\n            {\n                (winArgIndex, taskResultIsCanceled, _) = await GDTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask);\n            }\n            catch\n            {\n                delayCancellationTokenSource.Cancel();\n                delayCancellationTokenSource.Dispose();\n                return true;\n            }\n\n            // timeout\n            if (winArgIndex == 1)\n            {\n                if (taskCancellationTokenSource != null)\n                {\n                    taskCancellationTokenSource.Cancel();\n                    taskCancellationTokenSource.Dispose();\n                }\n\n                return true;\n            }\n            else\n            {\n                delayCancellationTokenSource.Cancel();\n                delayCancellationTokenSource.Dispose();\n            }\n\n            if (taskResultIsCanceled)\n            {\n                return true;\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Timeout with suppress OperationCanceledException. Returns (bool IsTimeout, T Result).\n        /// </summary>\n        public static async GDTask<(bool IsTimeout, T Result)> TimeoutWithoutException<T>(this GDTask<T> task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Process, CancellationTokenSource taskCancellationTokenSource = null)\n        {\n            var delayCancellationTokenSource = new CancellationTokenSource();\n            var timeoutTask = GDTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();\n\n            int winArgIndex;\n            (bool IsCanceled, T Result) taskResult;\n            try\n            {\n                (winArgIndex, taskResult, _) = await GDTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask);\n            }\n            catch\n            {\n                delayCancellationTokenSource.Cancel();\n                delayCancellationTokenSource.Dispose();\n                return (true, default);\n            }\n\n            // timeout\n            if (winArgIndex == 1)\n            {\n                if (taskCancellationTokenSource != null)\n                {\n                    taskCancellationTokenSource.Cancel();\n                    taskCancellationTokenSource.Dispose();\n                }\n\n                return (true, default);\n            }\n            else\n            {\n                delayCancellationTokenSource.Cancel();\n                delayCancellationTokenSource.Dispose();\n            }\n\n            if (taskResult.IsCanceled)\n            {\n                return (true, default);\n            }\n\n            return (false, taskResult.Result);\n        }\n\n        public static void Forget(this GDTask task)\n        {\n            var awaiter = task.GetAwaiter();\n            if (awaiter.IsCompleted)\n            {\n                try\n                {\n                    awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    GDTaskScheduler.PublishUnobservedTaskException(ex);\n                }\n            }\n            else\n            {\n                awaiter.SourceOnCompleted(state =>\n                {\n                    using (var t = (StateTuple<GDTask.Awaiter>)state)\n                    {\n                        try\n                        {\n                            t.Item1.GetResult();\n                        }\n                        catch (Exception ex)\n                        {\n                            GDTaskScheduler.PublishUnobservedTaskException(ex);\n                        }\n                    }\n                }, StateTuple.Create(awaiter));\n            }\n        }\n\n        public static void Forget(this GDTask task, Action<Exception> exceptionHandler, bool handleExceptionOnMainThread = true)\n        {\n            if (exceptionHandler == null)\n            {\n                Forget(task);\n            }\n            else\n            {\n                ForgetCoreWithCatch(task, exceptionHandler, handleExceptionOnMainThread).Forget();\n            }\n        }\n\n        static async GDTaskVoid ForgetCoreWithCatch(GDTask task, Action<Exception> exceptionHandler, bool handleExceptionOnMainThread)\n        {\n            try\n            {\n                await task;\n            }\n            catch (Exception ex)\n            {\n                try\n                {\n                    if (handleExceptionOnMainThread)\n                    {\n                        await GDTask.SwitchToMainThread();\n                    }\n                    exceptionHandler(ex);\n                }\n                catch (Exception ex2)\n                {\n                    GDTaskScheduler.PublishUnobservedTaskException(ex2);\n                }\n            }\n        }\n\n        public static void Forget<T>(this GDTask<T> task)\n        {\n            var awaiter = task.GetAwaiter();\n            if (awaiter.IsCompleted)\n            {\n                try\n                {\n                    awaiter.GetResult();\n                }\n                catch (Exception ex)\n                {\n                    GDTaskScheduler.PublishUnobservedTaskException(ex);\n                }\n            }\n            else\n            {\n                awaiter.SourceOnCompleted(state =>\n                {\n                    using (var t = (StateTuple<GDTask<T>.Awaiter>)state)\n                    {\n                        try\n                        {\n                            t.Item1.GetResult();\n                        }\n                        catch (Exception ex)\n                        {\n                            GDTaskScheduler.PublishUnobservedTaskException(ex);\n                        }\n                    }\n                }, StateTuple.Create(awaiter));\n            }\n        }\n\n        public static void Forget<T>(this GDTask<T> task, Action<Exception> exceptionHandler, bool handleExceptionOnMainThread = true)\n        {\n            if (exceptionHandler == null)\n            {\n                task.Forget();\n            }\n            else\n            {\n                ForgetCoreWithCatch(task, exceptionHandler, handleExceptionOnMainThread).Forget();\n            }\n        }\n\n        static async GDTaskVoid ForgetCoreWithCatch<T>(GDTask<T> task, Action<Exception> exceptionHandler, bool handleExceptionOnMainThread)\n        {\n            try\n            {\n                await task;\n            }\n            catch (Exception ex)\n            {\n                try\n                {\n                    if (handleExceptionOnMainThread)\n                    {\n                        await GDTask.SwitchToMainThread();\n                    }\n                    exceptionHandler(ex);\n                }\n                catch (Exception ex2)\n                {\n                    GDTaskScheduler.PublishUnobservedTaskException(ex2);\n                }\n            }\n        }\n\n        public static async GDTask ContinueWith<T>(this GDTask<T> task, Action<T> continuationFunction)\n        {\n            continuationFunction(await task);\n        }\n\n        public static async GDTask ContinueWith<T>(this GDTask<T> task, Func<T, GDTask> continuationFunction)\n        {\n            await continuationFunction(await task);\n        }\n\n        public static async GDTask<TR> ContinueWith<T, TR>(this GDTask<T> task, Func<T, TR> continuationFunction)\n        {\n            return continuationFunction(await task);\n        }\n\n        public static async GDTask<TR> ContinueWith<T, TR>(this GDTask<T> task, Func<T, GDTask<TR>> continuationFunction)\n        {\n            return await continuationFunction(await task);\n        }\n\n        public static async GDTask ContinueWith<T>(this GDTask<T> task, Action continuationFunction) {\n            await task;\n            continuationFunction();\n        }\n\n        public static async GDTask ContinueWith<T>(this GDTask<T> task, Func<GDTask> continuationFunction) {\n            await task;\n            await continuationFunction();\n        }\n\n        public static async GDTask<TR> ContinueWith<T, TR>(this GDTask<T> task, Func<TR> continuationFunction) {\n            await task;\n            return continuationFunction();\n        }\n\n        public static async GDTask<TR> ContinueWith<T, TR>(this GDTask<T> task, Func<GDTask<TR>> continuationFunction) {\n            await task;\n            return await continuationFunction();\n        }\n\n        public static async GDTask ContinueWith(this GDTask task, Action continuationFunction)\n        {\n            await task;\n            continuationFunction();\n        }\n\n        public static async GDTask ContinueWith(this GDTask task, Func<GDTask> continuationFunction)\n        {\n            await task;\n            await continuationFunction();\n        }\n\n        public static async GDTask<T> ContinueWith<T>(this GDTask task, Func<T> continuationFunction)\n        {\n            await task;\n            return continuationFunction();\n        }\n\n        public static async GDTask<T> ContinueWith<T>(this GDTask task, Func<GDTask<T>> continuationFunction)\n        {\n            await task;\n            return await continuationFunction();\n        }\n\n        public static async GDTask<T> Unwrap<T>(this GDTask<GDTask<T>> task)\n        {\n            return await await task;\n        }\n\n        public static async GDTask Unwrap(this GDTask<GDTask> task)\n        {\n            await await task;\n        }\n\n        public static async GDTask<T> Unwrap<T>(this Task<GDTask<T>> task)\n        {\n            return await await task;\n        }\n\n        public static async GDTask<T> Unwrap<T>(this Task<GDTask<T>> task, bool continueOnCapturedContext)\n        {\n            return await await task.ConfigureAwait(continueOnCapturedContext);\n        }\n\n        public static async GDTask Unwrap(this Task<GDTask> task)\n        {\n            await await task;\n        }\n\n        public static async GDTask Unwrap(this Task<GDTask> task, bool continueOnCapturedContext)\n        {\n            await await task.ConfigureAwait(continueOnCapturedContext);\n        }\n\n        public static async GDTask<T> Unwrap<T>(this GDTask<Task<T>> task)\n        {\n            return await await task;\n        }\n\n        public static async GDTask<T> Unwrap<T>(this GDTask<Task<T>> task, bool continueOnCapturedContext)\n        {\n            return await (await task).ConfigureAwait(continueOnCapturedContext);\n        }\n\n        public static async GDTask Unwrap(this GDTask<Task> task)\n        {\n            await await task;\n        }\n\n        public static async GDTask Unwrap(this GDTask<Task> task, bool continueOnCapturedContext)\n        {\n            await (await task).ConfigureAwait(continueOnCapturedContext);\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/GDTaskExtensions.cs.uid",
    "content": "uid://cqppdk8mlk6t2\n"
  },
  {
    "path": "addons/GDTask/GDTaskObservableExtensions.cs",
    "content": "﻿using System;\nusing System.Runtime.ExceptionServices;\nusing System.Threading;\nusing Fractural.Tasks.Internal;\n\nnamespace Fractural.Tasks\n{\n    public static class GDTaskObservableExtensions\n    {\n        public static GDTask<T> ToGDTask<T>(this IObservable<T> source, bool useFirstValue = false, CancellationToken cancellationToken = default)\n        {\n            var promise = new GDTaskCompletionSource<T>();\n            var disposable = new SingleAssignmentDisposable();\n\n            var observer = useFirstValue\n                ? (IObserver<T>)new FirstValueToGDTaskObserver<T>(promise, disposable, cancellationToken)\n                : (IObserver<T>)new ToGDTaskObserver<T>(promise, disposable, cancellationToken);\n\n            try\n            {\n                disposable.Disposable = source.Subscribe(observer);\n            }\n            catch (Exception ex)\n            {\n                promise.TrySetException(ex);\n            }\n\n            return promise.Task;\n        }\n\n        public static IObservable<T> ToObservable<T>(this GDTask<T> task)\n        {\n            if (task.Status.IsCompleted())\n            {\n                try\n                {\n                    return new ReturnObservable<T>(task.GetAwaiter().GetResult());\n                }\n                catch (Exception ex)\n                {\n                    return new ThrowObservable<T>(ex);\n                }\n            }\n\n            var subject = new AsyncSubject<T>();\n            Fire(subject, task).Forget();\n            return subject;\n        }\n\n        /// <summary>\n        /// Ideally returns IObservabl[Unit] is best but GDTask does not have Unit so return AsyncUnit instead.\n        /// </summary>\n        public static IObservable<AsyncUnit> ToObservable(this GDTask task)\n        {\n            if (task.Status.IsCompleted())\n            {\n                try\n                {\n                    task.GetAwaiter().GetResult();\n                    return new ReturnObservable<AsyncUnit>(AsyncUnit.Default);\n                }\n                catch (Exception ex)\n                {\n                    return new ThrowObservable<AsyncUnit>(ex);\n                }\n            }\n\n            var subject = new AsyncSubject<AsyncUnit>();\n            Fire(subject, task).Forget();\n            return subject;\n        }\n\n        static async GDTaskVoid Fire<T>(AsyncSubject<T> subject, GDTask<T> task)\n        {\n            T value;\n            try\n            {\n                value = await task;\n            }\n            catch (Exception ex)\n            {\n                subject.OnError(ex);\n                return;\n            }\n\n            subject.OnNext(value);\n            subject.OnCompleted();\n        }\n\n        static async GDTaskVoid Fire(AsyncSubject<AsyncUnit> subject, GDTask task)\n        {\n            try\n            {\n                await task;\n            }\n            catch (Exception ex)\n            {\n                subject.OnError(ex);\n                return;\n            }\n\n            subject.OnNext(AsyncUnit.Default);\n            subject.OnCompleted();\n        }\n\n        class ToGDTaskObserver<T> : IObserver<T>\n        {\n            static readonly Action<object> callback = OnCanceled;\n\n            readonly GDTaskCompletionSource<T> promise;\n            readonly SingleAssignmentDisposable disposable;\n            readonly CancellationToken cancellationToken;\n            readonly CancellationTokenRegistration registration;\n\n            bool hasValue;\n            T latestValue;\n\n            public ToGDTaskObserver(GDTaskCompletionSource<T> promise, SingleAssignmentDisposable disposable, CancellationToken cancellationToken)\n            {\n                this.promise = promise;\n                this.disposable = disposable;\n                this.cancellationToken = cancellationToken;\n\n                if (this.cancellationToken.CanBeCanceled)\n                {\n                    this.registration = this.cancellationToken.RegisterWithoutCaptureExecutionContext(callback, this);\n                }\n            }\n\n            static void OnCanceled(object state)\n            {\n                var self = (ToGDTaskObserver<T>)state;\n                self.disposable.Dispose();\n                self.promise.TrySetCanceled(self.cancellationToken);\n            }\n\n            public void OnNext(T value)\n            {\n                hasValue = true;\n                latestValue = value;\n            }\n\n            public void OnError(Exception error)\n            {\n                try\n                {\n                    promise.TrySetException(error);\n                }\n                finally\n                {\n                    registration.Dispose();\n                    disposable.Dispose();\n                }\n            }\n\n            public void OnCompleted()\n            {\n                try\n                {\n                    if (hasValue)\n                    {\n                        promise.TrySetResult(latestValue);\n                    }\n                    else\n                    {\n                        promise.TrySetException(new InvalidOperationException(\"Sequence has no elements\"));\n                    }\n                }\n                finally\n                {\n                    registration.Dispose();\n                    disposable.Dispose();\n                }\n            }\n        }\n\n        class FirstValueToGDTaskObserver<T> : IObserver<T>\n        {\n            static readonly Action<object> callback = OnCanceled;\n\n            readonly GDTaskCompletionSource<T> promise;\n            readonly SingleAssignmentDisposable disposable;\n            readonly CancellationToken cancellationToken;\n            readonly CancellationTokenRegistration registration;\n\n            bool hasValue;\n\n            public FirstValueToGDTaskObserver(GDTaskCompletionSource<T> promise, SingleAssignmentDisposable disposable, CancellationToken cancellationToken)\n            {\n                this.promise = promise;\n                this.disposable = disposable;\n                this.cancellationToken = cancellationToken;\n\n                if (this.cancellationToken.CanBeCanceled)\n                {\n                    this.registration = this.cancellationToken.RegisterWithoutCaptureExecutionContext(callback, this);\n                }\n            }\n\n            static void OnCanceled(object state)\n            {\n                var self = (FirstValueToGDTaskObserver<T>)state;\n                self.disposable.Dispose();\n                self.promise.TrySetCanceled(self.cancellationToken);\n            }\n\n            public void OnNext(T value)\n            {\n                hasValue = true;\n                try\n                {\n                    promise.TrySetResult(value);\n                }\n                finally\n                {\n                    registration.Dispose();\n                    disposable.Dispose();\n                }\n            }\n\n            public void OnError(Exception error)\n            {\n                try\n                {\n                    promise.TrySetException(error);\n                }\n                finally\n                {\n                    registration.Dispose();\n                    disposable.Dispose();\n                }\n            }\n\n            public void OnCompleted()\n            {\n                try\n                {\n                    if (!hasValue)\n                    {\n                        promise.TrySetException(new InvalidOperationException(\"Sequence has no elements\"));\n                    }\n                }\n                finally\n                {\n                    registration.Dispose();\n                    disposable.Dispose();\n                }\n            }\n        }\n\n        class ReturnObservable<T> : IObservable<T>\n        {\n            readonly T value;\n\n            public ReturnObservable(T value)\n            {\n                this.value = value;\n            }\n\n            public IDisposable Subscribe(IObserver<T> observer)\n            {\n                observer.OnNext(value);\n                observer.OnCompleted();\n                return EmptyDisposable.Instance;\n            }\n        }\n\n        class ThrowObservable<T> : IObservable<T>\n        {\n            readonly Exception value;\n\n            public ThrowObservable(Exception value)\n            {\n                this.value = value;\n            }\n\n            public IDisposable Subscribe(IObserver<T> observer)\n            {\n                observer.OnError(value);\n                return EmptyDisposable.Instance;\n            }\n        }\n    }\n}\n\nnamespace Fractural.Tasks.Internal\n{\n    // Bridges for Rx.\n\n    internal class EmptyDisposable : IDisposable\n    {\n        public static EmptyDisposable Instance = new EmptyDisposable();\n\n        EmptyDisposable()\n        {\n\n        }\n\n        public void Dispose()\n        {\n        }\n    }\n\n    internal sealed class SingleAssignmentDisposable : IDisposable\n    {\n        readonly object gate = new object();\n        IDisposable current;\n        bool disposed;\n\n        public bool IsDisposed { get { lock (gate) { return disposed; } } }\n\n        public IDisposable Disposable\n        {\n            get\n            {\n                return current;\n            }\n            set\n            {\n                var old = default(IDisposable);\n                bool alreadyDisposed;\n                lock (gate)\n                {\n                    alreadyDisposed = disposed;\n                    old = current;\n                    if (!alreadyDisposed)\n                    {\n                        if (value == null) return;\n                        current = value;\n                    }\n                }\n\n                if (alreadyDisposed && value != null)\n                {\n                    value.Dispose();\n                    return;\n                }\n\n                if (old != null) throw new InvalidOperationException(\"Disposable is already set\");\n            }\n        }\n\n\n        public void Dispose()\n        {\n            IDisposable old = null;\n\n            lock (gate)\n            {\n                if (!disposed)\n                {\n                    disposed = true;\n                    old = current;\n                    current = null;\n                }\n            }\n\n            if (old != null) old.Dispose();\n        }\n    }\n\n    internal sealed class AsyncSubject<T> : IObservable<T>, IObserver<T>\n    {\n        object observerLock = new object();\n\n        T lastValue;\n        bool hasValue;\n        bool isStopped;\n        bool isDisposed;\n        Exception lastError;\n        IObserver<T> outObserver = EmptyObserver<T>.Instance;\n\n        public T Value\n        {\n            get\n            {\n                ThrowIfDisposed();\n                if (!isStopped) throw new InvalidOperationException(\"AsyncSubject is not completed yet\");\n                if (lastError != null) ExceptionDispatchInfo.Capture(lastError).Throw();\n                return lastValue;\n            }\n        }\n\n        public bool HasObservers\n        {\n            get\n            {\n                return !(outObserver is EmptyObserver<T>) && !isStopped && !isDisposed;\n            }\n        }\n\n        public bool IsCompleted { get { return isStopped; } }\n\n        public void OnCompleted()\n        {\n            IObserver<T> old;\n            T v;\n            bool hv;\n            lock (observerLock)\n            {\n                ThrowIfDisposed();\n                if (isStopped) return;\n\n                old = outObserver;\n                outObserver = EmptyObserver<T>.Instance;\n                isStopped = true;\n                v = lastValue;\n                hv = hasValue;\n            }\n\n            if (hv)\n            {\n                old.OnNext(v);\n                old.OnCompleted();\n            }\n            else\n            {\n                old.OnCompleted();\n            }\n        }\n\n        public void OnError(Exception error)\n        {\n            if (error == null) throw new ArgumentNullException(\"error\");\n\n            IObserver<T> old;\n            lock (observerLock)\n            {\n                ThrowIfDisposed();\n                if (isStopped) return;\n\n                old = outObserver;\n                outObserver = EmptyObserver<T>.Instance;\n                isStopped = true;\n                lastError = error;\n            }\n\n            old.OnError(error);\n        }\n\n        public void OnNext(T value)\n        {\n            lock (observerLock)\n            {\n                ThrowIfDisposed();\n                if (isStopped) return;\n\n                this.hasValue = true;\n                this.lastValue = value;\n            }\n        }\n\n        public IDisposable Subscribe(IObserver<T> observer)\n        {\n            if (observer == null) throw new ArgumentNullException(\"observer\");\n\n            var ex = default(Exception);\n            var v = default(T);\n            var hv = false;\n\n            lock (observerLock)\n            {\n                ThrowIfDisposed();\n                if (!isStopped)\n                {\n                    var listObserver = outObserver as ListObserver<T>;\n                    if (listObserver != null)\n                    {\n                        outObserver = listObserver.Add(observer);\n                    }\n                    else\n                    {\n                        var current = outObserver;\n                        if (current is EmptyObserver<T>)\n                        {\n                            outObserver = observer;\n                        }\n                        else\n                        {\n                            outObserver = new ListObserver<T>(new ImmutableList<IObserver<T>>(new[] { current, observer }));\n                        }\n                    }\n\n                    return new Subscription(this, observer);\n                }\n\n                ex = lastError;\n                v = lastValue;\n                hv = hasValue;\n            }\n\n            if (ex != null)\n            {\n                observer.OnError(ex);\n            }\n            else if (hv)\n            {\n                observer.OnNext(v);\n                observer.OnCompleted();\n            }\n            else\n            {\n                observer.OnCompleted();\n            }\n\n            return EmptyDisposable.Instance;\n        }\n\n        public void Dispose()\n        {\n            lock (observerLock)\n            {\n                isDisposed = true;\n                outObserver = DisposedObserver<T>.Instance;\n                lastError = null;\n                lastValue = default(T);\n            }\n        }\n\n        void ThrowIfDisposed()\n        {\n            if (isDisposed) throw new ObjectDisposedException(\"\");\n        }\n\n        class Subscription : IDisposable\n        {\n            readonly object gate = new object();\n            AsyncSubject<T> parent;\n            IObserver<T> unsubscribeTarget;\n\n            public Subscription(AsyncSubject<T> parent, IObserver<T> unsubscribeTarget)\n            {\n                this.parent = parent;\n                this.unsubscribeTarget = unsubscribeTarget;\n            }\n\n            public void Dispose()\n            {\n                lock (gate)\n                {\n                    if (parent != null)\n                    {\n                        lock (parent.observerLock)\n                        {\n                            var listObserver = parent.outObserver as ListObserver<T>;\n                            if (listObserver != null)\n                            {\n                                parent.outObserver = listObserver.Remove(unsubscribeTarget);\n                            }\n                            else\n                            {\n                                parent.outObserver = EmptyObserver<T>.Instance;\n                            }\n\n                            unsubscribeTarget = null;\n                            parent = null;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    internal class ListObserver<T> : IObserver<T>\n    {\n        private readonly ImmutableList<IObserver<T>> _observers;\n\n        public ListObserver(ImmutableList<IObserver<T>> observers)\n        {\n            _observers = observers;\n        }\n\n        public void OnCompleted()\n        {\n            var targetObservers = _observers.Data;\n            for (int i = 0; i < targetObservers.Length; i++)\n            {\n                targetObservers[i].OnCompleted();\n            }\n        }\n\n        public void OnError(Exception error)\n        {\n            var targetObservers = _observers.Data;\n            for (int i = 0; i < targetObservers.Length; i++)\n            {\n                targetObservers[i].OnError(error);\n            }\n        }\n\n        public void OnNext(T value)\n        {\n            var targetObservers = _observers.Data;\n            for (int i = 0; i < targetObservers.Length; i++)\n            {\n                targetObservers[i].OnNext(value);\n            }\n        }\n\n        internal IObserver<T> Add(IObserver<T> observer)\n        {\n            return new ListObserver<T>(_observers.Add(observer));\n        }\n\n        internal IObserver<T> Remove(IObserver<T> observer)\n        {\n            var i = Array.IndexOf(_observers.Data, observer);\n            if (i < 0)\n                return this;\n\n            if (_observers.Data.Length == 2)\n            {\n                return _observers.Data[1 - i];\n            }\n            else\n            {\n                return new ListObserver<T>(_observers.Remove(observer));\n            }\n        }\n    }\n\n    internal class EmptyObserver<T> : IObserver<T>\n    {\n        public static readonly EmptyObserver<T> Instance = new EmptyObserver<T>();\n\n        EmptyObserver()\n        {\n\n        }\n\n        public void OnCompleted()\n        {\n        }\n\n        public void OnError(Exception error)\n        {\n        }\n\n        public void OnNext(T value)\n        {\n        }\n    }\n\n    internal class ThrowObserver<T> : IObserver<T>\n    {\n        public static readonly ThrowObserver<T> Instance = new ThrowObserver<T>();\n\n        ThrowObserver()\n        {\n\n        }\n\n        public void OnCompleted()\n        {\n        }\n\n        public void OnError(Exception error)\n        {\n            ExceptionDispatchInfo.Capture(error).Throw();\n        }\n\n        public void OnNext(T value)\n        {\n        }\n    }\n\n    internal class DisposedObserver<T> : IObserver<T>\n    {\n        public static readonly DisposedObserver<T> Instance = new DisposedObserver<T>();\n\n        DisposedObserver()\n        {\n\n        }\n\n        public void OnCompleted()\n        {\n            throw new ObjectDisposedException(\"\");\n        }\n\n        public void OnError(Exception error)\n        {\n            throw new ObjectDisposedException(\"\");\n        }\n\n        public void OnNext(T value)\n        {\n            throw new ObjectDisposedException(\"\");\n        }\n    }\n\n    internal class ImmutableList<T>\n    {\n        public static readonly ImmutableList<T> Empty = new ImmutableList<T>();\n\n        T[] data;\n\n        public T[] Data\n        {\n            get { return data; }\n        }\n\n        ImmutableList()\n        {\n            data = new T[0];\n        }\n\n        public ImmutableList(T[] data)\n        {\n            this.data = data;\n        }\n\n        public ImmutableList<T> Add(T value)\n        {\n            var newData = new T[data.Length + 1];\n            Array.Copy(data, newData, data.Length);\n            newData[data.Length] = value;\n            return new ImmutableList<T>(newData);\n        }\n\n        public ImmutableList<T> Remove(T value)\n        {\n            var i = IndexOf(value);\n            if (i < 0) return this;\n\n            var length = data.Length;\n            if (length == 1) return Empty;\n\n            var newData = new T[length - 1];\n\n            Array.Copy(data, 0, newData, 0, i);\n            Array.Copy(data, i + 1, newData, i, length - i - 1);\n\n            return new ImmutableList<T>(newData);\n        }\n\n        public int IndexOf(T value)\n        {\n            for (var i = 0; i < data.Length; ++i)\n            {\n                // ImmutableList only use for IObserver(no worry for boxed)\n                if (object.Equals(data[i], value)) return i;\n            }\n            return -1;\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/GDTaskObservableExtensions.cs.uid",
    "content": "uid://bkg2p8poqeue2\n"
  },
  {
    "path": "addons/GDTask/GDTaskScheduler.cs",
    "content": "﻿using System;\nusing System.Threading;\nusing Godot;\n\nnamespace Fractural.Tasks\n{\n    // GDTask has no scheduler like TaskScheduler.\n    // Only handle unobserved exception.\n\n    public static class GDTaskScheduler\n    {\n        public static event Action<Exception> UnobservedTaskException;\n\n        /// <summary>\n        /// Propagate OperationCanceledException to UnobservedTaskException when true. Default is false.\n        /// </summary>\n        public static bool PropagateOperationCanceledException = false;\n\n        internal static void PublishUnobservedTaskException(Exception ex)\n        {\n            if (ex != null)\n            {\n                if (!PropagateOperationCanceledException && ex is OperationCanceledException)\n                {\n                    return;\n                }\n\n                if (UnobservedTaskException != null)\n                {\n                    UnobservedTaskException.Invoke(ex);\n                }\n                else\n                {\n                    GD.PrintErr(\"UnobservedTaskException: \" + ex.ToString());\n                }\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/GDTaskScheduler.cs.uid",
    "content": "uid://caqlg0dx35lpq\n"
  },
  {
    "path": "addons/GDTask/GDTaskSynchronizationContext.cs",
    "content": "using Godot;\nusing System;\nusing System.Runtime.InteropServices;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    public partial class GDTaskSynchronizationContext : SynchronizationContext\n    {\n        const int MaxArrayLength = 0X7FEFFFFF;\n        const int InitialSize = 16;\n\n        static SpinLock gate = new SpinLock(false);\n        static bool dequing = false;\n\n        static int actionListCount = 0;\n        static Callback[] actionList = new Callback[InitialSize];\n\n        static int waitingListCount = 0;\n        static Callback[] waitingList = new Callback[InitialSize];\n\n        static int opCount;\n\n        public override void Send(SendOrPostCallback d, object state)\n        {\n            d(state);\n        }\n\n        public override void Post(SendOrPostCallback d, object state)\n        {\n            bool lockTaken = false;\n            try\n            {\n                gate.Enter(ref lockTaken);\n\n                if (dequing)\n                {\n                    // Ensure Capacity\n                    if (waitingList.Length == waitingListCount)\n                    {\n                        var newLength = waitingListCount * 2;\n                        if ((uint)newLength > MaxArrayLength) newLength = MaxArrayLength;\n\n                        var newArray = new Callback[newLength];\n                        Array.Copy(waitingList, newArray, waitingListCount);\n                        waitingList = newArray;\n                    }\n                    waitingList[waitingListCount] = new Callback(d, state);\n                    waitingListCount++;\n                }\n                else\n                {\n                    // Ensure Capacity\n                    if (actionList.Length == actionListCount)\n                    {\n                        var newLength = actionListCount * 2;\n                        if ((uint)newLength > MaxArrayLength) newLength = MaxArrayLength;\n\n                        var newArray = new Callback[newLength];\n                        Array.Copy(actionList, newArray, actionListCount);\n                        actionList = newArray;\n                    }\n                    actionList[actionListCount] = new Callback(d, state);\n                    actionListCount++;\n                }\n            }\n            finally\n            {\n                if (lockTaken) gate.Exit(false);\n            }\n        }\n\n        public override void OperationStarted()\n        {\n            Interlocked.Increment(ref opCount);\n        }\n\n        public override void OperationCompleted()\n        {\n            Interlocked.Decrement(ref opCount);\n        }\n\n        public override SynchronizationContext CreateCopy()\n        {\n            return this;\n        }\n\n        // delegate entrypoint.\n        internal static void Run()\n        {\n            {\n                bool lockTaken = false;\n                try\n                {\n                    gate.Enter(ref lockTaken);\n                    if (actionListCount == 0) return;\n                    dequing = true;\n                }\n                finally\n                {\n                    if (lockTaken) gate.Exit(false);\n                }\n            }\n\n            for (int i = 0; i < actionListCount; i++)\n            {\n                var action = actionList[i];\n                actionList[i] = default;\n                action.Invoke();\n            }\n\n            {\n                bool lockTaken = false;\n                try\n                {\n                    gate.Enter(ref lockTaken);\n                    dequing = false;\n\n                    var swapTempActionList = actionList;\n\n                    actionListCount = waitingListCount;\n                    actionList = waitingList;\n\n                    waitingListCount = 0;\n                    waitingList = swapTempActionList;\n                }\n                finally\n                {\n                    if (lockTaken) gate.Exit(false);\n                }\n            }\n        }\n\n        [StructLayout(LayoutKind.Auto)]\n        readonly struct Callback\n        {\n            readonly SendOrPostCallback callback;\n            readonly object state;\n\n            public Callback(SendOrPostCallback callback, object state)\n            {\n                this.callback = callback;\n                this.state = state;\n            }\n\n            public void Invoke()\n            {\n                try\n                {\n                    callback(state);\n                }\n                catch (Exception ex)\n                {\n                    GD.PrintErr(ex);\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/GDTaskSynchronizationContext.cs.uid",
    "content": "uid://blaimw6ec387c\n"
  },
  {
    "path": "addons/GDTask/GDTaskVoid.cs",
    "content": "﻿#pragma warning disable CS1591\n#pragma warning disable CS0436\n\nusing System;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\nusing Fractural.Tasks.CompilerServices;\n\nnamespace Fractural.Tasks\n{\n    [AsyncMethodBuilder(typeof(AsyncGDTaskVoidMethodBuilder))]\n    public readonly struct GDTaskVoid\n    {\n        public void Forget()\n        {\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/GDTaskVoid.cs.uid",
    "content": "uid://dcq6np6u58ldd\n"
  },
  {
    "path": "addons/GDTask/IGDTaskSource.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace Fractural.Tasks\n{\n    public enum GDTaskStatus\n    {\n        /// <summary>The operation has not yet completed.</summary>\n        Pending = 0,\n        /// <summary>The operation completed successfully.</summary>\n        Succeeded = 1,\n        /// <summary>The operation completed with an error.</summary>\n        Faulted = 2,\n        /// <summary>The operation completed due to cancellation.</summary>\n        Canceled = 3\n    }\n\n    // General architecture:\n    // Each GDTask holds a IGDTaskSource, which determines how the GDTask will run. This is basically a strategy pattern.\n    // GDTask is a struct, so will be allocated on stack with no garbage collection. All IGDTaskSources will be pooled using\n    // TaskPool<T>, so again, no garabage will be generated.\n    //\n    // Hence we achieve 0 memory allocation, making our tasks run really fast.\n\n    /// <summary>\n    /// GDTaskSource that has a void return (returns nothing).\n    /// </summary>\n    public interface IGDTaskSource\n    {\n        GDTaskStatus GetStatus(short token);\n        void OnCompleted(Action<object> continuation, object state, short token);\n        void GetResult(short token);\n\n        GDTaskStatus UnsafeGetStatus(); // only for debug use.\n    }\n\n    /// <summary>\n    /// GDTaskSource that has a return value of <see cref=\"T\"/>\n    /// </summary>\n    /// <typeparam name=\"T\">Return value of the task source</typeparam>\n    public interface IGDTaskSource<out T> : IGDTaskSource\n    {\n        // Hide the original void GetResult method\n        new T GetResult(short token);\n    }\n\n    // Extensions are all aggressive inlined so all calls are substituted with raw code for greatest performance.\n    public static class GDTaskStatusExtensions\n    {\n        /// <summary>status != Pending.</summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static bool IsCompleted(this GDTaskStatus status)\n        {\n            return status != GDTaskStatus.Pending;\n        }\n\n        /// <summary>status == Succeeded.</summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static bool IsCompletedSuccessfully(this GDTaskStatus status)\n        {\n            return status == GDTaskStatus.Succeeded;\n        }\n\n        /// <summary>status == Canceled.</summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static bool IsCanceled(this GDTaskStatus status)\n        {\n            return status == GDTaskStatus.Canceled;\n        }\n\n        /// <summary>status == Faulted.</summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static bool IsFaulted(this GDTaskStatus status)\n        {\n            return status == GDTaskStatus.Faulted;\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/IGDTaskSource.cs.uid",
    "content": "uid://c342n7et0cbxw\n"
  },
  {
    "path": "addons/GDTask/Internal/ArrayPool.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace Fractural.Tasks.Internal\n{\n    // Same interface as System.Buffers.ArrayPool<T> but only provides Shared.\n\n    internal sealed class ArrayPool<T>\n    {\n        // Same size as System.Buffers.DefaultArrayPool<T>\n        const int DefaultMaxNumberOfArraysPerBucket = 50;\n\n        static readonly T[] EmptyArray = new T[0];\n\n        public static readonly ArrayPool<T> Shared = new ArrayPool<T>();\n\n        readonly MinimumQueue<T[]>[] buckets;\n        readonly SpinLock[] locks;\n\n        ArrayPool()\n        {\n            // see: GetQueueIndex\n            buckets = new MinimumQueue<T[]>[18];\n            locks = new SpinLock[18];\n            for (int i = 0; i < buckets.Length; i++)\n            {\n                buckets[i] = new MinimumQueue<T[]>(4);\n                locks[i] = new SpinLock(false);\n            }\n        }\n\n        public T[] Rent(int minimumLength)\n        {\n            if (minimumLength < 0)\n            {\n                throw new ArgumentOutOfRangeException(\"minimumLength\");\n            }\n            else if (minimumLength == 0)\n            {\n                return EmptyArray;\n            }\n\n            var size = CalculateSize(minimumLength);\n            var index = GetQueueIndex(size);\n            if (index != -1)\n            {\n                var q = buckets[index];\n                var lockTaken = false;\n                try\n                {\n                    locks[index].Enter(ref lockTaken);\n\n                    if (q.Count != 0)\n                    {\n                        return q.Dequeue();\n                    }\n                }\n                finally\n                {\n                    if (lockTaken) locks[index].Exit(false);\n                }\n            }\n\n            return new T[size];\n        }\n\n        public void Return(T[] array, bool clearArray = false)\n        {\n            if (array == null || array.Length == 0)\n            {\n                return;\n            }\n\n            var index = GetQueueIndex(array.Length);\n            if (index != -1)\n            {\n                if (clearArray)\n                {\n                    Array.Clear(array, 0, array.Length);\n                }\n\n                var q = buckets[index];\n                var lockTaken = false;\n\n                try\n                {\n                    locks[index].Enter(ref lockTaken);\n\n                    if (q.Count > DefaultMaxNumberOfArraysPerBucket)\n                    {\n                        return;\n                    }\n\n                    q.Enqueue(array);\n                }\n                finally\n                {\n                    if (lockTaken) locks[index].Exit(false);\n                }\n            }\n        }\n\n        static int CalculateSize(int size)\n        {\n            size--;\n            size |= size >> 1;\n            size |= size >> 2;\n            size |= size >> 4;\n            size |= size >> 8;\n            size |= size >> 16;\n            size += 1;\n\n            if (size < 8)\n            {\n                size = 8;\n            }\n\n            return size;\n        }\n\n        static int GetQueueIndex(int size)\n        {\n            switch (size)\n            {\n                case 8: return 0;\n                case 16: return 1;\n                case 32: return 2;\n                case 64: return 3;\n                case 128: return 4;\n                case 256: return 5;\n                case 512: return 6;\n                case 1024: return 7;\n                case 2048: return 8;\n                case 4096: return 9;\n                case 8192: return 10;\n                case 16384: return 11;\n                case 32768: return 12;\n                case 65536: return 13;\n                case 131072: return 14;\n                case 262144: return 15;\n                case 524288: return 16;\n                case 1048576: return 17; // max array length\n                default:\n                    return -1;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/Internal/ArrayPool.cs.uid",
    "content": "uid://bt5k6u0r44m4f\n"
  },
  {
    "path": "addons/GDTask/Internal/ArrayPoolUtil.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal static class ArrayPoolUtil\n    {\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        internal static void EnsureCapacity<T>(ref T[] array, int index, ArrayPool<T> pool)\n        {\n            if (array.Length <= index)\n            {\n                EnsureCapacityCore(ref array, index, pool);\n            }\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static void EnsureCapacityCore<T>(ref T[] array, int index, ArrayPool<T> pool)\n        {\n            if (array.Length <= index)\n            {\n                var newSize = array.Length * 2;\n                var newArray = pool.Rent((index < newSize) ? newSize : (index * 2));\n                Array.Copy(array, 0, newArray, 0, array.Length);\n\n                pool.Return(array, clearArray: !RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType<T>());\n\n                array = newArray;\n            }\n        }\n\n        public static RentArray<T> Materialize<T>(IEnumerable<T> source)\n        {\n            if (source is T[] array)\n            {\n                return new RentArray<T>(array, array.Length, null);\n            }\n\n            var defaultCount = 32;\n            if (source is ICollection<T> coll)\n            {\n                if (coll.Count == 0)\n                {\n                    return new RentArray<T>(Array.Empty<T>(), 0, null);\n                }\n\n                defaultCount = coll.Count;\n                var pool = ArrayPool<T>.Shared;\n                var buffer = pool.Rent(defaultCount);\n                coll.CopyTo(buffer, 0);\n                return new RentArray<T>(buffer, coll.Count, pool);\n            }\n            else if (source is IReadOnlyCollection<T> rcoll)\n            {\n                defaultCount = rcoll.Count;\n            }\n\n            if (defaultCount == 0)\n            {\n                return new RentArray<T>(Array.Empty<T>(), 0, null);\n            }\n\n            {\n                var pool = ArrayPool<T>.Shared;\n\n                var index = 0;\n                var buffer = pool.Rent(defaultCount);\n                foreach (var item in source)\n                {\n                    EnsureCapacity(ref buffer, index, pool);\n                    buffer[index++] = item;\n                }\n\n                return new RentArray<T>(buffer, index, pool);\n            }\n        }\n\n        public struct RentArray<T> : IDisposable\n        {\n            public readonly T[] Array;\n            public readonly int Length;\n            ArrayPool<T> pool;\n\n            public RentArray(T[] array, int length, ArrayPool<T> pool)\n            {\n                this.Array = array;\n                this.Length = length;\n                this.pool = pool;\n            }\n\n            public void Dispose()\n            {\n                DisposeManually(!RuntimeHelpersAbstraction.IsWellKnownNoReferenceContainsType<T>());\n            }\n\n            public void DisposeManually(bool clearArray)\n            {\n                if (pool != null)\n                {\n                    if (clearArray)\n                    {\n                        System.Array.Clear(Array, 0, Length);\n                    }\n\n                    pool.Return(Array, clearArray: false);\n                    pool = null;\n                }\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Internal/ArrayPoolUtil.cs.uid",
    "content": "uid://b73uh74arc3l7\n"
  },
  {
    "path": "addons/GDTask/Internal/ArrayUtil.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal static class ArrayUtil\n    {\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void EnsureCapacity<T>(ref T[] array, int index)\n        {\n            if (array.Length <= index)\n            {\n                EnsureCore(ref array, index);\n            }\n        }\n\n        // rare case, no inlining.\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static void EnsureCore<T>(ref T[] array, int index)\n        {\n            var newSize = array.Length * 2;\n            var newArray = new T[(index < newSize) ? newSize : (index * 2)];\n            Array.Copy(array, 0, newArray, 0, array.Length);\n\n            array = newArray;\n        }\n\n        /// <summary>\n        /// Optimizing utility to avoid .ToArray() that creates buffer copy(cut to just size).\n        /// </summary>\n        public static (T[] array, int length) Materialize<T>(IEnumerable<T> source)\n        {\n            if (source is T[] array)\n            {\n                return (array, array.Length);\n            }\n\n            var defaultCount = 4;\n            if (source is ICollection<T> coll)\n            {\n                defaultCount = coll.Count;\n                var buffer = new T[defaultCount];\n                coll.CopyTo(buffer, 0);\n                return (buffer, defaultCount);\n            }\n            else if (source is IReadOnlyCollection<T> rcoll)\n            {\n                defaultCount = rcoll.Count;\n            }\n\n            if (defaultCount == 0)\n            {\n                return (Array.Empty<T>(), 0);\n            }\n\n            {\n                var index = 0;\n                var buffer = new T[defaultCount];\n                foreach (var item in source)\n                {\n                    EnsureCapacity(ref buffer, index);\n                    buffer[index++] = item;\n                }\n\n                return (buffer, index);\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Internal/ArrayUtil.cs.uid",
    "content": "uid://crnaoo8cq7ssj\n"
  },
  {
    "path": "addons/GDTask/Internal/ContinuationQueue.cs",
    "content": "﻿using Godot;\nusing System;\nusing System.Threading;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal sealed class ContinuationQueue\n    {\n        const int MaxArrayLength = 0X7FEFFFFF;\n        const int InitialSize = 16;\n\n        readonly PlayerLoopTiming timing;\n\n        SpinLock gate = new SpinLock(false);\n        bool dequing = false;\n\n        int actionListCount = 0;\n        Action[] actionList = new Action[InitialSize];\n\n        int waitingListCount = 0;\n        Action[] waitingList = new Action[InitialSize];\n\n        public ContinuationQueue(PlayerLoopTiming timing)\n        {\n            this.timing = timing;\n        }\n\n        public void Enqueue(Action continuation)\n        {\n            bool lockTaken = false;\n            try\n            {\n                gate.Enter(ref lockTaken);\n\n                if (dequing)\n                {\n                    // Ensure Capacity\n                    if (waitingList.Length == waitingListCount)\n                    {\n                        var newLength = waitingListCount * 2;\n                        if ((uint)newLength > MaxArrayLength) newLength = MaxArrayLength;\n\n                        var newArray = new Action[newLength];\n                        Array.Copy(waitingList, newArray, waitingListCount);\n                        waitingList = newArray;\n                    }\n                    waitingList[waitingListCount] = continuation;\n                    waitingListCount++;\n                }\n                else\n                {\n                    // Ensure Capacity\n                    if (actionList.Length == actionListCount)\n                    {\n                        var newLength = actionListCount * 2;\n                        if ((uint)newLength > MaxArrayLength) newLength = MaxArrayLength;\n\n                        var newArray = new Action[newLength];\n                        Array.Copy(actionList, newArray, actionListCount);\n                        actionList = newArray;\n                    }\n                    actionList[actionListCount] = continuation;\n                    actionListCount++;\n                }\n            }\n            finally\n            {\n                if (lockTaken) gate.Exit(false);\n            }\n        }\n\n        public int Clear()\n        {\n            var rest = actionListCount + waitingListCount;\n\n            actionListCount = 0;\n            actionList = new Action[InitialSize];\n\n            waitingListCount = 0;\n            waitingList = new Action[InitialSize];\n\n            return rest;\n        }\n\n        // delegate entrypoint.\n        public void Run()\n        {\n            // for debugging, create named stacktrace.\n#if DEBUG\n            switch (timing)\n            {\n                case PlayerLoopTiming.PhysicsProcess:\n                    PhysicsProcess();\n                    break;\n                case PlayerLoopTiming.Process:\n                    Process();\n                    break;\n                case PlayerLoopTiming.PausePhysicsProcess:\n                    PausePhysicsProcess();\n                    break;\n                case PlayerLoopTiming.PauseProcess:\n                    PauseProcess();\n                    break;\n            }\n#else\n            RunCore();\n#endif\n        }\n\n        void PhysicsProcess() => RunCore();\n        void Process() => RunCore();\n        void PausePhysicsProcess() => RunCore();\n        void PauseProcess() => RunCore();\n\n        [System.Diagnostics.DebuggerHidden]\n        void RunCore()\n        {\n            {\n                bool lockTaken = false;\n                try\n                {\n                    gate.Enter(ref lockTaken);\n                    if (actionListCount == 0) return;\n                    dequing = true;\n                }\n                finally\n                {\n                    if (lockTaken) gate.Exit(false);\n                }\n            }\n\n            for (int i = 0; i < actionListCount; i++)\n            {\n\n                var action = actionList[i];\n                actionList[i] = null;\n                try\n                {\n                    action();\n                }\n                catch (Exception ex)\n                {\n                    GD.PrintErr(ex);\n                }\n            }\n\n            {\n                bool lockTaken = false;\n                try\n                {\n                    gate.Enter(ref lockTaken);\n                    dequing = false;\n\n                    var swapTempActionList = actionList;\n\n                    actionListCount = waitingListCount;\n                    actionList = waitingList;\n\n                    waitingListCount = 0;\n                    waitingList = swapTempActionList;\n                }\n                finally\n                {\n                    if (lockTaken) gate.Exit(false);\n                }\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Internal/ContinuationQueue.cs.uid",
    "content": "uid://3dipskse2ivi\n"
  },
  {
    "path": "addons/GDTask/Internal/DiagnosticsExtensions.cs",
    "content": "﻿using Godot;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Security;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal static class DiagnosticsExtensions\n    {\n        static bool displayFilenames = true;\n\n        static readonly Regex typeBeautifyRegex = new Regex(\"`.+$\", RegexOptions.Compiled);\n\n        static readonly Dictionary<Type, string> builtInTypeNames = new Dictionary<Type, string>\n        {\n            { typeof(void), \"void\" },\n            { typeof(bool), \"bool\" },\n            { typeof(byte), \"byte\" },\n            { typeof(char), \"char\" },\n            { typeof(decimal), \"decimal\" },\n            { typeof(double), \"double\" },\n            { typeof(float), \"float\" },\n            { typeof(int), \"int\" },\n            { typeof(long), \"long\" },\n            { typeof(object), \"object\" },\n            { typeof(sbyte), \"sbyte\" },\n            { typeof(short), \"short\" },\n            { typeof(string), \"string\" },\n            { typeof(uint), \"uint\" },\n            { typeof(ulong), \"ulong\" },\n            { typeof(ushort), \"ushort\" },\n            { typeof(Task), \"Task\" },\n            { typeof(GDTask), \"GDTask\" },\n            { typeof(GDTaskVoid), \"GDTaskVoid\" }\n        };\n\n\t\t[RequiresUnreferencedCode(\"Calls System.Diagnostics.StackFrame.GetMethod()\")]\n\t\tpublic static string CleanupAsyncStackTrace(this StackTrace stackTrace)\n        {\n            if (stackTrace == null) return \"\";\n\n            var sb = new StringBuilder();\n            for (int i = 0; i < stackTrace.FrameCount; i++)\n            {\n                var sf = stackTrace.GetFrame(i);\n\n                var mb = sf.GetMethod();\n\n                if (IgnoreLine(mb)) continue;\n                if (IsAsync(mb))\n                {\n                    sb.Append(\"async \");\n                    TryResolveStateMachineMethod(ref mb, out var decType);\n                }\n\n                // return type\n                if (mb is MethodInfo mi)\n                {\n                    sb.Append(BeautifyType(mi.ReturnType, false));\n                    sb.Append(\" \");\n                }\n\n                // method name\n                sb.Append(BeautifyType(mb.DeclaringType, false));\n                if (!mb.IsConstructor)\n                {\n                    sb.Append(\".\");\n                }\n                sb.Append(mb.Name);\n                if (mb.IsGenericMethod)\n                {\n                    sb.Append(\"<\");\n                    foreach (var item in mb.GetGenericArguments())\n                    {\n                        sb.Append(BeautifyType(item, true));\n                    }\n                    sb.Append(\">\");\n                }\n\n                // parameter\n                sb.Append(\"(\");\n                sb.Append(string.Join(\", \", mb.GetParameters().Select(p => BeautifyType(p.ParameterType, true) + \" \" + p.Name)));\n                sb.Append(\")\");\n\n                // file name\n                if (displayFilenames && (sf.GetILOffset() != -1))\n                {\n                    String fileName = null;\n\n                    try\n                    {\n                        fileName = sf.GetFileName();\n                    }\n                    catch (NotSupportedException)\n                    {\n                        displayFilenames = false;\n                    }\n                    catch (SecurityException)\n                    {\n                        displayFilenames = false;\n                    }\n\n                    if (fileName != null)\n                    {\n                        sb.Append(' ');\n                        sb.AppendFormat(CultureInfo.InvariantCulture, \"(at {0})\", AppendHyperLink(fileName, sf.GetFileLineNumber().ToString()));\n                    }\n                }\n\n                sb.AppendLine();\n            }\n            return sb.ToString();\n        }\n\n        static bool IsAsync(MethodBase methodInfo)\n        {\n            var declareType = methodInfo.DeclaringType;\n            return typeof(IAsyncStateMachine).IsAssignableFrom(declareType);\n        }\n\n\t\t// code from Ben.Demystifier/EnhancedStackTrace.Frame.cs\n\t\t[RequiresUnreferencedCode(\"Calls System.Type.GetMethods()\")]\n\t\tstatic bool TryResolveStateMachineMethod(ref MethodBase method, out Type declaringType)\n        {\n            declaringType = method.DeclaringType;\n\n            var parentType = declaringType.DeclaringType;\n            if (parentType == null)\n            {\n                return false;\n            }\n\n            var methods = parentType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);\n            if (methods == null)\n            {\n                return false;\n            }\n\n            foreach (var candidateMethod in methods)\n            {\n                var attributes = candidateMethod.GetCustomAttributes<StateMachineAttribute>(false);\n                if (attributes == null)\n                {\n                    continue;\n                }\n\n                foreach (var asma in attributes)\n                {\n                    if (asma.StateMachineType == declaringType)\n                    {\n                        method = candidateMethod;\n                        declaringType = candidateMethod.DeclaringType;\n                        // Mark the iterator as changed; so it gets the + annotation of the original method\n                        // async statemachines resolve directly to their builder methods so aren't marked as changed\n                        return asma is IteratorStateMachineAttribute;\n                    }\n                }\n            }\n\n            return false;\n        }\n\n        static string BeautifyType(Type t, bool shortName)\n        {\n            if (builtInTypeNames.TryGetValue(t, out var builtin))\n            {\n                return builtin;\n            }\n            if (t.IsGenericParameter) return t.Name;\n            if (t.IsArray) return BeautifyType(t.GetElementType(), shortName) + \"[]\";\n            if (t.FullName?.StartsWith(\"System.ValueTuple\") ?? false)\n            {\n                return \"(\" + string.Join(\", \", t.GetGenericArguments().Select(x => BeautifyType(x, true))) + \")\";\n            }\n            if (!t.IsGenericType) return shortName ? t.Name : t.FullName.Replace(\"GDTask.Triggers.\", \"\").Replace(\"GDTask.Internal.\", \"\").Replace(\"GDTask.\", \"\") ?? t.Name;\n\n            var innerFormat = string.Join(\", \", t.GetGenericArguments().Select(x => BeautifyType(x, true)));\n\n            var genericType = t.GetGenericTypeDefinition().FullName;\n            if (genericType == \"System.Threading.Tasks.Task`1\")\n            {\n                genericType = \"Task\";\n            }\n\n            return typeBeautifyRegex.Replace(genericType, \"\").Replace(\"GDTask.Triggers.\", \"\").Replace(\"GDTask.Internal.\", \"\").Replace(\"GDTask.\", \"\") + \"<\" + innerFormat + \">\";\n        }\n\n        static bool IgnoreLine(MethodBase methodInfo)\n        {\n            var declareType = methodInfo.DeclaringType.FullName;\n            if (declareType == \"System.Threading.ExecutionContext\")\n            {\n                return true;\n            }\n            else if (declareType.StartsWith(\"System.Runtime.CompilerServices\"))\n            {\n                return true;\n            }\n            else if (declareType.StartsWith(\"GDTask.CompilerServices\"))\n            {\n                return true;\n            }\n            else if (declareType == \"System.Threading.Tasks.AwaitTaskContinuation\")\n            {\n                return true;\n            }\n            else if (declareType.StartsWith(\"System.Threading.Tasks.Task\"))\n            {\n                return true;\n            }\n            else if (declareType.StartsWith(\"GDTask.GDTaskCompletionSourceCore\"))\n            {\n                return true;\n            }\n            else if (declareType.StartsWith(\"GDTask.AwaiterActions\"))\n            {\n                return true;\n            }\n\n            return false;\n        }\n\n        static string AppendHyperLink(string path, string line)\n        {\n            var fi = new FileInfo(path);\n            if (fi.Directory == null)\n            {\n                return fi.Name;\n            }\n            else\n            {\n                var fname = fi.FullName.Replace(System.IO.Path.DirectorySeparatorChar, '/').Replace(ProjectSettings.GlobalizePath(\"res://\"), \"\");\n                var withAssetsPath = \"Assets/\" + fname;\n                return \"<a href=\\\"\" + withAssetsPath + \"\\\" line=\\\"\" + line + \"\\\">\" + withAssetsPath + \":\" + line + \"</a>\";\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Internal/DiagnosticsExtensions.cs.uid",
    "content": "uid://bjkfwkr6c8kvc\n"
  },
  {
    "path": "addons/GDTask/Internal/Error.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal static class Error\n    {\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void ThrowArgumentNullException<T>(T value, string paramName)\n          where T : class\n        {\n            if (value == null) ThrowArgumentNullExceptionCore(paramName);\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static void ThrowArgumentNullExceptionCore(string paramName)\n        {\n            throw new ArgumentNullException(paramName);\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static Exception ArgumentOutOfRange(string paramName)\n        {\n            return new ArgumentOutOfRangeException(paramName);\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static Exception NoElements()\n        {\n            return new InvalidOperationException(\"Source sequence doesn't contain any elements.\");\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static Exception MoreThanOneElement()\n        {\n            return new InvalidOperationException(\"Source sequence contains more than one element.\");\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        public static void ThrowArgumentException<T>(string message)\n        {\n            throw new ArgumentException(message);\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        public static void ThrowNotYetCompleted()\n        {\n            throw new InvalidOperationException(\"Not yet completed.\");\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        public static T ThrowNotYetCompleted<T>()\n        {\n            throw new InvalidOperationException(\"Not yet completed.\");\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void ThrowWhenContinuationIsAlreadyRegistered<T>(T continuationField)\n          where T : class\n        {\n            if (continuationField != null) ThrowInvalidOperationExceptionCore(\"continuation is already registered.\");\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static void ThrowInvalidOperationExceptionCore(string message)\n        {\n            throw new InvalidOperationException(message);\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        public static void ThrowOperationCanceledException()\n        {\n            throw new OperationCanceledException();\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Internal/Error.cs.uid",
    "content": "uid://bjtes4ac5jptq\n"
  },
  {
    "path": "addons/GDTask/Internal/GodotEqualityComparer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing Godot;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal static class GodotEqualityComparer\n    {\n        public static readonly IEqualityComparer<Vector2> Vector2 = new Vector2EqualityComparer();\n        public static readonly IEqualityComparer<Vector3> Vector3 = new Vector3EqualityComparer();\n        public static readonly IEqualityComparer<Color> Color = new ColorEqualityComparer();\n        public static readonly IEqualityComparer<Rect2> Rect2 = new Rect2EqualityComparer();\n        public static readonly IEqualityComparer<Aabb> AABB = new AABBEqualityComparer();\n        public static readonly IEqualityComparer<Quaternion> Quaternion = new QuatEqualityComparer();\n\n        static readonly RuntimeTypeHandle vector2Type = typeof(Vector2).TypeHandle;\n        static readonly RuntimeTypeHandle vector3Type = typeof(Vector3).TypeHandle;\n        static readonly RuntimeTypeHandle colorType = typeof(Color).TypeHandle;\n        static readonly RuntimeTypeHandle rectType = typeof(Rect2).TypeHandle;\n        static readonly RuntimeTypeHandle AABBType = typeof(Aabb).TypeHandle;\n        static readonly RuntimeTypeHandle quaternionType = typeof(Quaternion).TypeHandle;\n\n        static class Cache<T>\n        {\n            public static readonly IEqualityComparer<T> Comparer;\n\n            static Cache()\n            {\n                var comparer = GetDefaultHelper(typeof(T));\n                if (comparer == null)\n                {\n                    Comparer = EqualityComparer<T>.Default;\n                }\n                else\n                {\n                    Comparer = (IEqualityComparer<T>)comparer;\n                }\n            }\n        }\n\n        public static IEqualityComparer<T> GetDefault<T>()\n        {\n            return Cache<T>.Comparer;\n        }\n\n        static object GetDefaultHelper(Type type)\n        {\n            var t = type.TypeHandle;\n\n            if (t.Equals(vector2Type)) return (object)GodotEqualityComparer.Vector2;\n            if (t.Equals(vector3Type)) return (object)GodotEqualityComparer.Vector3;\n            if (t.Equals(colorType)) return (object)GodotEqualityComparer.Color;\n            if (t.Equals(rectType)) return (object)GodotEqualityComparer.Rect2;\n            if (t.Equals(AABBType)) return (object)GodotEqualityComparer.AABB;\n            if (t.Equals(quaternionType)) return (object)GodotEqualityComparer.Quaternion;\n\n            return null;\n        }\n\n        sealed class Vector2EqualityComparer : IEqualityComparer<Vector2>\n        {\n            public bool Equals(Vector2 self, Vector2 vector)\n            {\n                return self.X.Equals(vector.X) && self.Y.Equals(vector.Y);\n            }\n\n            public int GetHashCode(Vector2 obj)\n            {\n                return obj.X.GetHashCode() ^ obj.Y.GetHashCode() << 2;\n            }\n        }\n\n        sealed class Vector3EqualityComparer : IEqualityComparer<Vector3>\n        {\n            public bool Equals(Vector3 self, Vector3 vector)\n            {\n                return self.X.Equals(vector.X) && self.Y.Equals(vector.Y) && self.Z.Equals(vector.Z);\n            }\n\n            public int GetHashCode(Vector3 obj)\n            {\n                return obj.X.GetHashCode() ^ obj.Y.GetHashCode() << 2 ^ obj.Z.GetHashCode() >> 2;\n            }\n        }\n\n        sealed class ColorEqualityComparer : IEqualityComparer<Color>\n        {\n            public bool Equals(Color self, Color other)\n            {\n                return self.R.Equals(other.R) && self.G.Equals(other.G) && self.B.Equals(other.B) && self.A.Equals(other.A);\n            }\n\n            public int GetHashCode(Color obj)\n            {\n                return obj.R.GetHashCode() ^ obj.G.GetHashCode() << 2 ^ obj.B.GetHashCode() >> 2 ^ obj.A.GetHashCode() >> 1;\n            }\n        }\n\n        sealed class Rect2EqualityComparer : IEqualityComparer<Rect2>\n        {\n            public bool Equals(Rect2 self, Rect2 other)\n            {\n                return self.Size.Equals(other.Size) && self.Position.Equals(other.Position);\n            }\n\n            public int GetHashCode(Rect2 obj)\n            {\n                return obj.Size.GetHashCode() ^ obj.Position.GetHashCode() << 2;\n            }\n        }\n\n        sealed class AABBEqualityComparer : IEqualityComparer<Aabb>\n        {\n            public bool Equals(Aabb self, Aabb vector)\n            {\n                return self.Position.Equals(vector.Position) && self.Size.Equals(vector.Size);\n            }\n\n            public int GetHashCode(Aabb obj)\n            {\n                return obj.Position.GetHashCode() ^ obj.Size.GetHashCode() << 2;\n            }\n        }\n\n        sealed class QuatEqualityComparer : IEqualityComparer<Quaternion>\n        {\n            public bool Equals(Quaternion self, Quaternion vector)\n            {\n                return self.X.Equals(vector.X) && self.Y.Equals(vector.Y) && self.Z.Equals(vector.Z) && self.W.Equals(vector.W);\n            }\n\n            public int GetHashCode(Quaternion obj)\n            {\n                return obj.X.GetHashCode() ^ obj.Y.GetHashCode() << 2 ^ obj.Z.GetHashCode() >> 2 ^ obj.W.GetHashCode() >> 1;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/Internal/GodotEqualityComparer.cs.uid",
    "content": "uid://d21iluoiyuuhs\n"
  },
  {
    "path": "addons/GDTask/Internal/MinimumQueue.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace Fractural.Tasks.Internal\n{\n    // optimized version of Standard Queue<T>.\n    internal class MinimumQueue<T>\n    {\n        const int MinimumGrow = 4;\n        const int GrowFactor = 200;\n\n        T[] array;\n        int head;\n        int tail;\n        int size;\n\n        public MinimumQueue(int capacity)\n        {\n            if (capacity < 0) throw new ArgumentOutOfRangeException(\"capacity\");\n            array = new T[capacity];\n            head = tail = size = 0;\n        }\n\n        public int Count\n        {\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            get { return size; }\n        }\n\n        public T Peek()\n        {\n            if (size == 0) ThrowForEmptyQueue();\n            return array[head];\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void Enqueue(T item)\n        {\n            if (size == array.Length)\n            {\n                Grow();\n            }\n\n            array[tail] = item;\n            MoveNext(ref tail);\n            size++;\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public T Dequeue()\n        {\n            if (size == 0) ThrowForEmptyQueue();\n\n            int head = this.head;\n            T[] array = this.array;\n            T removed = array[head];\n            array[head] = default(T);\n            MoveNext(ref this.head);\n            size--;\n            return removed;\n        }\n\n        void Grow()\n        {\n            int newcapacity = (int)((long)array.Length * (long)GrowFactor / 100);\n            if (newcapacity < array.Length + MinimumGrow)\n            {\n                newcapacity = array.Length + MinimumGrow;\n            }\n            SetCapacity(newcapacity);\n        }\n\n        void SetCapacity(int capacity)\n        {\n            T[] newarray = new T[capacity];\n            if (size > 0)\n            {\n                if (head < tail)\n                {\n                    Array.Copy(array, head, newarray, 0, size);\n                }\n                else\n                {\n                    Array.Copy(array, head, newarray, 0, array.Length - head);\n                    Array.Copy(array, 0, newarray, array.Length - head, tail);\n                }\n            }\n\n            array = newarray;\n            head = 0;\n            tail = (size == capacity) ? 0 : size;\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        void MoveNext(ref int index)\n        {\n            int tmp = index + 1;\n            if (tmp == array.Length)\n            {\n                tmp = 0;\n            }\n            index = tmp;\n        }\n\n        void ThrowForEmptyQueue()\n        {\n            throw new InvalidOperationException(\"EmptyQueue\");\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/Internal/MinimumQueue.cs.uid",
    "content": "uid://rnqnl3ljpcwf\n"
  },
  {
    "path": "addons/GDTask/Internal/PlayerLoopRunner.cs",
    "content": "﻿\nusing Godot;\nusing System;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal sealed class PlayerLoopRunner\n    {\n        const int InitialSize = 16;\n\n        readonly PlayerLoopTiming timing;\n        readonly object runningAndQueueLock = new object();\n        readonly object arrayLock = new object();\n        readonly Action<Exception> unhandledExceptionCallback;\n\n        int tail = 0;\n        bool running = false;\n        IPlayerLoopItem[] loopItems = new IPlayerLoopItem[InitialSize];\n        MinimumQueue<IPlayerLoopItem> waitQueue = new MinimumQueue<IPlayerLoopItem>(InitialSize);\n\n\n\n        public PlayerLoopRunner(PlayerLoopTiming timing)\n        {\n            this.unhandledExceptionCallback = ex => GD.PrintErr(ex);\n            this.timing = timing;\n        }\n\n        public void AddAction(IPlayerLoopItem item)\n        {\n            lock (runningAndQueueLock)\n            {\n                if (running)\n                {\n                    waitQueue.Enqueue(item);\n                    return;\n                }\n            }\n\n            lock (arrayLock)\n            {\n                // Ensure Capacity\n                if (loopItems.Length == tail)\n                {\n                    Array.Resize(ref loopItems, checked(tail * 2));\n                }\n                loopItems[tail++] = item;\n            }\n        }\n\n        public int Clear()\n        {\n            lock (arrayLock)\n            {\n                var rest = 0;\n\n                for (var index = 0; index < loopItems.Length; index++)\n                {\n                    if (loopItems[index] != null)\n                    {\n                        rest++;\n                    }\n\n                    loopItems[index] = null;\n                }\n\n                tail = 0;\n                return rest;\n            }\n        }\n\n        // delegate entrypoint.\n        public void Run()\n        {\n            // for debugging, create named stacktrace.\n#if DEBUG\n            switch (timing)\n            {\n                case PlayerLoopTiming.PhysicsProcess:\n                    PhysicsProcess();\n                    break;\n                case PlayerLoopTiming.Process:\n                    Process();\n                    break;\n                case PlayerLoopTiming.PausePhysicsProcess:\n                    PausePhysicsProcess();\n                    break;\n                case PlayerLoopTiming.PauseProcess:\n                    PauseProcess();\n                    break;\n            }\n#else\n            RunCore();\n#endif\n        }\n\n        void PhysicsProcess() => RunCore();\n        void Process() => RunCore();\n        void PausePhysicsProcess() => RunCore();\n        void PauseProcess() => RunCore();\n\n\n        [System.Diagnostics.DebuggerHidden]\n        void RunCore()\n        {\n            lock (runningAndQueueLock)\n            {\n                running = true;\n            }\n\n            lock (arrayLock)\n            {\n                var j = tail - 1;\n\n                for (int i = 0; i < loopItems.Length; i++)\n                {\n                    var action = loopItems[i];\n                    if (action != null)\n                    {\n                        try\n                        {\n                            if (!action.MoveNext())\n                            {\n                                loopItems[i] = null;\n                            }\n                            else\n                            {\n                                continue; // next i \n                            }\n                        }\n                        catch (Exception ex)\n                        {\n                            loopItems[i] = null;\n                            try\n                            {\n                                unhandledExceptionCallback(ex);\n                            }\n                            catch { }\n                        }\n                    }\n\n                    // find null, loop from tail\n                    while (i < j)\n                    {\n                        var fromTail = loopItems[j];\n                        if (fromTail != null)\n                        {\n                            try\n                            {\n                                if (!fromTail.MoveNext())\n                                {\n                                    loopItems[j] = null;\n                                    j--;\n                                    continue; // next j\n                                }\n                                else\n                                {\n                                    // swap\n                                    loopItems[i] = fromTail;\n                                    loopItems[j] = null;\n                                    j--;\n                                    goto NEXT_LOOP; // next i\n                                }\n                            }\n                            catch (Exception ex)\n                            {\n                                loopItems[j] = null;\n                                j--;\n                                try\n                                {\n                                    unhandledExceptionCallback(ex);\n                                }\n                                catch { }\n                                continue; // next j\n                            }\n                        }\n                        else\n                        {\n                            j--;\n                        }\n                    }\n\n                    tail = i; // loop end\n                    break; // LOOP END\n\n                    NEXT_LOOP:\n                    continue;\n                }\n\n\n                lock (runningAndQueueLock)\n                {\n                    running = false;\n                    while (waitQueue.Count != 0)\n                    {\n                        if (loopItems.Length == tail)\n                        {\n                            Array.Resize(ref loopItems, checked(tail * 2));\n                        }\n                        loopItems[tail++] = waitQueue.Dequeue();\n                    }\n                }\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Internal/PlayerLoopRunner.cs.uid",
    "content": "uid://bdt7g64ag4g80\n"
  },
  {
    "path": "addons/GDTask/Internal/PooledDelegate.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal sealed class PooledDelegate<T> : ITaskPoolNode<PooledDelegate<T>>\n    {\n        static TaskPool<PooledDelegate<T>> pool;\n\n        PooledDelegate<T> nextNode;\n        public ref PooledDelegate<T> NextNode => ref nextNode;\n\n        static PooledDelegate()\n        {\n            TaskPool.RegisterSizeGetter(typeof(PooledDelegate<T>), () => pool.Size);\n        }\n\n        readonly Action<T> runDelegate;\n        Action continuation;\n\n        PooledDelegate()\n        {\n            runDelegate = Run;\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static Action<T> Create(Action continuation)\n        {\n            if (!pool.TryPop(out var item))\n            {\n                item = new PooledDelegate<T>();\n            }\n\n            item.continuation = continuation;\n            return item.runDelegate;\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        void Run(T _)\n        {\n            var call = continuation;\n            continuation = null;\n            if (call != null)\n            {\n                pool.TryPush(this);\n                call.Invoke();\n            }\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/Internal/PooledDelegate.cs.uid",
    "content": "uid://3cwmhk0uegmf\n"
  },
  {
    "path": "addons/GDTask/Internal/RuntimeHelpersAbstraction.cs",
    "content": "﻿using Godot;\nusing System;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal static class RuntimeHelpersAbstraction\n    {\n        // If we can use RuntimeHelpers.IsReferenceOrContainsReferences(.NET Core 2.0), use it.\n        public static bool IsWellKnownNoReferenceContainsType<T>()\n        {\n            return WellKnownNoReferenceContainsType<T>.IsWellKnownType;\n        }\n\n        static bool WellKnownNoReferenceContainsTypeInitialize(Type t)\n        {\n            // The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single.\n            if (t.IsPrimitive) return true;\n\n            if (t.IsEnum) return true;\n            if (t == typeof(DateTime)) return true;\n            if (t == typeof(DateTimeOffset)) return true;\n            if (t == typeof(Guid)) return true;\n            if (t == typeof(decimal)) return true;\n\n            // unwrap nullable\n            if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))\n            {\n                return WellKnownNoReferenceContainsTypeInitialize(t.GetGenericArguments()[0]);\n            }\n\n            // or add other wellknown types(Vector, etc...) here\n            if (t == typeof(Vector2)) return true;\n            if (t == typeof(Vector3)) return true;\n            if (t == typeof(Color)) return true;\n            if (t == typeof(Rect2)) return true;\n            if (t == typeof(Aabb)) return true;\n            if (t == typeof(Quaternion)) return true;\n\n            return false;\n        }\n\n        static class WellKnownNoReferenceContainsType<T>\n        {\n            public static readonly bool IsWellKnownType;\n\n            static WellKnownNoReferenceContainsType()\n            {\n                IsWellKnownType = WellKnownNoReferenceContainsTypeInitialize(typeof(T));\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Internal/RuntimeHelpersAbstraction.cs.uid",
    "content": "uid://bgae6k48sphuc\n"
  },
  {
    "path": "addons/GDTask/Internal/StatePool.cs",
    "content": "﻿using System;\nusing System.Collections.Concurrent;\nusing System.Runtime.CompilerServices;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal static class StateTuple\n    {\n        public static StateTuple<T1> Create<T1>(T1 item1)\n        {\n            return StatePool<T1>.Create(item1);\n        }\n\n        public static StateTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)\n        {\n            return StatePool<T1, T2>.Create(item1, item2);\n        }\n\n        public static StateTuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)\n        {\n            return StatePool<T1, T2, T3>.Create(item1, item2, item3);\n        }\n    }\n\n    internal class StateTuple<T1> : IDisposable\n    {\n        public T1 Item1;\n\n        public void Deconstruct(out T1 item1)\n        {\n            item1 = this.Item1;\n        }\n\n        public void Dispose()\n        {\n            StatePool<T1>.Return(this);\n        }\n    }\n\n    internal static class StatePool<T1>\n    {\n        static readonly ConcurrentQueue<StateTuple<T1>> queue = new ConcurrentQueue<StateTuple<T1>>();\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static StateTuple<T1> Create(T1 item1)\n        {\n            if (queue.TryDequeue(out var value))\n            {\n                value.Item1 = item1;\n                return value;\n            }\n\n            return new StateTuple<T1> { Item1 = item1 };\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void Return(StateTuple<T1> tuple)\n        {\n            tuple.Item1 = default;\n            queue.Enqueue(tuple);\n        }\n    }\n\n    internal class StateTuple<T1, T2> : IDisposable\n    {\n        public T1 Item1;\n        public T2 Item2;\n\n        public void Deconstruct(out T1 item1, out T2 item2)\n        {\n            item1 = this.Item1;\n            item2 = this.Item2;\n        }\n\n        public void Dispose()\n        {\n            StatePool<T1, T2>.Return(this);\n        }\n    }\n\n    internal static class StatePool<T1, T2>\n    {\n        static readonly ConcurrentQueue<StateTuple<T1, T2>> queue = new ConcurrentQueue<StateTuple<T1, T2>>();\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static StateTuple<T1, T2> Create(T1 item1, T2 item2)\n        {\n            if (queue.TryDequeue(out var value))\n            {\n                value.Item1 = item1;\n                value.Item2 = item2;\n                return value;\n            }\n\n            return new StateTuple<T1, T2> { Item1 = item1, Item2 = item2 };\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void Return(StateTuple<T1, T2> tuple)\n        {\n            tuple.Item1 = default;\n            tuple.Item2 = default;\n            queue.Enqueue(tuple);\n        }\n    }\n\n    internal class StateTuple<T1, T2, T3> : IDisposable\n    {\n        public T1 Item1;\n        public T2 Item2;\n        public T3 Item3;\n\n        public void Deconstruct(out T1 item1, out T2 item2, out T3 item3)\n        {\n            item1 = this.Item1;\n            item2 = this.Item2;\n            item3 = this.Item3;\n        }\n\n        public void Dispose()\n        {\n            StatePool<T1, T2, T3>.Return(this);\n        }\n    }\n\n    internal static class StatePool<T1, T2, T3>\n    {\n        static readonly ConcurrentQueue<StateTuple<T1, T2, T3>> queue = new ConcurrentQueue<StateTuple<T1, T2, T3>>();\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static StateTuple<T1, T2, T3> Create(T1 item1, T2 item2, T3 item3)\n        {\n            if (queue.TryDequeue(out var value))\n            {\n                value.Item1 = item1;\n                value.Item2 = item2;\n                value.Item3 = item3;\n                return value;\n            }\n\n            return new StateTuple<T1, T2, T3> { Item1 = item1, Item2 = item2, Item3 = item3 };\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void Return(StateTuple<T1, T2, T3> tuple)\n        {\n            tuple.Item1 = default;\n            tuple.Item2 = default;\n            tuple.Item3 = default;\n            queue.Enqueue(tuple);\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/Internal/StatePool.cs.uid",
    "content": "uid://b78klpwf2ukw8\n"
  },
  {
    "path": "addons/GDTask/Internal/TaskTracker.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Text;\nusing System.Threading;\nusing Fractural.Tasks.Internal;\n\nnamespace Fractural.Tasks\n{\n    // public for add user custom.\n\n    public static class TaskTracker\n    {\n        // TODO: Work on task tracker after getting tasks functioning\n#if DEBUG\n\n        static int trackingId = 0;\n\n        public const string EnableAutoReloadKey = \"GDTaskTrackerWindow_EnableAutoReloadKey\";\n        public const string EnableTrackingKey = \"GDTaskTrackerWindow_EnableTrackingKey\";\n        public const string EnableStackTraceKey = \"GDTaskTrackerWindow_EnableStackTraceKey\";\n\n        public static class EditorEnableState\n        {\n            static bool enableAutoReload;\n            public static bool EnableAutoReload\n            {\n                get { return enableAutoReload; }\n                set\n                {\n                    enableAutoReload = value;\n                    //UnityEditor.EditorPrefs.SetBool(EnableAutoReloadKey, value);\n                }\n            }\n\n            static bool enableTracking;\n            public static bool EnableTracking\n            {\n                get { return enableTracking; }\n                set\n                {\n                    enableTracking = value;\n                    //UnityEditor.EditorPrefs.SetBool(EnableTrackingKey, value);\n                }\n            }\n\n            static bool enableStackTrace;\n            public static bool EnableStackTrace\n            {\n                get { return enableStackTrace; }\n                set\n                {\n                    enableStackTrace = value;\n                    //UnityEditor.EditorPrefs.SetBool(EnableStackTraceKey, value);\n                }\n            }\n        }\n\n#endif\n\n\n        static List<KeyValuePair<IGDTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)>> listPool = new List<KeyValuePair<IGDTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)>>();\n\n        static readonly WeakDictionary<IGDTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)> tracking = new WeakDictionary<IGDTaskSource, (string formattedType, int trackingId, DateTime addTime, string stackTrace)>();\n\n        [Conditional(\"DEBUG\")]\n        public static void TrackActiveTask(IGDTaskSource task, int skipFrame)\n        {\n#if DEBUG\n            dirty = true;\n            if (!EditorEnableState.EnableTracking) return;\n            var stackTrace = EditorEnableState.EnableStackTrace ? new StackTrace(skipFrame, true).CleanupAsyncStackTrace() : \"\";\n\n            string typeName;\n            if (EditorEnableState.EnableStackTrace)\n            {\n                var sb = new StringBuilder();\n                TypeBeautify(task.GetType(), sb);\n                typeName = sb.ToString();\n            }\n            else\n            {\n                typeName = task.GetType().Name;\n            }\n            tracking.TryAdd(task, (typeName, Interlocked.Increment(ref trackingId), DateTime.UtcNow, stackTrace));\n#endif\n        }\n\n        [Conditional(\"DEBUG\")]\n        public static void RemoveTracking(IGDTaskSource task)\n        {\n#if DEBUG\n            dirty = true;\n            if (!EditorEnableState.EnableTracking) return;\n            var success = tracking.TryRemove(task);\n#endif\n        }\n\n        static bool dirty;\n\n        public static bool CheckAndResetDirty()\n        {\n            var current = dirty;\n            dirty = false;\n            return current;\n        }\n\n        /// <summary>(trackingId, awaiterType, awaiterStatus, createdTime, stackTrace)</summary>\n        public static void ForEachActiveTask(Action<int, string, GDTaskStatus, DateTime, string> action)\n        {\n            lock (listPool)\n            {\n                var count = tracking.ToList(ref listPool, clear: false);\n                try\n                {\n                    for (int i = 0; i < count; i++)\n                    {\n                        action(listPool[i].Value.trackingId, listPool[i].Value.formattedType, listPool[i].Key.UnsafeGetStatus(), listPool[i].Value.addTime, listPool[i].Value.stackTrace);\n                        listPool[i] = default;\n                    }\n                }\n                catch\n                {\n                    listPool.Clear();\n                    throw;\n                }\n            }\n        }\n\n        static void TypeBeautify(Type type, StringBuilder sb)\n        {\n            if (type.IsNested)\n            {\n                // TypeBeautify(type.DeclaringType, sb);\n                sb.Append(type.DeclaringType.Name.ToString());\n                sb.Append(\".\");\n            }\n\n            if (type.IsGenericType)\n            {\n                var genericsStart = type.Name.IndexOf(\"`\");\n                if (genericsStart != -1)\n                {\n                    sb.Append(type.Name.Substring(0, genericsStart));\n                }\n                else\n                {\n                    sb.Append(type.Name);\n                }\n                sb.Append(\"<\");\n                var first = true;\n                foreach (var item in type.GetGenericArguments())\n                {\n                    if (!first)\n                    {\n                        sb.Append(\", \");\n                    }\n                    first = false;\n                    TypeBeautify(item, sb);\n                }\n                sb.Append(\">\");\n            }\n            else\n            {\n                sb.Append(type.Name);\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Internal/TaskTracker.cs.uid",
    "content": "uid://bh1b5djnsdg4a\n"
  },
  {
    "path": "addons/GDTask/Internal/ValueStopwatch.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\n\nnamespace Fractural.Tasks.Internal\n{\n    internal readonly struct ValueStopwatch\n    {\n        static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency;\n\n        readonly long startTimestamp;\n\n        public static ValueStopwatch StartNew() => new ValueStopwatch(Stopwatch.GetTimestamp());\n\n        ValueStopwatch(long startTimestamp)\n        {\n            this.startTimestamp = startTimestamp;\n        }\n\n        public TimeSpan Elapsed => TimeSpan.FromTicks(this.ElapsedTicks);\n\n        public bool IsInvalid => startTimestamp == 0;\n\n        public long ElapsedTicks\n        {\n            get\n            {\n                if (startTimestamp == 0)\n                {\n                    throw new InvalidOperationException(\"Detected invalid initialization(use 'default'), only to create from StartNew().\");\n                }\n\n                var delta = Stopwatch.GetTimestamp() - startTimestamp;\n                return (long)(delta * TimestampToTicks);\n            }\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/Internal/ValueStopwatch.cs.uid",
    "content": "uid://d00mtr4i7w6iy\n"
  },
  {
    "path": "addons/GDTask/Internal/WeakDictionary.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading;\n\nnamespace Fractural.Tasks.Internal\n{\n    // Add, Remove, Enumerate with sweep. All operations are thread safe(in spinlock).\n    internal class WeakDictionary<TKey, TValue>\n        where TKey : class\n    {\n        Entry[] buckets;\n        int size;\n        SpinLock gate; // mutable struct(not readonly)\n\n        readonly float loadFactor;\n        readonly IEqualityComparer<TKey> keyEqualityComparer;\n\n        public WeakDictionary(int capacity = 4, float loadFactor = 0.75f, IEqualityComparer<TKey> keyComparer = null)\n        {\n            var tableSize = CalculateCapacity(capacity, loadFactor);\n            this.buckets = new Entry[tableSize];\n            this.loadFactor = loadFactor;\n            this.gate = new SpinLock(false);\n            this.keyEqualityComparer = keyComparer ?? EqualityComparer<TKey>.Default;\n        }\n\n        public bool TryAdd(TKey key, TValue value)\n        {\n            bool lockTaken = false;\n            try\n            {\n                gate.Enter(ref lockTaken);\n                return TryAddInternal(key, value);\n            }\n            finally\n            {\n                if (lockTaken) gate.Exit(false);\n            }\n        }\n\n        public bool TryGetValue(TKey key, out TValue value)\n        {\n            bool lockTaken = false;\n            try\n            {\n                gate.Enter(ref lockTaken);\n                if (TryGetEntry(key, out _, out var entry))\n                {\n                    value = entry.Value;\n                    return true;\n                }\n\n                value = default(TValue);\n                return false;\n            }\n            finally\n            {\n                if (lockTaken) gate.Exit(false);\n            }\n        }\n\n        public bool TryRemove(TKey key)\n        {\n            bool lockTaken = false;\n            try\n            {\n                gate.Enter(ref lockTaken);\n                if (TryGetEntry(key, out var hashIndex, out var entry))\n                {\n                    Remove(hashIndex, entry);\n                    return true;\n                }\n\n                return false;\n            }\n            finally\n            {\n                if (lockTaken) gate.Exit(false);\n            }\n        }\n\n        bool TryAddInternal(TKey key, TValue value)\n        {\n            var nextCapacity = CalculateCapacity(size + 1, loadFactor);\n\n            TRY_ADD_AGAIN:\n            if (buckets.Length < nextCapacity)\n            {\n                // rehash\n                var nextBucket = new Entry[nextCapacity];\n                for (int i = 0; i < buckets.Length; i++)\n                {\n                    var e = buckets[i];\n                    while (e != null)\n                    {\n                        AddToBuckets(nextBucket, key, e.Value, e.Hash);\n                        e = e.Next;\n                    }\n                }\n\n                buckets = nextBucket;\n                goto TRY_ADD_AGAIN;\n            }\n            else\n            {\n                // add entry\n                var successAdd = AddToBuckets(buckets, key, value, keyEqualityComparer.GetHashCode(key));\n                if (successAdd) size++;\n                return successAdd;\n            }\n        }\n\n        bool AddToBuckets(Entry[] targetBuckets, TKey newKey, TValue value, int keyHash)\n        {\n            var h = keyHash;\n            var hashIndex = h & (targetBuckets.Length - 1);\n\n            TRY_ADD_AGAIN:\n            if (targetBuckets[hashIndex] == null)\n            {\n                targetBuckets[hashIndex] = new Entry\n                {\n                    Key = new WeakReference<TKey>(newKey, false),\n                    Value = value,\n                    Hash = h\n                };\n\n                return true;\n            }\n            else\n            {\n                // add to last.\n                var entry = targetBuckets[hashIndex];\n                while (entry != null)\n                {\n                    if (entry.Key.TryGetTarget(out var target))\n                    {\n                        if (keyEqualityComparer.Equals(newKey, target))\n                        {\n                            return false; // duplicate\n                        }\n                    }\n                    else\n                    {\n                        Remove(hashIndex, entry);\n                        if (targetBuckets[hashIndex] == null) goto TRY_ADD_AGAIN; // add new entry\n                    }\n\n                    if (entry.Next != null)\n                    {\n                        entry = entry.Next;\n                    }\n                    else\n                    {\n                        // found last\n                        entry.Next = new Entry\n                        {\n                            Key = new WeakReference<TKey>(newKey, false),\n                            Value = value,\n                            Hash = h\n                        };\n                        entry.Next.Prev = entry;\n                    }\n                }\n\n                return false;\n            }\n        }\n\n        bool TryGetEntry(TKey key, out int hashIndex, out Entry entry)\n        {\n            var table = buckets;\n            var hash = keyEqualityComparer.GetHashCode(key);\n            hashIndex = hash & table.Length - 1;\n            entry = table[hashIndex];\n\n            while (entry != null)\n            {\n                if (entry.Key.TryGetTarget(out var target))\n                {\n                    if (keyEqualityComparer.Equals(key, target))\n                    {\n                        return true;\n                    }\n                }\n                else\n                {\n                    // sweap\n                    Remove(hashIndex, entry);\n                }\n\n                entry = entry.Next;\n            }\n\n            return false;\n        }\n\n        void Remove(int hashIndex, Entry entry)\n        {\n            if (entry.Prev == null && entry.Next == null)\n            {\n                buckets[hashIndex] = null;\n            }\n            else\n            {\n                if (entry.Prev == null)\n                {\n                    buckets[hashIndex] = entry.Next;\n                }\n                if (entry.Prev != null)\n                {\n                    entry.Prev.Next = entry.Next;\n                }\n                if (entry.Next != null)\n                {\n                    entry.Next.Prev = entry.Prev;\n                }\n            }\n            size--;\n        }\n\n        public List<KeyValuePair<TKey, TValue>> ToList()\n        {\n            var list = new List<KeyValuePair<TKey, TValue>>(size);\n            ToList(ref list, false);\n            return list;\n        }\n\n        // avoid allocate everytime.\n        public int ToList(ref List<KeyValuePair<TKey, TValue>> list, bool clear = true)\n        {\n            if (clear)\n            {\n                list.Clear();\n            }\n\n            var listIndex = 0;\n\n            bool lockTaken = false;\n            try\n            {\n                for (int i = 0; i < buckets.Length; i++)\n                {\n                    var entry = buckets[i];\n                    while (entry != null)\n                    {\n                        if (entry.Key.TryGetTarget(out var target))\n                        {\n                            var item = new KeyValuePair<TKey, TValue>(target, entry.Value);\n                            if (listIndex < list.Count)\n                            {\n                                list[listIndex++] = item;\n                            }\n                            else\n                            {\n                                list.Add(item);\n                                listIndex++;\n                            }\n                        }\n                        else\n                        {\n                            // sweap\n                            Remove(i, entry);\n                        }\n\n                        entry = entry.Next;\n                    }\n                }\n            }\n            finally\n            {\n                if (lockTaken) gate.Exit(false);\n            }\n\n            return listIndex;\n        }\n\n        static int CalculateCapacity(int collectionSize, float loadFactor)\n        {\n            var size = (int)(((float)collectionSize) / loadFactor);\n\n            size--;\n            size |= size >> 1;\n            size |= size >> 2;\n            size |= size >> 4;\n            size |= size >> 8;\n            size |= size >> 16;\n            size += 1;\n\n            if (size < 8)\n            {\n                size = 8;\n            }\n            return size;\n        }\n\n        class Entry\n        {\n            public WeakReference<TKey> Key;\n            public TValue Value;\n            public int Hash;\n            public Entry Prev;\n            public Entry Next;\n\n            // debug only\n            public override string ToString()\n            {\n                if (Key.TryGetTarget(out var target))\n                {\n                    return target + \"(\" + Count() + \")\";\n                }\n                else\n                {\n                    return \"(Dead)\";\n                }\n            }\n\n            int Count()\n            {\n                var count = 1;\n                var n = this;\n                while (n.Next != null)\n                {\n                    count++;\n                    n = n.Next;\n                }\n                return count;\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Internal/WeakDictionary.cs.uid",
    "content": "uid://lxeiwcolu8kh\n"
  },
  {
    "path": "addons/GDTask/MoveNextSource.cs",
    "content": "﻿using System;\n\nnamespace Fractural.Tasks\n{\n    public abstract class MoveNextSource : IGDTaskSource<bool>\n    {\n        protected GDTaskCompletionSourceCore<bool> completionSource;\n\n        public bool GetResult(short token)\n        {\n            return completionSource.GetResult(token);\n        }\n\n        public GDTaskStatus GetStatus(short token)\n        {\n            return completionSource.GetStatus(token);\n        }\n\n        public void OnCompleted(Action<object> continuation, object state, short token)\n        {\n            completionSource.OnCompleted(continuation, state, token);\n        }\n\n        public GDTaskStatus UnsafeGetStatus()\n        {\n            return completionSource.UnsafeGetStatus();\n        }\n\n        void IGDTaskSource.GetResult(short token)\n        {\n            completionSource.GetResult(token);\n        }\n\n        protected bool TryGetResult<T>(GDTask<T>.Awaiter awaiter, out T result)\n        {\n            try\n            {\n                result = awaiter.GetResult();\n                return true;\n            }\n            catch (Exception ex)\n            {\n                completionSource.TrySetException(ex);\n                result = default;\n                return false;\n            }\n        }\n\n        protected bool TryGetResult(GDTask.Awaiter awaiter)\n        {\n            try\n            {\n                awaiter.GetResult();\n                return true;\n            }\n            catch (Exception ex)\n            {\n                completionSource.TrySetException(ex);\n                return false;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/MoveNextSource.cs.uid",
    "content": "uid://cgp3ccsb34h84\n"
  },
  {
    "path": "addons/GDTask/PlayerLoopTimer.cs",
    "content": "﻿using System.Threading;\nusing System;\nusing Fractural.Tasks.Internal;\nusing Godot;\n\nnamespace Fractural.Tasks\n{\n    public abstract class PlayerLoopTimer : IDisposable, IPlayerLoopItem\n    {\n        readonly CancellationToken cancellationToken;\n        readonly Action<object> timerCallback;\n        readonly object state;\n        readonly PlayerLoopTiming playerLoopTiming;\n        readonly bool periodic;\n\n        bool isRunning;\n        bool tryStop;\n        bool isDisposed;\n\n        protected PlayerLoopTimer(bool periodic, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action<object> timerCallback, object state)\n        {\n            this.periodic = periodic;\n            this.playerLoopTiming = playerLoopTiming;\n            this.cancellationToken = cancellationToken;\n            this.timerCallback = timerCallback;\n            this.state = state;\n        }\n\n        public static PlayerLoopTimer Create(TimeSpan interval, bool periodic, DelayType delayType, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action<object> timerCallback, object state)\n        {\n#if DEBUG\n            // force use Realtime.\n            if (GDTaskPlayerLoopAutoload.IsMainThread && Engine.IsEditorHint())\n            {\n                delayType = DelayType.Realtime;\n            }\n#endif\n\n            switch (delayType)\n            {\n                case DelayType.Realtime:\n                    return new RealtimePlayerLoopTimer(interval, periodic, playerLoopTiming, cancellationToken, timerCallback, state);\n                case DelayType.DeltaTime:\n                default:\n                    return new DeltaTimePlayerLoopTimer(interval, periodic, playerLoopTiming, cancellationToken, timerCallback, state);\n            }\n        }\n\n        public static PlayerLoopTimer StartNew(TimeSpan interval, bool periodic, DelayType delayType, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action<object> timerCallback, object state)\n        {\n            var timer = Create(interval, periodic, delayType, playerLoopTiming, cancellationToken, timerCallback, state);\n            timer.Restart();\n            return timer;\n        }\n\n        /// <summary>\n        /// Restart(Reset and Start) timer.\n        /// </summary>\n        public void Restart()\n        {\n            if (isDisposed) throw new ObjectDisposedException(null);\n\n            ResetCore(null); // init state\n            if (!isRunning)\n            {\n                isRunning = true;\n                GDTaskPlayerLoopAutoload.AddAction(playerLoopTiming, this);\n            }\n            tryStop = false;\n        }\n\n        /// <summary>\n        /// Restart(Reset and Start) and change interval.\n        /// </summary>\n        public void Restart(TimeSpan interval)\n        {\n            if (isDisposed) throw new ObjectDisposedException(null);\n\n            ResetCore(interval); // init state\n            if (!isRunning)\n            {\n                isRunning = true;\n                GDTaskPlayerLoopAutoload.AddAction(playerLoopTiming, this);\n            }\n            tryStop = false;\n        }\n\n        /// <summary>\n        /// Stop timer.\n        /// </summary>\n        public void Stop()\n        {\n            tryStop = true;\n        }\n\n        protected abstract void ResetCore(TimeSpan? newInterval);\n\n        public void Dispose()\n        {\n            isDisposed = true;\n        }\n\n        bool IPlayerLoopItem.MoveNext()\n        {\n            if (isDisposed)\n            {\n                isRunning = false;\n                return false;\n            }\n            if (tryStop)\n            {\n                isRunning = false;\n                return false;\n            }\n            if (cancellationToken.IsCancellationRequested)\n            {\n                isRunning = false;\n                return false;\n            }\n\n            if (!MoveNextCore())\n            {\n                timerCallback(state);\n\n                if (periodic)\n                {\n                    ResetCore(null);\n                    return true;\n                }\n                else\n                {\n                    isRunning = false;\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        protected abstract bool MoveNextCore();\n    }\n\n    sealed class DeltaTimePlayerLoopTimer : PlayerLoopTimer\n    {\n        bool isMainThread;\n        ulong initialFrame;\n        double elapsed;\n        double interval;\n\n        public DeltaTimePlayerLoopTimer(TimeSpan interval, bool periodic, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action<object> timerCallback, object state)\n            : base(periodic, playerLoopTiming, cancellationToken, timerCallback, state)\n        {\n            ResetCore(interval);\n        }\n\n        protected override bool MoveNextCore()\n        {\n            if (elapsed == 0.0)\n            {\n                if (isMainThread && initialFrame == Engine.GetProcessFrames())\n                {\n                    return true;\n                }\n            }\n\n            elapsed += GDTaskPlayerLoopAutoload.Global.DeltaTime;\n            if (elapsed >= interval)\n            {\n                return false;\n            }\n\n            return true;\n        }\n\n        protected override void ResetCore(TimeSpan? interval)\n        {\n            this.elapsed = 0.0;\n            this.isMainThread = GDTaskPlayerLoopAutoload.IsMainThread;\n            if (this.isMainThread)\n                this.initialFrame = Engine.GetProcessFrames();\n            if (interval != null)\n            {\n                this.interval = (float)interval.Value.TotalSeconds;\n            }\n        }\n    }\n\n    sealed class RealtimePlayerLoopTimer : PlayerLoopTimer\n    {\n        ValueStopwatch stopwatch;\n        long intervalTicks;\n\n        public RealtimePlayerLoopTimer(TimeSpan interval, bool periodic, PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken, Action<object> timerCallback, object state)\n            : base(periodic, playerLoopTiming, cancellationToken, timerCallback, state)\n        {\n            ResetCore(interval);\n        }\n\n        protected override bool MoveNextCore()\n        {\n            if (stopwatch.ElapsedTicks >= intervalTicks)\n            {\n                return false;\n            }\n\n            return true;\n        }\n\n        protected override void ResetCore(TimeSpan? interval)\n        {\n            this.stopwatch = ValueStopwatch.StartNew();\n            if (interval != null)\n            {\n                this.intervalTicks = interval.Value.Ticks;\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/PlayerLoopTimer.cs.uid",
    "content": "uid://b4eesv08kira4\n"
  },
  {
    "path": "addons/GDTask/Progress.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing Fractural.Tasks.Internal;\n\nnamespace Fractural.Tasks\n{\n    /// <summary>\n    /// Lightweight IProgress[T] factory.\n    /// </summary>\n    public static class Progress\n    {\n        public static IProgress<T> Create<T>(Action<T> handler)\n        {\n            if (handler == null) return NullProgress<T>.Instance;\n            return new AnonymousProgress<T>(handler);\n        }\n\n        public static IProgress<T> CreateOnlyValueChanged<T>(Action<T> handler, IEqualityComparer<T> comparer = null)\n        {\n            if (handler == null) return NullProgress<T>.Instance;\n            return new OnlyValueChangedProgress<T>(handler, comparer ?? GodotEqualityComparer.GetDefault<T>());\n        }\n\n        sealed class NullProgress<T> : IProgress<T>\n        {\n            public static readonly IProgress<T> Instance = new NullProgress<T>();\n\n            NullProgress()\n            {\n\n            }\n\n            public void Report(T value)\n            {\n            }\n        }\n\n        sealed class AnonymousProgress<T> : IProgress<T>\n        {\n            readonly Action<T> action;\n\n            public AnonymousProgress(Action<T> action)\n            {\n                this.action = action;\n            }\n\n            public void Report(T value)\n            {\n                action(value);\n            }\n        }\n\n        sealed class OnlyValueChangedProgress<T> : IProgress<T>\n        {\n            readonly Action<T> action;\n            readonly IEqualityComparer<T> comparer;\n            bool isFirstCall;\n            T latestValue;\n\n            public OnlyValueChangedProgress(Action<T> action, IEqualityComparer<T> comparer)\n            {\n                this.action = action;\n                this.comparer = comparer;\n                this.isFirstCall = true;\n            }\n\n            public void Report(T value)\n            {\n                if (isFirstCall)\n                {\n                    isFirstCall = false;\n                }\n                else if (comparer.Equals(value, latestValue))\n                {\n                    return;\n                }\n\n                latestValue = value;\n                action(value);\n            }\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/Progress.cs.uid",
    "content": "uid://bfx26j01offgd\n"
  },
  {
    "path": "addons/GDTask/TaskPool.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace Fractural.Tasks\n{\n    // Taken from GDTask library\n    // Holds static data about all task pools. Right now this is just the size of each pool.\n    public static class TaskPool\n    {\n        internal static int MaxPoolSize;\n\n        // Avoid to use ConcurrentDictionary for safety of WebGL build.\n        static Dictionary<Type, Func<int>> sizes = new Dictionary<Type, Func<int>>();\n\n        static TaskPool()\n        {\n            try\n            {\n                // Pulls from environment, although Godot doesn't support passing env vars, \n                // so maybe delete this?\n                var value = Environment.GetEnvironmentVariable(\"GDTASK_MAX_POOLSIZE\");\n                if (value != null)\n                {\n                    if (int.TryParse(value, out var size))\n                    {\n                        MaxPoolSize = size;\n                        return;\n                    }\n                }\n            }\n            catch { }\n\n            MaxPoolSize = int.MaxValue;\n        }\n\n        public static void SetMaxPoolSize(int maxPoolSize)\n        {\n            MaxPoolSize = maxPoolSize;\n        }\n\n        public static IEnumerable<(Type, int)> GetCacheSizeInfo()\n        {\n            // Making calls thread safe\n            lock (sizes)\n            {\n                foreach (var item in sizes)\n                {\n                    yield return (item.Key, item.Value());\n                }\n            }\n        }\n\n        public static void RegisterSizeGetter(Type type, Func<int> getSize)\n        {\n            // Making calls thread safe\n            lock (sizes)\n            {\n                sizes[type] = getSize;\n            }\n        }\n    }\n\n    /// <summary>\n    /// Acts as a linked list for TaskSources.\n    /// </summary>\n    /// <typeparam name=\"T\">Same type as the class that implements this</typeparam>\n    public interface ITaskPoolNode<T>\n    {\n        // Because interfaces cannot have fields, we store a reference to the field as a getter.\n        // This is so we can directly set and get the field rather than using a property getter/setter, which might have more overhead.\n        //\n        // Disgusting, but efficient.\n        ref T NextNode { get; }\n    }\n\n    // Mutable struct, don't mark readonly.\n    /// <summary>\n    /// Holds a linked list of <see cref=\"ITaskPoolNode{T}\"/>. Serves as a stack with push and pop operations.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    [StructLayout(LayoutKind.Auto)]\n    public struct TaskPool<T>\n        where T : class, ITaskPoolNode<T>\n    {\n        // gate is basically a lock, which controls both popping and pushing to the TaskPool\n        int gate;\n        int size;\n        // Linked list points backwards:\n        // root <-- node2 <-- node3 <-- node4\n        T root;\n\n        public int Size => size;\n\n        // Methods are inlined, meaning the method body replaces all calls of the method, making the \n        // method run fast, but taking up more memory.\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        // Tries to pop.\n        // If another thread is already popping/pushing to this pool, then return false (failure).\n        // Otherwise, pop and return true.\n        public bool TryPop(out T result)\n        {\n            // Interlocked class can perform single operations atomically (thread-safe)\n            // Note that sequentialk Interlocked calls are not guaranteed to be thread-safe.\n            //\n            // CompareExchange:\n            //      if gate == 0:\n            //          gate = 1;\n            //          return 0;   // Original value of gate\n            //      return gate;    // Original value of gate\n            if (Interlocked.CompareExchange(ref gate, 1, 0) == 0)\n            {\n                // If Interlocked.CompareExchange(ref gate, 1, 0) == 0, then the exchange worked!\n                // Basically if the gate was 0, then the pool is free to be used, so we set it to 1\n                // and start popping.\n                var v = root;\n                if (!(v is null))\n                {\n                    // Our pool is not empty, so we can pop.\n                    // Pop from start of linked list O(1) time\n                    ref var nextNode = ref v.NextNode;\n                    root = nextNode;\n                    nextNode = null;\n                    size--;\n                    result = v;\n                    // Volatile writes ensure writes are thread safe?\n                    Volatile.Write(ref gate, 0);\n                    return true;\n                }\n\n                // Our pool is empty, so we can't pop.\n                Volatile.Write(ref gate, 0);\n            }\n            result = default;\n            return false;\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        // Tries to push.\n        // If another thread is already popping/pushing to this pool, then return false (failure).\n        // Otherwise, pop and return true.\n        public bool TryPush(T item)\n        {\n            if (Interlocked.CompareExchange(ref gate, 1, 0) == 0)\n            {\n                if (size < TaskPool.MaxPoolSize)\n                {\n                    // Push to start of linked list O(1) time\n                    item.NextNode = root;\n                    root = item;\n                    size++;\n                    Volatile.Write(ref gate, 0);\n                    return true;\n                }\n                else\n                {\n                    Volatile.Write(ref gate, 0);\n                }\n            }\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/TaskPool.cs.uid",
    "content": "uid://blbfg64ek0cj4\n"
  },
  {
    "path": "addons/GDTask/TimeoutController.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    // CancellationTokenSource itself can not reuse but CancelAfter(Timeout.InfiniteTimeSpan) allows reuse if did not reach timeout.\n    // Similar discussion:\n    // https://github.com/dotnet/runtime/issues/4694\n    // https://github.com/dotnet/runtime/issues/48492\n    // This TimeoutController emulate similar implementation, using CancelAfterSlim; to achieve zero allocation timeout.\n\n    public sealed class TimeoutController : IDisposable\n    {\n        readonly static Action<object> CancelCancellationTokenSourceStateDelegate = new Action<object>(CancelCancellationTokenSourceState);\n\n        static void CancelCancellationTokenSourceState(object state)\n        {\n            var cts = (CancellationTokenSource)state;\n            cts.Cancel();\n        }\n\n        CancellationTokenSource timeoutSource;\n        CancellationTokenSource linkedSource;\n        PlayerLoopTimer timer;\n        bool isDisposed;\n\n        readonly DelayType delayType;\n        readonly PlayerLoopTiming delayTiming;\n        readonly CancellationTokenSource originalLinkCancellationTokenSource;\n\n        public TimeoutController(DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming delayTiming = PlayerLoopTiming.Process)\n        {\n            this.timeoutSource = new CancellationTokenSource();\n            this.originalLinkCancellationTokenSource = null;\n            this.linkedSource = null;\n            this.delayType = delayType;\n            this.delayTiming = delayTiming;\n        }\n\n        public TimeoutController(CancellationTokenSource linkCancellationTokenSource, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming delayTiming = PlayerLoopTiming.Process)\n        {\n            this.timeoutSource = new CancellationTokenSource();\n            this.originalLinkCancellationTokenSource = linkCancellationTokenSource;\n            this.linkedSource = CancellationTokenSource.CreateLinkedTokenSource(timeoutSource.Token, linkCancellationTokenSource.Token);\n            this.delayType = delayType;\n            this.delayTiming = delayTiming;\n        }\n\n        public CancellationToken Timeout(int millisecondsTimeout)\n        {\n            return Timeout(TimeSpan.FromMilliseconds(millisecondsTimeout));\n        }\n\n        public CancellationToken Timeout(TimeSpan timeout)\n        {\n            if (originalLinkCancellationTokenSource != null && originalLinkCancellationTokenSource.IsCancellationRequested)\n            {\n                return originalLinkCancellationTokenSource.Token;\n            }\n\n            // Timeouted, create new source and timer.\n            if (timeoutSource.IsCancellationRequested)\n            {\n                timeoutSource.Dispose();\n                timeoutSource = new CancellationTokenSource();\n                if (linkedSource != null)\n                {\n                    this.linkedSource.Cancel();\n                    this.linkedSource.Dispose();\n                    this.linkedSource = CancellationTokenSource.CreateLinkedTokenSource(timeoutSource.Token, originalLinkCancellationTokenSource.Token);\n                }\n\n                timer?.Dispose();\n                timer = null;\n            }\n\n            var useSource = (linkedSource != null) ? linkedSource : timeoutSource;\n            var token = useSource.Token;\n            if (timer == null)\n            {\n                // Timer complete => timeoutSource.Cancel() -> linkedSource will be canceled.\n                // (linked)token is canceled => stop timer\n                timer = PlayerLoopTimer.StartNew(timeout, false, delayType, delayTiming, token, CancelCancellationTokenSourceStateDelegate, timeoutSource);\n            }\n            else\n            {\n                timer.Restart(timeout);\n            }\n\n            return token;\n        }\n\n        public bool IsTimeout()\n        {\n            return timeoutSource.IsCancellationRequested;\n        }\n\n        public void Reset()\n        {\n            timer?.Stop();\n        }\n\n        public void Dispose()\n        {\n            if (isDisposed) return;\n\n            try\n            {\n                // stop timer.\n                timer?.Dispose();\n\n                // cancel and dispose.\n                timeoutSource.Cancel();\n                timeoutSource.Dispose();\n                if (linkedSource != null)\n                {\n                    linkedSource.Cancel();\n                    linkedSource.Dispose();\n                }\n            }\n            finally\n            {\n                isDisposed = true;\n            }\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/TimeoutController.cs.uid",
    "content": "uid://dyr8ynfd5afi5\n"
  },
  {
    "path": "addons/GDTask/TriggerEvent.cs",
    "content": "﻿using System;\nusing System.Threading;\nusing Godot;\n\nnamespace Fractural.Tasks\n{\n    public interface ITriggerHandler<T>\n    {\n        void OnNext(T value);\n        void OnError(Exception ex);\n        void OnCompleted();\n        void OnCanceled(CancellationToken cancellationToken);\n\n        // set/get from TriggerEvent<T>\n        ITriggerHandler<T> Prev { get; set; }\n        ITriggerHandler<T> Next { get; set; }\n    }\n\n    // be careful to use, itself is struct.\n    public struct TriggerEvent<T>\n    {\n        ITriggerHandler<T> head; // head.prev is last\n        ITriggerHandler<T> iteratingHead;\n\n        bool preserveRemoveSelf;\n        ITriggerHandler<T> iteratingNode;\n\n        void LogError(Exception ex)\n        {\n            GD.PrintErr(ex);\n        }\n\n        public void SetResult(T value)\n        {\n            if (iteratingNode != null)\n            {\n                throw new InvalidOperationException(\"Can not trigger itself in iterating.\");\n            }\n\n            var h = head;\n            while (h != null)\n            {\n                iteratingNode = h;\n\n                try\n                {\n                    h.OnNext(value);\n                }\n                catch (Exception ex)\n                {\n                    LogError(ex);\n                    Remove(h);\n                }\n\n                if (preserveRemoveSelf)\n                {\n                    preserveRemoveSelf = false;\n                    iteratingNode = null;\n                    var next = h.Next;\n                    Remove(h);\n                    h = next;\n                }\n                else\n                {\n                    h = h.Next;\n                }\n            }\n\n            iteratingNode = null;\n            if (iteratingHead != null)\n            {\n                Add(iteratingHead);\n                iteratingHead = null;\n            }\n        }\n\n        public void SetCanceled(CancellationToken cancellationToken)\n        {\n            if (iteratingNode != null)\n            {\n                throw new InvalidOperationException(\"Can not trigger itself in iterating.\");\n            }\n\n            var h = head;\n            while (h != null)\n            {\n                iteratingNode = h;\n                try\n                {\n                    h.OnCanceled(cancellationToken);\n                }\n                catch (Exception ex)\n                {\n                    LogError(ex);\n                }\n\n                preserveRemoveSelf = false;\n                iteratingNode = null;\n                var next = h.Next;\n                Remove(h);\n                h = next;\n            }\n\n            iteratingNode = null;\n            if (iteratingHead != null)\n            {\n                Add(iteratingHead);\n                iteratingHead = null;\n            }\n        }\n\n        public void SetCompleted()\n        {\n            if (iteratingNode != null)\n            {\n                throw new InvalidOperationException(\"Can not trigger itself in iterating.\");\n            }\n\n            var h = head;\n            while (h != null)\n            {\n                iteratingNode = h;\n                try\n                {\n                    h.OnCompleted();\n                }\n                catch (Exception ex)\n                {\n                    LogError(ex);\n                }\n\n                preserveRemoveSelf = false;\n                iteratingNode = null;\n                var next = h.Next;\n                Remove(h);\n                h = next;\n            }\n\n            iteratingNode = null;\n            if (iteratingHead != null)\n            {\n                Add(iteratingHead);\n                iteratingHead = null;\n            }\n        }\n\n        public void SetError(Exception exception)\n        {\n            if (iteratingNode != null)\n            {\n                throw new InvalidOperationException(\"Can not trigger itself in iterating.\");\n            }\n\n            var h = head;\n            while (h != null)\n            {\n                iteratingNode = h;\n                try\n                {\n                    h.OnError(exception);\n                }\n                catch (Exception ex)\n                {\n                    LogError(ex);\n                }\n\n                preserveRemoveSelf = false;\n                iteratingNode = null;\n                var next = h.Next;\n                Remove(h);\n                h = next;\n            }\n\n            iteratingNode = null;\n            if (iteratingHead != null)\n            {\n                Add(iteratingHead);\n                iteratingHead = null;\n            }\n        }\n\n        public void Add(ITriggerHandler<T> handler)\n        {\n            if (handler == null) throw new ArgumentNullException(nameof(handler));\n\n            // zero node.\n            if (head == null)\n            {\n                head = handler;\n                return;\n            }\n\n            if (iteratingNode != null)\n            {\n                if (iteratingHead == null)\n                {\n                    iteratingHead = handler;\n                    return;\n                }\n\n                var last = iteratingHead.Prev;\n                if (last == null)\n                {\n                    // single node.\n                    iteratingHead.Prev = handler;\n                    iteratingHead.Next = handler;\n                    handler.Prev = iteratingHead;\n                }\n                else\n                {\n                    // multi node\n                    iteratingHead.Prev = handler;\n                    last.Next = handler;\n                    handler.Prev = last;\n                }\n            }\n            else\n            {\n                var last = head.Prev;\n                if (last == null)\n                {\n                    // single node.\n                    head.Prev = handler;\n                    head.Next = handler;\n                    handler.Prev = head;\n                }\n                else\n                {\n                    // multi node\n                    head.Prev = handler;\n                    last.Next = handler;\n                    handler.Prev = last;\n                }\n            }\n        }\n\n        public void Remove(ITriggerHandler<T> handler)\n        {\n            if (handler == null) throw new ArgumentNullException(nameof(handler));\n\n            if (iteratingNode != null && iteratingNode == handler)\n            {\n                // if remove self, reserve remove self after invoke completed.\n                preserveRemoveSelf = true;\n            }\n            else\n            {\n                var prev = handler.Prev;\n                var next = handler.Next;\n\n                if (next != null)\n                {\n                    next.Prev = prev;\n                }\n\n                if (handler == head)\n                {\n                    head = next;\n                }\n                else if (handler == iteratingHead)\n                {\n                    iteratingHead = next;\n                }\n                else\n                {\n                    // when handler is head, prev indicate last so don't use it.\n                    if (prev != null)\n                    {\n                        prev.Next = next;\n                    }\n                }\n\n                if (head != null)\n                {\n                    if (head.Prev == handler)\n                    {\n                        if (prev != head)\n                        {\n                            head.Prev = prev;\n                        }\n                        else\n                        {\n                            head.Prev = null;\n                        }\n                    }\n                }\n\n                if (iteratingHead != null)\n                {\n                    if (iteratingHead.Prev == handler)\n                    {\n                        if (prev != iteratingHead.Prev)\n                        {\n                            iteratingHead.Prev = prev;\n                        }\n                        else\n                        {\n                            iteratingHead.Prev = null;\n                        }\n                    }\n                }\n\n                handler.Prev = null;\n                handler.Next = null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "addons/GDTask/TriggerEvent.cs.uid",
    "content": "uid://bjmtjd4skljyj\n"
  },
  {
    "path": "addons/GDTask/Triggers/AsyncDestroyTrigger.cs",
    "content": "﻿using Godot;\nusing System.Threading;\n\nnamespace Fractural.Tasks.Triggers\n{\n    public static partial class AsyncTriggerExtensions\n    {\n        public static AsyncDestroyTrigger GetAsyncDestroyTrigger(this Node node)\n        {\n            return node.GetOrAddImmediateChild<AsyncDestroyTrigger>();\n        }\n    }\n\n    public sealed partial class AsyncDestroyTrigger : Node\n    {\n        bool enterTreeCalled = false;\n        bool called = false;\n        CancellationTokenSource cancellationTokenSource;\n\n        public CancellationToken CancellationToken\n        {\n            get\n            {\n                if (cancellationTokenSource == null)\n                {\n                    cancellationTokenSource = new CancellationTokenSource();\n                }\n\n                return cancellationTokenSource.Token;\n            }\n        }\n\n        public override void _EnterTree()\n        {\n            enterTreeCalled = true;\n        }\n\n        public override void _Notification(int what)\n        {\n            if (what == NotificationPredelete)\n                OnDestroy();\n        }\n\n        void OnDestroy()\n        {\n            called = true;\n\n            cancellationTokenSource?.Cancel();\n            cancellationTokenSource?.Dispose();\n        }\n\n        public GDTask OnDestroyAsync()\n        {\n            if (called) return GDTask.CompletedTask;\n\n            var tcs = new GDTaskCompletionSource();\n\n            // OnDestroy = Called Cancel.\n            CancellationToken.RegisterWithoutCaptureExecutionContext(state =>\n            {\n                var tcs2 = (GDTaskCompletionSource)state;\n                tcs2.TrySetResult();\n            }, tcs);\n\n            return tcs.Task;\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Triggers/AsyncDestroyTrigger.cs.uid",
    "content": "uid://bpi1wdhu3nmr0\n"
  },
  {
    "path": "addons/GDTask/Triggers/AsyncEnterTreeTrigger.cs",
    "content": "﻿using Godot;\n\nnamespace Fractural.Tasks.Triggers\n{\n    public static partial class AsyncTriggerExtensions\n    {\n        public static AsyncEnterTreeTrigger GetAsyncEnterTreeTrigger(this Node node)\n        {\n            return node.GetOrAddImmediateChild<AsyncEnterTreeTrigger>();\n        }\n    }\n\n    public sealed partial class AsyncEnterTreeTrigger : AsyncTriggerBase<AsyncUnit>\n    {\n        public override void _EnterTree()\n        {\n            base._EnterTree();\n            RaiseEvent(AsyncUnit.Default);\n        }\n\n        public GDTask EnterTreeAsync()\n        {\n            if (calledEnterTree) return GDTask.CompletedTask;\n\n            return ((IAsyncOneShotTrigger)new AsyncTriggerHandler<AsyncUnit>(this, true)).OneShotAsync();\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Triggers/AsyncEnterTreeTrigger.cs.uid",
    "content": "uid://djb4yph4o81j0\n"
  },
  {
    "path": "addons/GDTask/Triggers/AsyncReadyTrigger.cs",
    "content": "﻿using Godot;\n\nnamespace Fractural.Tasks.Triggers\n{\n    public static partial class AsyncTriggerExtensions\n    {\n        public static AsyncReadyTrigger GetAsyncReadyTrigger(this Node node)\n        {\n            return node.GetOrAddImmediateChild<AsyncReadyTrigger>();\n        }\n    }\n\n    public sealed partial class AsyncReadyTrigger : AsyncTriggerBase<AsyncUnit>\n    {\n        bool called;\n\n        public override void _Ready()\n        {\n            base._Ready();\n            called = true;\n            RaiseEvent(AsyncUnit.Default);\n        }\n\n        public GDTask ReadyAsync()\n        {\n            if (called) return GDTask.CompletedTask;\n\n            return ((IAsyncOneShotTrigger)new AsyncTriggerHandler<AsyncUnit>(this, true)).OneShotAsync();\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/Triggers/AsyncReadyTrigger.cs.uid",
    "content": "uid://dmmi2y2xgqpqx\n"
  },
  {
    "path": "addons/GDTask/Triggers/AsyncTriggerBase.cs",
    "content": "﻿using Godot;\nusing System;\nusing System.Threading;\n\nnamespace Fractural.Tasks.Triggers\n{\n    public abstract partial class AsyncTriggerBase<T> : Node\n    {\n        TriggerEvent<T> triggerEvent;\n\n        internal protected bool calledEnterTree;\n        internal protected bool calledDestroy;\n\n        public override void _EnterTree()\n        {\n            calledEnterTree = true;\n        }\n\n        public override void _Notification(int what)\n        {\n            if (what == NotificationPredelete)\n                OnDestroy();\n        }\n\n        void OnDestroy()\n        {\n            if (calledDestroy) return;\n            calledDestroy = true;\n\n            triggerEvent.SetCompleted();\n        }\n\n        internal void AddHandler(ITriggerHandler<T> handler)\n        {\n            triggerEvent.Add(handler);\n        }\n\n        internal void RemoveHandler(ITriggerHandler<T> handler)\n        {\n            triggerEvent.Remove(handler);\n        }\n\n        protected void RaiseEvent(T value)\n        {\n            triggerEvent.SetResult(value);\n        }\n    }\n\n    public interface IAsyncOneShotTrigger\n    {\n        GDTask OneShotAsync();\n    }\n\n    public partial class AsyncTriggerHandler<T> : IAsyncOneShotTrigger\n    {\n        GDTask IAsyncOneShotTrigger.OneShotAsync()\n        {\n            core.Reset();\n            return new GDTask((IGDTaskSource)this, core.Version);\n        }\n    }\n\n    public sealed partial class AsyncTriggerHandler<T> : IGDTaskSource<T>, ITriggerHandler<T>, IDisposable\n    {\n        static Action<object> cancellationCallback = CancellationCallback;\n\n        readonly AsyncTriggerBase<T> trigger;\n\n        CancellationToken cancellationToken;\n        CancellationTokenRegistration registration;\n        bool isDisposed;\n        bool callOnce;\n\n        GDTaskCompletionSourceCore<T> core;\n\n        internal CancellationToken CancellationToken => cancellationToken;\n\n        ITriggerHandler<T> ITriggerHandler<T>.Prev { get; set; }\n        ITriggerHandler<T> ITriggerHandler<T>.Next { get; set; }\n\n        internal AsyncTriggerHandler(AsyncTriggerBase<T> trigger, bool callOnce)\n        {\n            if (cancellationToken.IsCancellationRequested)\n            {\n                isDisposed = true;\n                return;\n            }\n\n            this.trigger = trigger;\n            this.cancellationToken = default;\n            this.registration = default;\n            this.callOnce = callOnce;\n\n            trigger.AddHandler(this);\n\n            TaskTracker.TrackActiveTask(this, 3);\n        }\n\n        internal AsyncTriggerHandler(AsyncTriggerBase<T> trigger, CancellationToken cancellationToken, bool callOnce)\n        {\n            if (cancellationToken.IsCancellationRequested)\n            {\n                isDisposed = true;\n                return;\n            }\n\n            this.trigger = trigger;\n            this.cancellationToken = cancellationToken;\n            this.callOnce = callOnce;\n\n            trigger.AddHandler(this);\n\n            if (cancellationToken.CanBeCanceled)\n            {\n                registration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this);\n            }\n\n            TaskTracker.TrackActiveTask(this, 3);\n        }\n\n        static void CancellationCallback(object state)\n        {\n            var self = (AsyncTriggerHandler<T>)state;\n            self.Dispose();\n\n            self.core.TrySetCanceled(self.cancellationToken);\n        }\n\n        public void Dispose()\n        {\n            if (!isDisposed)\n            {\n                isDisposed = true;\n                TaskTracker.RemoveTracking(this);\n                registration.Dispose();\n                trigger.RemoveHandler(this);\n            }\n        }\n\n        T IGDTaskSource<T>.GetResult(short token)\n        {\n            try\n            {\n                return core.GetResult(token);\n            }\n            finally\n            {\n                if (callOnce)\n                {\n                    Dispose();\n                }\n            }\n        }\n\n        void ITriggerHandler<T>.OnNext(T value)\n        {\n            core.TrySetResult(value);\n        }\n\n        void ITriggerHandler<T>.OnCanceled(CancellationToken cancellationToken)\n        {\n            core.TrySetCanceled(cancellationToken);\n        }\n\n        void ITriggerHandler<T>.OnCompleted()\n        {\n            core.TrySetCanceled(CancellationToken.None);\n        }\n\n        void ITriggerHandler<T>.OnError(Exception ex)\n        {\n            core.TrySetException(ex);\n        }\n\n        void IGDTaskSource.GetResult(short token)\n        {\n            ((IGDTaskSource<T>)this).GetResult(token);\n        }\n\n        GDTaskStatus IGDTaskSource.GetStatus(short token)\n        {\n            return core.GetStatus(token);\n        }\n\n        GDTaskStatus IGDTaskSource.UnsafeGetStatus()\n        {\n            return core.UnsafeGetStatus();\n        }\n\n        void IGDTaskSource.OnCompleted(Action<object> continuation, object state, short token)\n        {\n            core.OnCompleted(continuation, state, token);\n        }\n    }\n}"
  },
  {
    "path": "addons/GDTask/Triggers/AsyncTriggerBase.cs.uid",
    "content": "uid://bml87u46mci66\n"
  },
  {
    "path": "addons/GDTask/Triggers/AsyncTriggerExtensions.cs",
    "content": "﻿using Fractural.Tasks.Triggers;\nusing Godot;\nusing System;\nusing System.Threading;\n\nnamespace Fractural.Tasks\n{\n    public static class GDTaskCancellationExtensions\n    {\n        /// <summary>This CancellationToken is canceled when the Node will be destroyed.</summary>\n        public static CancellationToken GetCancellationTokenOnDestroy(this Node node)\n        {\n            return node.GetAsyncDestroyTrigger().CancellationToken;\n        }\n    }\n}\n\nnamespace Fractural.Tasks.Triggers\n{\n    public static partial class AsyncTriggerExtensions\n    {\n        // Special for single operation.\n        public static T GetImmediateChild<T>(this Node node, bool includeRoot = true)\n        {\n            if (node == null) throw new ArgumentNullException(nameof(node));\n            if (includeRoot && node is T castedRoot)\n                return castedRoot;\n            else\n            {\n                foreach (Node child in node.GetChildren())\n                    if (child is T castedChild) return castedChild;\n            }\n            return default(T);\n        }\n\n        public static T AddImmediateChild<T>(this Node node) where T : Node, new()\n        {\n            T child = new T();\n            node.AddChild(child);\n            return child;\n        }\n\n        public static T GetOrAddImmediateChild<T>(this Node node) where T : Node, new()\n        {\n            T child = GetImmediateChild<T>(node);\n            if (child == null)\n                child = AddImmediateChild<T>(node);\n            return child;\n        }\n\n        /// <summary>This function is called when the Node will be destroyed.</summary>\n        public static GDTask OnDestroyAsync(this Node node)\n        {\n            return node.GetAsyncDestroyTrigger().OnDestroyAsync();\n        }\n\n        public static GDTask ReadyAsync(this Node node)\n        {\n            return node.GetAsyncReadyTrigger().ReadyAsync();\n        }\n\n        public static GDTask EnterTreeAsync(this Node node)\n        {\n            return node.GetAsyncEnterTreeTrigger().EnterTreeAsync();\n        }\n    }\n}\n\n"
  },
  {
    "path": "addons/GDTask/Triggers/AsyncTriggerExtensions.cs.uid",
    "content": "uid://b5kf26jr530q0\n"
  },
  {
    "path": "addons/GDTask/Triggers/NodeMessagesTriggers.cs",
    "content": "﻿using System.Threading;\nusing Godot;\n\nnamespace Fractural.Tasks.Triggers\n{\n    #region PhysicsProcess\n\n    public interface IAsyncPhysicsProcessHandler\n    {\n        GDTask PhysicsProcessAsync();\n    }\n\n    public partial class AsyncTriggerHandler<T> : IAsyncPhysicsProcessHandler\n    {\n        GDTask IAsyncPhysicsProcessHandler.PhysicsProcessAsync()\n        {\n            core.Reset();\n            return new GDTask((IGDTaskSource)(object)this, core.Version);\n        }\n    }\n\n    public static partial class AsyncTriggerExtensions\n    {\n        public static AsyncPhysicsProcessTrigger GetAsyncPhysicsProcessTrigger(this Node node)\n        {\n            return node.GetOrAddImmediateChild<AsyncPhysicsProcessTrigger>();\n        }\n    }\n\n    public sealed partial class AsyncPhysicsProcessTrigger : AsyncTriggerBase<AsyncUnit>\n    {\n        public override void _PhysicsProcess(double delta)\n        {\n            RaiseEvent(AsyncUnit.Default);\n        }\n\n        public IAsyncPhysicsProcessHandler GetPhysicsProcessAsyncHandler()\n        {\n            return new AsyncTriggerHandler<AsyncUnit>(this, false);\n        }\n\n        public IAsyncPhysicsProcessHandler GetPhysicsProcessAsyncHandler(CancellationToken cancellationToken)\n        {\n            return new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, false);\n        }\n\n        public GDTask PhysicsProcessAsync()\n        {\n            return ((IAsyncPhysicsProcessHandler)new AsyncTriggerHandler<AsyncUnit>(this, true)).PhysicsProcessAsync();\n        }\n\n        public GDTask PhysicsProcessAsync(CancellationToken cancellationToken)\n        {\n            return ((IAsyncPhysicsProcessHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).PhysicsProcessAsync();\n        }\n    }\n    #endregion\n\n    #region Process\n\n    public interface IAsyncProcessHandler\n    {\n        GDTask ProcessAsync();\n    }\n\n    public partial class AsyncTriggerHandler<T> : IAsyncProcessHandler\n    {\n        GDTask IAsyncProcessHandler.ProcessAsync()\n        {\n            core.Reset();\n            return new GDTask((IGDTaskSource)(object)this, core.Version);\n        }\n    }\n\n    public static partial class AsyncTriggerExtensions\n    {\n        public static AsyncProcessTrigger GetAsyncProcessTrigger(this Node node)\n        {\n            return node.GetOrAddImmediateChild<AsyncProcessTrigger>();\n        }\n    }\n\n    public sealed partial class AsyncProcessTrigger : AsyncTriggerBase<AsyncUnit>\n    {\n        public override void _Process(double delta)\n        {\n            RaiseEvent(AsyncUnit.Default);\n        }\n\n        public IAsyncProcessHandler GetProcessAsyncHandler()\n        {\n            return new AsyncTriggerHandler<AsyncUnit>(this, false);\n        }\n\n        public IAsyncProcessHandler GetProcessAsyncHandler(CancellationToken cancellationToken)\n        {\n            return new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, false);\n        }\n\n        public GDTask ProcessAsync()\n        {\n            return ((IAsyncProcessHandler)new AsyncTriggerHandler<AsyncUnit>(this, true)).ProcessAsync();\n        }\n\n        public GDTask ProcessAsync(CancellationToken cancellationToken)\n        {\n            return ((IAsyncProcessHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).ProcessAsync();\n        }\n    }\n    #endregion\n\n}"
  },
  {
    "path": "addons/GDTask/Triggers/NodeMessagesTriggers.cs.uid",
    "content": "uid://c8yqsh24m88oo\n"
  },
  {
    "path": "bootsplash.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://xs4tet3rfluv\"\npath=\"res://.godot/imported/bootsplash.png-30e2c9990faa42442c2d12c3b0f7ed9a.ctex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://bootsplash.png\"\ndest_files=[\"res://.godot/imported/bootsplash.png-30e2c9990faa42442c2d12c3b0f7ed9a.ctex\"]\n\n[params]\n\ncompress/mode=0\ncompress/high_quality=false\ncompress/lossy_quality=0.7\ncompress/hdr_compression=1\ncompress/normal_map=0\ncompress/channel_pack=0\nmipmaps/generate=false\nmipmaps/limit=-1\nroughness/mode=0\nroughness/src_normal=\"\"\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/normal_map_invert_y=false\nprocess/hdr_as_srgb=false\nprocess/hdr_clamp_exposure=false\nprocess/size_limit=0\ndetect_3d/compress_to=1\n"
  },
  {
    "path": "default_env.tres",
    "content": "[gd_resource type=\"Environment\" load_steps=2 format=3 uid=\"uid://d1jylo21mpcqw\"]\n\n[sub_resource type=\"Sky\" id=\"1\"]\n\n[resource]\nbackground_mode = 2\nsky = SubResource(\"1\")\n"
  },
  {
    "path": "icon.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"StreamTexture\"\npath=\"res://.import/Godot Icons_GDTask.png-aadd498320b5c6d1f2887ffda1e49a4a.stex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://Godot Icons_GDTask.png\"\ndest_files=[ \"res://.import/Godot Icons_GDTask.png-aadd498320b5c6d1f2887ffda1e49a4a.stex\" ]\n\n[params]\n\ncompress/mode=0\ncompress/lossy_quality=0.7\ncompress/hdr_mode=0\ncompress/bptc_ldr=0\ncompress/normal_map=0\nflags/repeat=0\nflags/filter=true\nflags/mipmaps=false\nflags/anisotropic=false\nflags/srgb=2\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/HDR_as_SRGB=false\nprocess/invert_color=false\nprocess/normal_map_invert_y=false\nstream=false\nsize_limit=0\ndetect_3d=true\nsvg/scale=1.0\n"
  },
  {
    "path": "icon.png.import",
    "content": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://cw01ge0bgos8m\"\npath=\"res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex\"\nmetadata={\n\"vram_texture\": false\n}\n\n[deps]\n\nsource_file=\"res://icon.png\"\ndest_files=[\"res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex\"]\n\n[params]\n\ncompress/mode=0\ncompress/high_quality=false\ncompress/lossy_quality=0.7\ncompress/hdr_compression=1\ncompress/normal_map=0\ncompress/channel_pack=0\nmipmaps/generate=false\nmipmaps/limit=-1\nroughness/mode=0\nroughness/src_normal=\"\"\nprocess/fix_alpha_border=true\nprocess/premult_alpha=false\nprocess/normal_map_invert_y=false\nprocess/hdr_as_srgb=false\nprocess/hdr_clamp_exposure=false\nprocess/size_limit=0\ndetect_3d/compress_to=1\n"
  },
  {
    "path": "project.godot",
    "content": "; Engine configuration file.\n; It's best edited using the editor UI and not directly,\n; since the parameters that go here are not all obvious.\n;\n; Format:\n;   [section] ; section goes between []\n;   param=value ; assign values to parameters\n\nconfig_version=5\n\n[WAT]\n\nTest_Directory=\"res://\"\nResults_Directory=\"res://\"\nTest_Metadata_Directory=\"res://\"\nTags=PackedStringArray()\nCache_Tests=true\nWindow_Size=Vector2(1280, 720)\nMinimize_Window_When_Running_Tests=false\nPort=6008\nDisplay=8\n\n[application]\n\nconfig/name=\"GDTask\"\nrun/main_scene=\"res://tests/manual/Test.tscn\"\nconfig/features=PackedStringArray(\"4.4\", \"C#\")\nboot_splash/bg_color=Color(0, 0, 0, 1)\nboot_splash/image=\"res://bootsplash.png\"\nconfig/icon=\"res://icon.png\"\n\n[dotnet]\n\nproject/assembly_name=\"GDTask\"\n\n[editor_plugins]\n\nenabled=PackedStringArray()\n\n[gui]\n\ncommon/drop_mouse_on_gui_input_disabled=true\n\n[mono]\n\nproject/assembly_name=\"GDTask\"\n\n[physics]\n\ncommon/enable_pause_aware_picking=true\n\n[rendering]\n\nenvironment/defaults/default_environment=\"res://default_env.tres\"\n"
  },
  {
    "path": "tests/manual/Test.cs",
    "content": "using Fractural.Tasks;\nusing Godot;\nusing System;\nusing System.Threading;\n\nnamespace Tests.Manual\n{\n\tpublic partial class Test : Node\n\t{\n\t\t[Signal]\n\t\tpublic delegate void MyEmptySignalEventHandler();\n\t\t[Signal]\n\t\tpublic delegate void MyArgSignalEventHandler(int number, bool boolean);\n\n\t\t[Export]\n\t\tprivate bool runTestOnReady;\n\t\t[Export]\n\t\tprivate NodePath spritePath;\n\t\t[Export]\n\t\tprivate Label pauseLabel;\n\t\tpublic Sprite2D sprite;\n\n\t\tpublic override void _Ready()\n\t\t{\n\t\t\tsprite = GetNode<Sprite2D>(spritePath);\n\t\t\tif (runTestOnReady)\n\t\t\t\tRun().Forget();\n\t\t\tProcessMode = ProcessModeEnum.Always;\n\t\t\tpauseLabel.Text = GetTree().Paused ? \"Paused\" : \"Unpaused\";\n\t\t}\n\n\t\tpublic override void _Input(InputEvent @event)\n\t\t{\n\t\t\tif (@event.IsActionReleased(\"ui_left\"))\n\t\t\t{\n\t\t\t\tRun().Forget();\n\t\t\t}\n\t\t\telse if (@event.IsActionReleased(\"ui_right\"))\n\t\t\t{\n\t\t\t\tRunPause().Forget();\n\t\t\t}\n\t\t\telse if (@event.IsActionReleased(\"ui_up\"))\n\t\t\t{\n\t\t\t\tGetTree().Paused = !GetTree().Paused;\n\t\t\t\tpauseLabel.Text = GetTree().Paused ? \"Paused\" : \"Unpaused\";\n\t\t\t}\n\t\t}\n\n\t\tprivate async GDTaskVoid WaitAndEmitMyEmptySignal(TimeSpan delay)\n\t\t{\n\t\t\tawait GDTask.Delay(delay);\n\t\t\tEmitSignal(nameof(MyEmptySignal));\n\t\t}\n\n\t\tprivate async GDTaskVoid WaitAndEmitMyArgSignal(TimeSpan delay)\n\t\t{\n\t\t\tawait GDTask.Delay(delay);\n\t\t\tEmitSignal(nameof(MyArgSignal), 10, true);\n\t\t}\n\t\tprivate async GDTaskVoid WaitAndCancelToken(TimeSpan delay, CancellationTokenSource cts)\n\t\t{\n\t\t\tawait GDTask.Delay(delay);\n\t\t\tcts.Cancel();\n\t\t}\n\n\t\tprivate async GDTaskVoid Run()\n\t\t{\n\t\t\tGD.Print(\"Run: Pre delay\");\n\t\t\tsprite.Visible = false;\n\t\t\tawait GDTask.Delay(TimeSpan.FromSeconds(3));\n\t\t\tsprite.Visible = true;\n\t\t\tGD.Print(\"Run: Post delay after 3 seconds\");\n\n\t\t\tGD.Print(\"Run: Await MyEmptySignal\");\n\t\t\tWaitAndEmitMyEmptySignal(TimeSpan.FromSeconds(1)).Forget();\n\t\t\tvar signalResult = await GDTask.ToSignal(this, nameof(MyEmptySignal));\n\t\t\tGD.Print(\"Run: Await MyEmptySignal Complete, result: \", Json.Stringify(new Godot.Collections.Array(signalResult)));\n\n\t\t\tGD.Print(\"Run: Await MyArgSignal\");\n\t\t\tWaitAndEmitMyArgSignal(TimeSpan.FromSeconds(1)).Forget();\n\t\t\tsignalResult = await GDTask.ToSignal(this, nameof(MyArgSignal));\n\t\t\tGD.Print(\"Run: Await MyArgSignal Complete, result: \", Json.Stringify(new Godot.Collections.Array(signalResult)));\n\n\t\t\tvar cts = new CancellationTokenSource();\n\t\t\tGD.Print(\"Run: Await Cancellable MyEmptySignal\");\n\t\t\tWaitAndEmitMyEmptySignal(TimeSpan.FromSeconds(3)).Forget();\n\t\t\tWaitAndCancelToken(TimeSpan.FromSeconds(0.5), cts).Forget();\n\t\t\ttry\n\t\t\t{\n\t\t\t\tsignalResult = await GDTask.ToSignal(this, nameof(MyEmptySignal), cts.Token);\n\t\t\t\tGD.Print(\"Run: Await Cancellable MyEmptySignal ran with result: \", signalResult);\n\t\t\t}\n\t\t\tcatch (OperationCanceledException _)\n\t\t\t{\n\t\t\t\tGD.Print(\"Run: Await Cancellable MyEmptySignal Cancelled\");\n\t\t\t}\n\n\t\t\tcts = new CancellationTokenSource();\n\t\t\tGD.Print(\"Run: Await Cancellable MyArgSignal\");\n\t\t\tWaitAndEmitMyArgSignal(TimeSpan.FromSeconds(3)).Forget();\n\t\t\tWaitAndCancelToken(TimeSpan.FromSeconds(0.5), cts).Forget();\n\t\t\ttry\n\t\t\t{\n\t\t\t\tsignalResult = await GDTask.ToSignal(this, nameof(MyArgSignal), cts.Token);\n\t\t\t\tGD.Print(\"Run: Await Cancellable MyArgSignal ran with result: \", signalResult);\n\t\t\t}\n\t\t\tcatch (OperationCanceledException _)\n\t\t\t{\n\t\t\t\tGD.Print(\"Run: Await Cancellable MyArgSignal Cancelled\");\n\t\t\t}\n\n\t\t\tGD.Print(\"Run: Pre RunWithResult\");\n\t\t\tstring runResult = await RunWithResult();\n\t\t\tGD.Print($\"Run: Post got result: {runResult}\");\n\n\t\t\tGD.Print(\"Run: LongTask started\");\n\t\t\tcts = new CancellationTokenSource();\n\n\t\t\tCancellableReallyLongTask(cts.Token).Forget();\n\n\t\t\tawait GDTask.Delay(TimeSpan.FromSeconds(3));\n\t\t\tcts.Cancel();\n\t\t\tGD.Print(\"Run: LongTask cancelled\");\n\n\t\t\tawait GDTask.WaitForEndOfFrame();\n\t\t\tGD.Print(\"Run: WaitForEndOfFrame\");\n\t\t\tawait GDTask.WaitForPhysicsProcess();\n\t\t\tGD.Print(\"Run: WaitForPhysicsProcess\");\n\t\t\tawait GDTask.NextFrame();\n\t\t\tGD.Print(\"Run: NextFrame\");\n\t\t}\n\n\t\tprivate async GDTask<string> RunWithResult()\n\t\t{\n\t\t\tawait GDTask.Delay(TimeSpan.FromSeconds(2));\n\t\t\treturn \"Hello\";\n\t\t}\n\n\t\tprivate async GDTaskVoid CancellableReallyLongTask(CancellationToken cancellationToken)\n\t\t{\n\t\t\tint seconds = 10;\n\t\t\tGD.Print($\"Run: Starting long task ({seconds} seconds long).\");\n\t\t\tfor (int i = 0; i < seconds; i++)\n\t\t\t{\n\t\t\t\tGD.Print($\"Run: Working on long task for {i} seconds...\");\n\t\t\t\tawait GDTask.Delay(TimeSpan.FromSeconds(1), cancellationToken: cancellationToken);\n\t\t\t}\n\t\t\tGD.Print(\"Run: Finished long task.\");\n\t\t}\n\n\t\tprivate async GDTaskVoid RunPause()\n\t\t{\n\t\t\tGD.Print(\"RunPause: Pre delay\");\n\t\t\tsprite.Visible = false;\n\t\t\tawait GDTask.Delay(TimeSpan.FromSeconds(3), PlayerLoopTiming.PauseProcess);\n\t\t\tsprite.Visible = true;\n\t\t\tGD.Print(\"RunPause: Post delay after 3 seconds\");\n\n\t\t\tGD.Print(\"RunPause: Pre RunWithResult\");\n\t\t\tstring result = await RunWithResultPause();\n\t\t\tGD.Print($\"RunPause: Post got result: {result}\");\n\n\t\t\tGD.Print(\"RunPause: LongTask started\");\n\t\t\tvar cts = new CancellationTokenSource();\n\n\t\t\tCancellableReallyLongTaskPause(cts.Token).Forget();\n\n\t\t\tawait GDTask.Delay(TimeSpan.FromSeconds(3), PlayerLoopTiming.PauseProcess);\n\t\t\tcts.Cancel();\n\t\t\tGD.Print(\"RunPause: LongTask cancelled\");\n\n\t\t\tawait GDTask.Yield(PlayerLoopTiming.PauseProcess);\n\t\t\tGD.Print(\"RunPause: Yield(PlayerLoopTiming.PauseProcess)\");\n\t\t\tawait GDTask.Yield(PlayerLoopTiming.PausePhysicsProcess);\n\t\t\tGD.Print(\"RunPause: Yield(PlayerLoopTiming.PausePhysicsProcess)\");\n\t\t\tawait GDTask.NextFrame(PlayerLoopTiming.PauseProcess);\n\t\t\tGD.Print(\"RunPause: NextFrame\");\n\t\t}\n\n\t\tprivate async GDTask<string> RunWithResultPause()\n\t\t{\n\t\t\tawait GDTask.Delay(TimeSpan.FromSeconds(2), PlayerLoopTiming.PauseProcess);\n\t\t\treturn \"Hello\";\n\t\t}\n\n\t\tprivate async GDTaskVoid CancellableReallyLongTaskPause(CancellationToken cancellationToken)\n\t\t{\n\t\t\tint seconds = 10;\n\t\t\tGD.Print($\"RunPause: Starting long task ({seconds} seconds long).\");\n\t\t\tfor (int i = 0; i < seconds; i++)\n\t\t\t{\n\t\t\t\tGD.Print($\"RunPause: Working on long task for {i} seconds...\");\n\t\t\t\tawait GDTask.Delay(TimeSpan.FromSeconds(1), PlayerLoopTiming.PauseProcess, cancellationToken);\n\t\t\t}\n\t\t\tGD.Print(\"RunPause: Finished long task.\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "tests/manual/Test.cs.uid",
    "content": "uid://p7nspvioq02b\n"
  },
  {
    "path": "tests/manual/Test.tscn",
    "content": "[gd_scene load_steps=3 format=3 uid=\"uid://cfm0u7eao06ff\"]\n\n[ext_resource type=\"Script\" uid=\"uid://p7nspvioq02b\" path=\"res://tests/manual/Test.cs\" id=\"1\"]\n[ext_resource type=\"Texture2D\" uid=\"uid://cw01ge0bgos8m\" path=\"res://icon.png\" id=\"2\"]\n\n[node name=\"Test\" type=\"Node\" node_paths=PackedStringArray(\"pauseLabel\")]\nscript = ExtResource(\"1\")\nspritePath = NodePath(\"Node2D/Sprite2D\")\npauseLabel = NodePath(\"UI/Control/PauseLabel\")\n\n[node name=\"Node2D\" type=\"Node2D\" parent=\".\"]\n\n[node name=\"Sprite2D\" type=\"Sprite2D\" parent=\"Node2D\"]\ntexture = ExtResource(\"2\")\n\n[node name=\"Camera2D\" type=\"Camera2D\" parent=\"Node2D\"]\n\n[node name=\"UI\" type=\"CanvasLayer\" parent=\".\"]\n\n[node name=\"Control\" type=\"Control\" parent=\"UI\"]\nlayout_mode = 3\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\ngrow_horizontal = 2\ngrow_vertical = 2\n\n[node name=\"PauseLabel\" type=\"Label\" parent=\"UI/Control\"]\nlayout_mode = 0\noffset_left = 18.0\noffset_top = 18.0\noffset_right = 75.0\noffset_bottom = 41.0\ntext = \"Paused\"\n"
  }
]