protected override void DidActivate(bool firstActivation, bool addedToHierarchy, bool screenSystemEnabling)
        {
            if (firstActivation)
            {
                SetTitle("Custom Campaigns");
                showBackButton = true;

                _campaignFlowCoordinator           = Resources.FindObjectsOfTypeAll <CampaignFlowCoordinator>().First();
                _missionMapAnimationController     = Resources.FindObjectsOfTypeAll <MissionMapAnimationController>().First();
                _missionNodesManager               = Resources.FindObjectsOfTypeAll <MissionNodesManager>().First();
                _missionStagesManager              = Resources.FindObjectsOfTypeAll <MissionStagesManager>().First();
                _missionConnectionsGenerator       = Resources.FindObjectsOfTypeAll <MissionConnectionsGenerator>().First();
                _missionSelectionMapViewController = Resources.FindObjectsOfTypeAll <MissionSelectionMapViewController>().First();
                _missionNodeSelectionManager       = Resources.FindObjectsOfTypeAll <MissionNodeSelectionManager>().First();
                _missionLevelDetailViewController  = Resources.FindObjectsOfTypeAll <MissionLevelDetailViewController>().First();
                _missionResultsViewController      = Resources.FindObjectsOfTypeAll <MissionResultsViewController>().First();

                _playButton    = _missionLevelDetailViewController.GetPrivateField <Button>("_playButton");
                _mapScrollView = _missionSelectionMapViewController.GetPrivateField <ScrollView>("_mapScrollView");
                _mapScrollViewItemsVisibilityController = _mapScrollView.GetComponent <ScrollViewItemsVisibilityController>();
                _backgroundImage = _mapScrollView.GetComponentsInChildren <Image>().First(x => x.name == "Map");
                _missionSelectionNavigationController = _campaignFlowCoordinator.GetPrivateField <MissionSelectionNavigationController>("_missionSelectionNavigationController");
                _gameplayModifierInfoListItemsList    = _missionLevelDetailViewController.GetPrivateField <GameplayModifierInfoListItemsList>("_gameplayModifierInfoListItemsList");
                _modifiersPanelGO       = _missionLevelDetailViewController.GetPrivateField <GameObject>("_modifiersPanelGO");
                _gameplayModifiersModel = _missionLevelDetailViewController.GetPrivateField <GameplayModifiersModelSO>("_gameplayModifiersModel");

                BSMLParser.instance.Parse(Utilities.GetResourceContent(Assembly.GetExecutingAssembly(), "BeatSaberCustomCampaigns.Views.challenge-detail.bsml"), _missionLevelDetailViewController.gameObject, this);

                _campaignProgressModel = _campaignFlowCoordinator.GetPrivateField <CampaignProgressModel>("_campaignProgressModel");

                _campaignListViewController                  = BeatSaberUI.CreateViewController <CampaignListViewController>();
                _campaignDetailViewController                = BeatSaberUI.CreateViewController <CampaignDetailViewController>();
                _campaignTotalLeaderboardViewController      = BeatSaberUI.CreateViewController <CampaignTotalLeaderboardViewController>();
                _campaignListNavigationController            = BeatSaberUI.CreateViewController <NavigationController>();
                _campaignListViewController.clickedCampaign += ShowDetails;
                _campaignDetailViewController.clickedPlay   += OpenCampaign;

                _campaignChallengeLeaderbaordViewController = BeatSaberUI.CreateViewController <CampaignChallengeLeaderboardViewController>();
                _unlockedItemsViewController = BeatSaberUI.CreateViewController <UnlockedItemsViewController>();
            }
            if (addedToHierarchy)
            {
                SetBaseCampaignEnabled(false);

                SetViewControllerToNavigationController(_campaignListNavigationController, _campaignListViewController);
                ProvideInitialViewControllers(_campaignListNavigationController);
            }
        }
        static bool Prefix(Action beforeSceneSwitchCallback, CampaignFlowCoordinator __instance, MissionSelectionNavigationController ____missionSelectionNavigationController, MenuTransitionsHelper ____menuTransitionsHelper, PlayerDataModel ____playerDataModel)
        {
            if (____missionSelectionNavigationController.selectedMissionNode.missionData is CustomMissionDataSO)
            {
                CustomMissionDataSO missionData = ____missionSelectionNavigationController.selectedMissionNode.missionData as CustomMissionDataSO;

                IDifficultyBeatmap     difficultyBeatmap      = BeatmapLevelDataExtensions.GetDifficultyBeatmap(Loader.BeatmapLevelsModelSO.GetBeatmapLevelIfLoaded(missionData.customLevel.levelID).beatmapLevelData, missionData.beatmapCharacteristic, missionData.beatmapDifficulty);
                GameplayModifiers      gameplayModifiers      = missionData.gameplayModifiers;
                MissionObjective[]     missionObjectives      = missionData.missionObjectives;
                PlayerSpecificSettings playerSpecificSettings = ____playerDataModel.playerData.playerSpecificSettings;
                ColorSchemesSettings   colorSchemesSettings   = ____playerDataModel.playerData.colorSchemesSettings;
                ColorScheme            overrideColorScheme    = colorSchemesSettings.overrideDefaultColors ? colorSchemesSettings.GetSelectedColorScheme() : null;
                ____menuTransitionsHelper.StartMissionLevel("", difficultyBeatmap, overrideColorScheme, gameplayModifiers, missionObjectives, playerSpecificSettings, beforeSceneSwitchCallback, __instance.HandleMissionLevelSceneDidFinish);
                return(false);
            }
            return(true);
        }
        static bool Prefix(MissionLevelScenesTransitionSetupDataSO missionLevelScenesTransitionSetupData, MissionCompletionResults missionCompletionResults, CampaignFlowCoordinator __instance, MissionSelectionNavigationController ____missionSelectionNavigationController)
        {
            if (!(____missionSelectionNavigationController.selectedMissionNode.missionData is CustomMissionDataSO))
            {
                return(true);
            }
            ChallengeExternalModifiers.onChallengeEnd?.Invoke();
            if (missionCompletionResults.levelCompletionResults.levelEndAction == LevelCompletionResults.LevelEndAction.Restart)
            {
                ____missionSelectionNavigationController.GetPrivateField <Action <MissionSelectionNavigationController> >("didPressPlayButtonEvent")(____missionSelectionNavigationController);
                Resources.FindObjectsOfTypeAll <CustomCampaignFlowCoordinator>().First().LoadExternalModifiers((____missionSelectionNavigationController.selectedMissionNode.missionData as CustomMissionDataSO).challenge);
                return(false);
            }
            if (missionCompletionResults.levelCompletionResults.levelEndStateType == LevelCompletionResults.LevelEndStateType.Cleared && missionCompletionResults.IsMissionComplete)
            {
                CustomMissionDataSO customMissionData = ____missionSelectionNavigationController.selectedMissionNode.missionData as CustomMissionDataSO;
                Campaign            campaign          = customMissionData.campaign;
                Challenge           challenge         = customMissionData.challenge;
                foreach (UnlockableItem item in challenge.unlockableItems)
                {
                    try
                    {
                        item.UnlockItem(campaign.path);
                    } catch (Exception ex)
                    {
                        Console.WriteLine("Failed to unlock item: " + item.fileName + " - Exception: " + ex.Message);
                    }
                }
                UnlockedItemsViewController unlockedItemsViewController = Resources.FindObjectsOfTypeAll <UnlockedItemsViewController>().First();
                unlockedItemsViewController.items = challenge.unlockableItems;
                unlockedItemsViewController.index = 0;
                if (unlockedItemsViewController.items.Count > 0)
                {
                    __instance.InvokeMethod("SetBottomScreenViewController", new object[] { unlockedItemsViewController, false });
                }
                if (challenge.unlockMap)
                {
                    UnlockedMaps.CompletedChallenge(challenge.name);
                }

                /*
                 * //Score submission
                 * if (customMissionData.gameplayModifiers.songSpeedMul==1f && customMissionData.gameplayModifiers.fastNotes == false && customMissionData.gameplayModifiers.failOnSaberClash == false) {
                 *  SoloFreePlayFlowCoordinator freePlayCoordinator = Resources.FindObjectsOfTypeAll<SoloFreePlayFlowCoordinator>().First();
                 *
                 *  PlayerDataModel dataModel = freePlayCoordinator.GetPrivateField<PlayerDataModel>("_playerDataModel");
                 *
                 *  PlayerData currentLocalPlayer = dataModel.playerData;
                 *  IDifficultyBeatmap difficultyBeatmap = Loader.BeatmapLevelsModelSO.GetBeatmapLevelIfLoaded(customMissionData.customLevel.levelID).beatmapLevelData.GetDifficultyBeatmap(customMissionData.beatmapCharacteristic, customMissionData.beatmapDifficulty);
                 *  PlayerLevelStatsData playerLevelStatsData = currentLocalPlayer.GetPlayerLevelStatsData(difficultyBeatmap.level.levelID, difficultyBeatmap.difficulty, difficultyBeatmap.parentDifficultyBeatmapSet.beatmapCharacteristic);
                 *  LevelCompletionResults levelCompletionResults = missionCompletionResults.levelCompletionResults;
                 *  playerLevelStatsData.UpdateScoreData(levelCompletionResults.modifiedScore, levelCompletionResults.maxCombo, levelCompletionResults.fullCombo, levelCompletionResults.rank);
                 *  //todo Need change???
                 *  //freePlayCoordinator.GetPrivateField<PlatformLeaderboardsModel>("_platformLeaderboardsModel").AddScoreFromComletionResults(difficultyBeatmap, levelCompletionResults);
                 * }
                 */
                if (!string.IsNullOrWhiteSpace(campaign.completionPost))
                {
                    CompleteSubmission submission = new CompleteSubmission();
                    submission.challengeHash = challenge.GetHash();
                    submission.score         = missionCompletionResults.levelCompletionResults.rawScore;
                    submission.userID        = APITools.UserID;
                    foreach (MissionObjectiveResult objective in missionCompletionResults.missionObjectiveResults)
                    {
                        Requirement requirement = new Requirement();
                        requirement.name  = objective.missionObjective.type.objectiveName;
                        requirement.value = objective.value;
                        submission.requirements.Add(requirement);
                    }
                    __instance.StartCoroutine(submission.Submit(campaign.completionPost));
                }
                __instance.StartCoroutine(CustomCampaignLeaderboard.SubmitScore(challenge, missionCompletionResults));
            }
            return(true);
        }