local ____lualib = require("lualib_bundle")
local __TS__New = ____lualib.__TS__New
local ____exports = {}
local ____CustomGridEntities = require("classes.features.callbackLogic.CustomGridEntities")
local CustomGridEntities = ____CustomGridEntities.CustomGridEntities
local ____CustomRevive = require("classes.features.callbackLogic.CustomRevive")
local CustomRevive = ____CustomRevive.CustomRevive
local ____EsauJrDetection = require("classes.features.callbackLogic.EsauJrDetection")
local EsauJrDetection = ____EsauJrDetection.EsauJrDetection
local ____FlipDetection = require("classes.features.callbackLogic.FlipDetection")
local FlipDetection = ____FlipDetection.FlipDetection
local ____GameReorderedCallbacks = require("classes.features.callbackLogic.GameReorderedCallbacks")
local GameReorderedCallbacks = ____GameReorderedCallbacks.GameReorderedCallbacks
local ____GridEntityCollisionDetection = require("classes.features.callbackLogic.GridEntityCollisionDetection")
local GridEntityCollisionDetection = ____GridEntityCollisionDetection.GridEntityCollisionDetection
local ____GridEntityRenderDetection = require("classes.features.callbackLogic.GridEntityRenderDetection")
local GridEntityRenderDetection = ____GridEntityRenderDetection.GridEntityRenderDetection
local ____GridEntityUpdateDetection = require("classes.features.callbackLogic.GridEntityUpdateDetection")
local GridEntityUpdateDetection = ____GridEntityUpdateDetection.GridEntityUpdateDetection
local ____ItemPickupDetection = require("classes.features.callbackLogic.ItemPickupDetection")
local ItemPickupDetection = ____ItemPickupDetection.ItemPickupDetection
local ____PickupChangeDetection = require("classes.features.callbackLogic.PickupChangeDetection")
local PickupChangeDetection = ____PickupChangeDetection.PickupChangeDetection
local ____PlayerCollectibleDetection = require("classes.features.callbackLogic.PlayerCollectibleDetection")
local PlayerCollectibleDetection = ____PlayerCollectibleDetection.PlayerCollectibleDetection
local ____PlayerReorderedCallbacks = require("classes.features.callbackLogic.PlayerReorderedCallbacks")
local PlayerReorderedCallbacks = ____PlayerReorderedCallbacks.PlayerReorderedCallbacks
local ____SlotDestroyedDetection = require("classes.features.callbackLogic.SlotDestroyedDetection")
local SlotDestroyedDetection = ____SlotDestroyedDetection.SlotDestroyedDetection
local ____SlotRenderDetection = require("classes.features.callbackLogic.SlotRenderDetection")
local SlotRenderDetection = ____SlotRenderDetection.SlotRenderDetection
local ____SlotUpdateDetection = require("classes.features.callbackLogic.SlotUpdateDetection")
local SlotUpdateDetection = ____SlotUpdateDetection.SlotUpdateDetection
local ____CharacterHealthConversion = require("classes.features.other.CharacterHealthConversion")
local CharacterHealthConversion = ____CharacterHealthConversion.CharacterHealthConversion
local ____CharacterStats = require("classes.features.other.CharacterStats")
local CharacterStats = ____CharacterStats.CharacterStats
local ____CollectibleItemPoolType = require("classes.features.other.CollectibleItemPoolType")
local CollectibleItemPoolType = ____CollectibleItemPoolType.CollectibleItemPoolType
local ____CustomHotkeys = require("classes.features.other.CustomHotkeys")
local CustomHotkeys = ____CustomHotkeys.CustomHotkeys
local ____CustomItemPools = require("classes.features.other.CustomItemPools")
local CustomItemPools = ____CustomItemPools.CustomItemPools
local ____CustomPickups = require("classes.features.other.CustomPickups")
local CustomPickups = ____CustomPickups.CustomPickups
local ____CustomStages = require("classes.features.other.CustomStages")
local CustomStages = ____CustomStages.CustomStages
local ____CustomTrapdoors = require("classes.features.other.CustomTrapdoors")
local CustomTrapdoors = ____CustomTrapdoors.CustomTrapdoors
local ____DebugDisplay = require("classes.features.other.DebugDisplay")
local DebugDisplay = ____DebugDisplay.DebugDisplay
local ____DeployJSONRoom = require("classes.features.other.DeployJSONRoom")
local DeployJSONRoom = ____DeployJSONRoom.DeployJSONRoom
local ____DisableAllSound = require("classes.features.other.DisableAllSound")
local DisableAllSound = ____DisableAllSound.DisableAllSound
local ____DisableInputs = require("classes.features.other.DisableInputs")
local DisableInputs = ____DisableInputs.DisableInputs
local ____EdenStartingStatsHealth = require("classes.features.other.EdenStartingStatsHealth")
local EdenStartingStatsHealth = ____EdenStartingStatsHealth.EdenStartingStatsHealth
local ____ExtraConsoleCommands = require("classes.features.other.ExtraConsoleCommands")
local ExtraConsoleCommands = ____ExtraConsoleCommands.ExtraConsoleCommands
local ____FadeInRemover = require("classes.features.other.FadeInRemover")
local FadeInRemover = ____FadeInRemover.FadeInRemover
local ____FastReset = require("classes.features.other.FastReset")
local FastReset = ____FastReset.FastReset
local ____FlyingDetection = require("classes.features.other.FlyingDetection")
local FlyingDetection = ____FlyingDetection.FlyingDetection
local ____ForgottenSwitch = require("classes.features.other.ForgottenSwitch")
local ForgottenSwitch = ____ForgottenSwitch.ForgottenSwitch
local ____ItemPoolDetection = require("classes.features.other.ItemPoolDetection")
local ItemPoolDetection = ____ItemPoolDetection.ItemPoolDetection
local ____ModdedElementDetection = require("classes.features.other.ModdedElementDetection")
local ModdedElementDetection = ____ModdedElementDetection.ModdedElementDetection
local ____ModdedElementSets = require("classes.features.other.ModdedElementSets")
local ModdedElementSets = ____ModdedElementSets.ModdedElementSets
local ____NoSirenSteal = require("classes.features.other.NoSirenSteal")
local NoSirenSteal = ____NoSirenSteal.NoSirenSteal
local ____Pause = require("classes.features.other.Pause")
local Pause = ____Pause.Pause
local ____PersistentEntities = require("classes.features.other.PersistentEntities")
local PersistentEntities = ____PersistentEntities.PersistentEntities
local ____PickupIndexCreation = require("classes.features.other.PickupIndexCreation")
local PickupIndexCreation = ____PickupIndexCreation.PickupIndexCreation
local ____PlayerCollectibleTracking = require("classes.features.other.PlayerCollectibleTracking")
local PlayerCollectibleTracking = ____PlayerCollectibleTracking.PlayerCollectibleTracking
local ____PonyDetection = require("classes.features.other.PonyDetection")
local PonyDetection = ____PonyDetection.PonyDetection
local ____PressInput = require("classes.features.other.PressInput")
local PressInput = ____PressInput.PressInput
local ____PreventChildEntities = require("classes.features.other.PreventChildEntities")
local PreventChildEntities = ____PreventChildEntities.PreventChildEntities
local ____PreventGridEntityRespawn = require("classes.features.other.PreventGridEntityRespawn")
local PreventGridEntityRespawn = ____PreventGridEntityRespawn.PreventGridEntityRespawn
local ____RerunDetection = require("classes.features.other.RerunDetection")
local RerunDetection = ____RerunDetection.RerunDetection
local ____RoomClearFrame = require("classes.features.other.RoomClearFrame")
local RoomClearFrame = ____RoomClearFrame.RoomClearFrame
local ____RoomHistory = require("classes.features.other.RoomHistory")
local RoomHistory = ____RoomHistory.RoomHistory
local ____RunInNFrames = require("classes.features.other.RunInNFrames")
local RunInNFrames = ____RunInNFrames.RunInNFrames
local ____RunNextRoom = require("classes.features.other.RunNextRoom")
local RunNextRoom = ____RunNextRoom.RunNextRoom
local ____RunNextRun = require("classes.features.other.RunNextRun")
local RunNextRun = ____RunNextRun.RunNextRun
local ____SaveDataManager = require("classes.features.other.SaveDataManager")
local SaveDataManager = ____SaveDataManager.SaveDataManager
local ____SpawnRockAltRewards = require("classes.features.other.SpawnRockAltRewards")
local SpawnRockAltRewards = ____SpawnRockAltRewards.SpawnRockAltRewards
local ____StageHistory = require("classes.features.other.StageHistory")
local StageHistory = ____StageHistory.StageHistory
local ____StartAmbush = require("classes.features.other.StartAmbush")
local StartAmbush = ____StartAmbush.StartAmbush
local ____TaintedLazarusPlayers = require("classes.features.other.TaintedLazarusPlayers")
local TaintedLazarusPlayers = ____TaintedLazarusPlayers.TaintedLazarusPlayers
local ____UnlockAchievementsDetection = require("classes.features.other.UnlockAchievementsDetection")
local UnlockAchievementsDetection = ____UnlockAchievementsDetection.UnlockAchievementsDetection
local ____ISCFeature = require("enums.ISCFeature")
local ISCFeature = ____ISCFeature.ISCFeature
local ____ModCallbackCustom = require("enums.ModCallbackCustom")
local ModCallbackCustom = ____ModCallbackCustom.ModCallbackCustom
local ____enums = require("functions.enums")
local validateInterfaceMatchesEnum = ____enums.validateInterfaceMatchesEnum
validateInterfaceMatchesEnum(nil)
function ____exports.getFeatures(self, mod, callbacks)
    local gameReorderedCallbacks = __TS__New(
        GameReorderedCallbacks,
        callbacks[ModCallbackCustom.POST_GAME_STARTED_REORDERED],
        callbacks[ModCallbackCustom.POST_NEW_LEVEL_REORDERED],
        callbacks[ModCallbackCustom.POST_NEW_ROOM_REORDERED],
        callbacks[ModCallbackCustom.POST_GAME_STARTED_REORDERED_LAST]
    )
    local disableAllSound = __TS__New(DisableAllSound)
    local disableInputs = __TS__New(DisableInputs)
    local moddedElementDetection = __TS__New(ModdedElementDetection)
    local ponyDetection = __TS__New(PonyDetection)
    local pressInput = __TS__New(PressInput)
    local roomClearFrame = __TS__New(RoomClearFrame)
    local roomHistory = __TS__New(RoomHistory)
    local runNextRoom = __TS__New(RunNextRoom)
    local saveDataManager = __TS__New(SaveDataManager, mod)
    local stageHistory = __TS__New(StageHistory)
    local runInNFrames = __TS__New(RunInNFrames, roomHistory)
    local pickupIndexCreation = __TS__New(PickupIndexCreation, roomHistory, saveDataManager)
    local customGridEntities = __TS__New(CustomGridEntities, runInNFrames)
    local moddedElementSets = __TS__New(ModdedElementSets, moddedElementDetection)
    local itemPoolDetection = __TS__New(ItemPoolDetection, moddedElementSets)
    local pause = __TS__New(Pause, disableInputs)
    local preventGridEntityRespawn = __TS__New(PreventGridEntityRespawn, runInNFrames)
    local customTrapdoors = __TS__New(
        CustomTrapdoors,
        customGridEntities,
        disableInputs,
        ponyDetection,
        roomClearFrame,
        runInNFrames,
        runNextRoom,
        stageHistory
    )
    local features = {
        [ISCFeature.CUSTOM_REVIVE] = __TS__New(CustomRevive, callbacks[ModCallbackCustom.PRE_CUSTOM_REVIVE], callbacks[ModCallbackCustom.POST_CUSTOM_REVIVE], runInNFrames),
        [ISCFeature.ESAU_JR_DETECTION] = __TS__New(EsauJrDetection, callbacks[ModCallbackCustom.POST_ESAU_JR], callbacks[ModCallbackCustom.POST_FIRST_ESAU_JR]),
        [ISCFeature.FLIP_DETECTION] = __TS__New(FlipDetection, callbacks[ModCallbackCustom.POST_FLIP], callbacks[ModCallbackCustom.POST_FIRST_FLIP]),
        [ISCFeature.GRID_ENTITY_COLLISION_DETECTION] = __TS__New(GridEntityCollisionDetection, callbacks[ModCallbackCustom.POST_GRID_ENTITY_COLLISION], callbacks[ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_COLLISION], customGridEntities),
        [ISCFeature.GRID_ENTITY_UPDATE_DETECTION] = __TS__New(
            GridEntityUpdateDetection,
            callbacks[ModCallbackCustom.POST_GRID_ENTITY_INIT],
            callbacks[ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_INIT],
            callbacks[ModCallbackCustom.POST_GRID_ENTITY_UPDATE],
            callbacks[ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_UPDATE],
            callbacks[ModCallbackCustom.POST_GRID_ENTITY_REMOVE],
            callbacks[ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_REMOVE],
            callbacks[ModCallbackCustom.POST_GRID_ENTITY_STATE_CHANGED],
            callbacks[ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_STATE_CHANGED],
            callbacks[ModCallbackCustom.POST_GRID_ENTITY_BROKEN],
            callbacks[ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_BROKEN],
            customGridEntities
        ),
        [ISCFeature.GRID_ENTITY_RENDER_DETECTION] = __TS__New(GridEntityRenderDetection, callbacks[ModCallbackCustom.POST_GRID_ENTITY_RENDER], callbacks[ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_RENDER], customGridEntities),
        [ISCFeature.GAME_REORDERED_CALLBACKS] = gameReorderedCallbacks,
        [ISCFeature.ITEM_PICKUP_DETECTION] = __TS__New(ItemPickupDetection, callbacks[ModCallbackCustom.POST_ITEM_PICKUP], callbacks[ModCallbackCustom.PRE_ITEM_PICKUP]),
        [ISCFeature.PICKUP_CHANGE_DETECTION] = __TS__New(PickupChangeDetection, callbacks[ModCallbackCustom.POST_PICKUP_CHANGED], pickupIndexCreation),
        [ISCFeature.PLAYER_COLLECTIBLE_DETECTION] = __TS__New(
            PlayerCollectibleDetection,
            callbacks[ModCallbackCustom.POST_PLAYER_COLLECTIBLE_ADDED],
            callbacks[ModCallbackCustom.POST_PLAYER_COLLECTIBLE_REMOVED],
            moddedElementSets,
            runInNFrames
        ),
        [ISCFeature.PLAYER_REORDERED_CALLBACKS] = __TS__New(PlayerReorderedCallbacks, callbacks[ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED], callbacks[ModCallbackCustom.POST_PLAYER_RENDER_REORDERED], callbacks[ModCallbackCustom.POST_PLAYER_UPDATE_REORDERED]),
        [ISCFeature.SLOT_DESTROYED_DETECTION] = __TS__New(SlotDestroyedDetection, callbacks[ModCallbackCustom.POST_SLOT_DESTROYED], roomHistory),
        [ISCFeature.SLOT_RENDER_DETECTION] = __TS__New(SlotRenderDetection, callbacks[ModCallbackCustom.POST_SLOT_RENDER], callbacks[ModCallbackCustom.POST_SLOT_ANIMATION_CHANGED]),
        [ISCFeature.SLOT_UPDATE_DETECTION] = __TS__New(SlotUpdateDetection, callbacks[ModCallbackCustom.POST_SLOT_INIT], callbacks[ModCallbackCustom.POST_SLOT_UPDATE]),
        [ISCFeature.CHARACTER_HEALTH_CONVERSION] = __TS__New(CharacterHealthConversion),
        [ISCFeature.CHARACTER_STATS] = __TS__New(CharacterStats),
        [ISCFeature.COLLECTIBLE_ITEM_POOL_TYPE] = __TS__New(CollectibleItemPoolType, pickupIndexCreation),
        [ISCFeature.CUSTOM_GRID_ENTITIES] = customGridEntities,
        [ISCFeature.CUSTOM_ITEM_POOLS] = __TS__New(CustomItemPools),
        [ISCFeature.CUSTOM_HOTKEYS] = __TS__New(CustomHotkeys),
        [ISCFeature.CUSTOM_PICKUPS] = __TS__New(CustomPickups),
        [ISCFeature.CUSTOM_STAGES] = __TS__New(
            CustomStages,
            customGridEntities,
            customTrapdoors,
            disableAllSound,
            gameReorderedCallbacks,
            pause,
            runInNFrames
        ),
        [ISCFeature.CUSTOM_TRAPDOORS] = customTrapdoors,
        [ISCFeature.DEBUG_DISPLAY] = __TS__New(DebugDisplay, mod),
        [ISCFeature.DEPLOY_JSON_ROOM] = __TS__New(DeployJSONRoom, preventGridEntityRespawn),
        [ISCFeature.DISABLE_ALL_SOUND] = disableAllSound,
        [ISCFeature.DISABLE_INPUTS] = disableInputs,
        [ISCFeature.EDEN_STARTING_STATS_HEALTH] = __TS__New(EdenStartingStatsHealth),
        [ISCFeature.FADE_IN_REMOVER] = __TS__New(FadeInRemover),
        [ISCFeature.FAST_RESET] = __TS__New(FastReset),
        [ISCFeature.FLYING_DETECTION] = __TS__New(FlyingDetection, moddedElementSets),
        [ISCFeature.FORGOTTEN_SWITCH] = __TS__New(ForgottenSwitch, pressInput),
        [ISCFeature.EXTRA_CONSOLE_COMMANDS] = __TS__New(ExtraConsoleCommands),
        [ISCFeature.ITEM_POOL_DETECTION] = itemPoolDetection,
        [ISCFeature.MODDED_ELEMENT_DETECTION] = moddedElementDetection,
        [ISCFeature.MODDED_ELEMENT_SETS] = moddedElementSets,
        [ISCFeature.NO_SIREN_STEAL] = __TS__New(NoSirenSteal),
        [ISCFeature.PAUSE] = pause,
        [ISCFeature.PERSISTENT_ENTITIES] = __TS__New(PersistentEntities, roomHistory),
        [ISCFeature.PICKUP_INDEX_CREATION] = pickupIndexCreation,
        [ISCFeature.PLAYER_COLLECTIBLE_TRACKING] = __TS__New(PlayerCollectibleTracking),
        [ISCFeature.PONY_DETECTION] = ponyDetection,
        [ISCFeature.PRESS_INPUT] = pressInput,
        [ISCFeature.PREVENT_CHILD_ENTITIES] = __TS__New(PreventChildEntities),
        [ISCFeature.PREVENT_GRID_ENTITY_RESPAWN] = preventGridEntityRespawn,
        [ISCFeature.RERUN_DETECTION] = __TS__New(RerunDetection),
        [ISCFeature.ROOM_CLEAR_FRAME] = roomClearFrame,
        [ISCFeature.ROOM_HISTORY] = roomHistory,
        [ISCFeature.RUN_IN_N_FRAMES] = runInNFrames,
        [ISCFeature.RUN_NEXT_ROOM] = runNextRoom,
        [ISCFeature.RUN_NEXT_RUN] = __TS__New(RunNextRun),
        [ISCFeature.SAVE_DATA_MANAGER] = saveDataManager,
        [ISCFeature.SPAWN_ALT_ROCK_REWARDS] = __TS__New(SpawnRockAltRewards, itemPoolDetection),
        [ISCFeature.STAGE_HISTORY] = stageHistory,
        [ISCFeature.START_AMBUSH] = __TS__New(StartAmbush, runInNFrames),
        [ISCFeature.TAINTED_LAZARUS_PLAYERS] = __TS__New(TaintedLazarusPlayers),
        [ISCFeature.UNLOCK_ACHIEVEMENTS_DETECTION] = __TS__New(UnlockAchievementsDetection)
    }
    return features
end
return ____exports
