// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.core;

import com.hypixel.hytale.common.semver.SemverRange;
import java.time.Duration;
import com.hypixel.hytale.server.core.codec.ProtocolCodecs;
import com.hypixel.hytale.protocol.GameMode;
import java.util.Optional;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.DocumentContainingCodec;
import java.util.Iterator;
import com.hypixel.hytale.server.core.util.BsonUtil;
import com.hypixel.hytale.codec.ExtraInfo;
import java.util.concurrent.CompletableFuture;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.util.RawJsonReader;
import com.hypixel.hytale.logger.HytaleLogger;
import joptsimple.OptionSpec;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import org.bson.BsonValue;
import java.util.Collections;
import java.util.concurrent.ConcurrentHashMap;
import com.hypixel.hytale.server.core.auth.AuthCredentialStoreProvider;
import org.bson.BsonDocument;
import com.hypixel.hytale.server.core.universe.playerdata.PlayerStorageProvider;
import javax.annotation.Nullable;
import com.hypixel.hytale.common.plugin.PluginIdentifier;
import java.util.logging.Level;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import javax.annotation.Nonnull;
import java.nio.file.Path;

public class HytaleServerConfig
{
    public static final int VERSION = 3;
    public static final int DEFAULT_MAX_VIEW_RADIUS = 32;
    @Nonnull
    public static final Path PATH;
    @Nonnull
    public static final BuilderCodec<HytaleServerConfig> CODEC;
    @Nonnull
    private final transient AtomicBoolean hasChanged;
    private String serverName;
    private String motd;
    private String password;
    private int maxPlayers;
    private int maxViewRadius;
    @Nonnull
    private Defaults defaults;
    @Nonnull
    private TimeoutProfile connectionTimeouts;
    @Nonnull
    private RateLimitConfig rateLimitConfig;
    @Nonnull
    private Map<String, Module> modules;
    @Nonnull
    private Map<String, Level> logLevels;
    @Nullable
    private transient Map<PluginIdentifier, ModConfig> legacyPluginConfig;
    @Nonnull
    private Map<PluginIdentifier, ModConfig> modConfig;
    @Nonnull
    private Map<String, Module> unmodifiableModules;
    @Nonnull
    private Map<String, Level> unmodifiableLogLevels;
    @Nonnull
    private PlayerStorageProvider playerStorageProvider;
    @Nullable
    private BsonDocument authCredentialStoreConfig;
    @Nullable
    private transient AuthCredentialStoreProvider authCredentialStoreProvider;
    private boolean displayTmpTagsInStrings;
    @Nonnull
    private UpdateConfig updateConfig;
    
    public HytaleServerConfig() {
        this.hasChanged = new AtomicBoolean();
        this.serverName = "Hytale Server";
        this.motd = "";
        this.password = "";
        this.maxPlayers = 100;
        this.maxViewRadius = 32;
        this.defaults = new Defaults(this);
        this.connectionTimeouts = new TimeoutProfile(this);
        this.rateLimitConfig = new RateLimitConfig(this);
        this.modules = new ConcurrentHashMap<String, Module>();
        this.logLevels = Collections.emptyMap();
        this.modConfig = new ConcurrentHashMap<PluginIdentifier, ModConfig>();
        this.unmodifiableModules = Collections.unmodifiableMap((Map<? extends String, ? extends Module>)this.modules);
        this.unmodifiableLogLevels = Collections.unmodifiableMap((Map<? extends String, ? extends Level>)this.logLevels);
        this.playerStorageProvider = PlayerStorageProvider.CODEC.getDefault();
        this.authCredentialStoreConfig = null;
        this.authCredentialStoreProvider = null;
        this.updateConfig = new UpdateConfig(this);
    }
    
    public String getServerName() {
        return this.serverName;
    }
    
    public void setServerName(@Nonnull final String serverName) {
        this.serverName = serverName;
        this.markChanged();
    }
    
    public String getMotd() {
        return this.motd;
    }
    
    public void setMotd(@Nonnull final String motd) {
        this.motd = motd;
        this.markChanged();
    }
    
    public String getPassword() {
        return this.password;
    }
    
    public void setPassword(@Nonnull final String password) {
        this.password = password;
        this.markChanged();
    }
    
    public boolean isDisplayTmpTagsInStrings() {
        return this.displayTmpTagsInStrings;
    }
    
    public void setDisplayTmpTagsInStrings(final boolean displayTmpTagsInStrings) {
        this.displayTmpTagsInStrings = displayTmpTagsInStrings;
    }
    
    public int getMaxPlayers() {
        return this.maxPlayers;
    }
    
    public void setMaxPlayers(final int maxPlayers) {
        this.maxPlayers = maxPlayers;
        this.markChanged();
    }
    
    public int getMaxViewRadius() {
        return this.maxViewRadius;
    }
    
    public void setMaxViewRadius(final int maxViewRadius) {
        this.maxViewRadius = maxViewRadius;
        this.markChanged();
    }
    
    @Nonnull
    public Defaults getDefaults() {
        return this.defaults;
    }
    
    public void setDefaults(@Nonnull final Defaults defaults) {
        this.defaults = defaults;
        this.markChanged();
    }
    
    @Nonnull
    public TimeoutProfile getConnectionTimeouts() {
        return this.connectionTimeouts;
    }
    
    public void setConnectionTimeouts(@Nonnull final TimeoutProfile connectionTimeouts) {
        this.connectionTimeouts = connectionTimeouts;
        this.markChanged();
    }
    
    @Nonnull
    public RateLimitConfig getRateLimitConfig() {
        return this.rateLimitConfig;
    }
    
    public void setRateLimitConfig(@Nonnull final RateLimitConfig rateLimitConfig) {
        this.rateLimitConfig = rateLimitConfig;
        this.markChanged();
    }
    
    @Nonnull
    public Map<String, Module> getModules() {
        return this.unmodifiableModules;
    }
    
    @Nonnull
    public Module getModule(final String moduleName) {
        return this.modules.computeIfAbsent(moduleName, k -> new Module(this));
    }
    
    public void setModules(@Nonnull final Map<String, Module> modules) {
        this.modules = modules;
        this.markChanged();
    }
    
    @Nonnull
    public Map<String, Level> getLogLevels() {
        return this.unmodifiableLogLevels;
    }
    
    public void setLogLevels(@Nonnull final Map<String, Level> logLevels) {
        this.logLevels = logLevels;
        this.markChanged();
    }
    
    @Nonnull
    public Map<PluginIdentifier, ModConfig> getModConfig() {
        return this.modConfig;
    }
    
    public void setModConfig(@Nonnull final Map<PluginIdentifier, ModConfig> modConfig) {
        this.modConfig = modConfig;
        this.markChanged();
    }
    
    @Nonnull
    public PlayerStorageProvider getPlayerStorageProvider() {
        return this.playerStorageProvider;
    }
    
    public void setPlayerStorageProvider(@Nonnull final PlayerStorageProvider playerStorageProvider) {
        this.playerStorageProvider = playerStorageProvider;
        this.markChanged();
    }
    
    @Nonnull
    public AuthCredentialStoreProvider getAuthCredentialStoreProvider() {
        if (this.authCredentialStoreProvider != null) {
            return this.authCredentialStoreProvider;
        }
        if (this.authCredentialStoreConfig != null) {
            this.authCredentialStoreProvider = AuthCredentialStoreProvider.CODEC.decode(this.authCredentialStoreConfig);
        }
        else {
            this.authCredentialStoreProvider = AuthCredentialStoreProvider.CODEC.getDefault();
        }
        return this.authCredentialStoreProvider;
    }
    
    public void setAuthCredentialStoreProvider(@Nonnull final AuthCredentialStoreProvider provider) {
        this.authCredentialStoreProvider = provider;
        this.authCredentialStoreConfig = (BsonDocument)AuthCredentialStoreProvider.CODEC.encode((T)provider);
        this.markChanged();
    }
    
    @Nonnull
    public UpdateConfig getUpdateConfig() {
        return this.updateConfig;
    }
    
    public void setUpdateConfig(@Nonnull final UpdateConfig updateConfig) {
        this.updateConfig = updateConfig;
        this.markChanged();
    }
    
    public void removeModule(@Nonnull final String module) {
        this.modules.remove(module);
        this.markChanged();
    }
    
    public void markChanged() {
        this.hasChanged.set(true);
    }
    
    public boolean consumeHasChanged() {
        return this.hasChanged.getAndSet(false);
    }
    
    @Nonnull
    public static HytaleServerConfig load() {
        return load(HytaleServerConfig.PATH);
    }
    
    @Nonnull
    public static HytaleServerConfig load(@Nonnull final Path path) {
        if (!Files.isRegularFile(path, new LinkOption[0])) {
            final HytaleServerConfig hytaleServerConfig = new HytaleServerConfig();
            if (!Options.getOptionSet().has(Options.BARE)) {
                save(hytaleServerConfig).join();
            }
            return hytaleServerConfig;
        }
        try {
            final HytaleServerConfig config = RawJsonReader.readSyncWithBak(path, HytaleServerConfig.CODEC, HytaleLogger.getLogger());
            if (config == null) {
                throw new RuntimeException("Failed to load server config from " + String.valueOf(path));
            }
            return config;
        }
        catch (final Exception e) {
            throw new RuntimeException("Failed to read server config!", e);
        }
    }
    
    @Nonnull
    public static CompletableFuture<Void> save(@Nonnull final HytaleServerConfig hytaleServerConfig) {
        return save(HytaleServerConfig.PATH, hytaleServerConfig);
    }
    
    @Nonnull
    public static CompletableFuture<Void> save(@Nonnull final Path path, @Nonnull final HytaleServerConfig hytaleServerConfig) {
        final BsonDocument document = HytaleServerConfig.CODEC.encode(hytaleServerConfig, (ExtraInfo)ExtraInfo.THREAD_LOCAL.get()).asDocument();
        return BsonUtil.writeDocument(path, document);
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     3: iconst_0       
        //     4: anewarray       Ljava/lang/String;
        //     7: invokestatic    java/nio/file/Path.of:(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;
        //    10: putstatic       com/hypixel/hytale/server/core/HytaleServerConfig.PATH:Ljava/nio/file/Path;
        //    13: getstatic       com/hypixel/hytale/server/core/universe/playerdata/PlayerStorageProvider.CODEC:Lcom/hypixel/hytale/codec/lookup/BuilderCodecMapCodec;
        //    16: getstatic       com/hypixel/hytale/codec/lookup/Priority.DEFAULT:Lcom/hypixel/hytale/codec/lookup/Priority;
        //    19: ldc_w           "Hytale"
        //    22: ldc_w           Lcom/hypixel/hytale/server/core/universe/playerdata/DefaultPlayerStorageProvider;.class
        //    25: getstatic       com/hypixel/hytale/server/core/universe/playerdata/DefaultPlayerStorageProvider.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //    28: invokevirtual   com/hypixel/hytale/codec/lookup/BuilderCodecMapCodec.register:(Lcom/hypixel/hytale/codec/lookup/Priority;Ljava/lang/String;Ljava/lang/Class;Lcom/hypixel/hytale/codec/Codec;)Lcom/hypixel/hytale/codec/lookup/StringCodecMapCodec;
        //    31: pop            
        //    32: getstatic       com/hypixel/hytale/server/core/universe/playerdata/PlayerStorageProvider.CODEC:Lcom/hypixel/hytale/codec/lookup/BuilderCodecMapCodec;
        //    35: ldc_w           "Disk"
        //    38: ldc_w           Lcom/hypixel/hytale/server/core/universe/playerdata/DiskPlayerStorageProvider;.class
        //    41: getstatic       com/hypixel/hytale/server/core/universe/playerdata/DiskPlayerStorageProvider.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //    44: invokevirtual   com/hypixel/hytale/codec/lookup/BuilderCodecMapCodec.register:(Ljava/lang/Object;Ljava/lang/Class;Lcom/hypixel/hytale/codec/Codec;)Lcom/hypixel/hytale/codec/lookup/ACodecMapCodec;
        //    47: pop            
        //    48: getstatic       com/hypixel/hytale/server/core/HytaleServerConfig$Module.BUILDER_CODEC_BUILDER:Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    51: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    54: dup            
        //    55: ldc_w           "Modules"
        //    58: new             Lcom/hypixel/hytale/codec/codecs/map/MapCodec;
        //    61: dup            
        //    62: getstatic       com/hypixel/hytale/server/core/HytaleServerConfig$Module.CODEC:Lcom/hypixel/hytale/codec/DocumentContainingCodec;
        //    65: invokedynamic   BootstrapMethod #3, get:()Ljava/util/function/Supplier;
        //    70: iconst_0       
        //    71: invokespecial   com/hypixel/hytale/codec/codecs/map/MapCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/Supplier;Z)V
        //    74: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    77: invokedynamic   BootstrapMethod #4, accept:()Ljava/util/function/BiConsumer;
        //    82: invokedynamic   BootstrapMethod #5, apply:()Ljava/util/function/Function;
        //    87: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    90: pop            
        //    91: ldc             Lcom/hypixel/hytale/server/core/HytaleServerConfig;.class
        //    93: invokedynamic   BootstrapMethod #6, get:()Ljava/util/function/Supplier;
        //    98: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   101: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.versioned:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   104: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   107: iconst_3       
        //   108: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.codecVersion:(I)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   111: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   114: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   117: dup            
        //   118: ldc_w           "ServerName"
        //   121: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //   124: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   127: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
        //   132: invokedynamic   BootstrapMethod #8, apply:()Ljava/util/function/Function;
        //   137: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   140: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   143: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   146: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   149: dup            
        //   150: ldc_w           "MOTD"
        //   153: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //   156: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   159: invokedynamic   BootstrapMethod #9, accept:()Ljava/util/function/BiConsumer;
        //   164: invokedynamic   BootstrapMethod #10, apply:()Ljava/util/function/Function;
        //   169: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   172: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   175: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   178: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   181: dup            
        //   182: ldc_w           "Password"
        //   185: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //   188: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   191: invokedynamic   BootstrapMethod #11, accept:()Ljava/util/function/BiConsumer;
        //   196: invokedynamic   BootstrapMethod #12, apply:()Ljava/util/function/Function;
        //   201: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   204: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   207: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   210: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   213: dup            
        //   214: ldc_w           "MaxPlayers"
        //   217: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
        //   220: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   223: invokedynamic   BootstrapMethod #13, accept:()Ljava/util/function/BiConsumer;
        //   228: invokedynamic   BootstrapMethod #14, apply:()Ljava/util/function/Function;
        //   233: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   236: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   239: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   242: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   245: dup            
        //   246: ldc_w           "MaxViewRadius"
        //   249: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
        //   252: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   255: invokedynamic   BootstrapMethod #15, accept:()Ljava/util/function/BiConsumer;
        //   260: invokedynamic   BootstrapMethod #16, apply:()Ljava/util/function/Function;
        //   265: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   268: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   271: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   274: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   277: dup            
        //   278: ldc_w           "Defaults"
        //   281: getstatic       com/hypixel/hytale/server/core/HytaleServerConfig$Defaults.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   284: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   287: invokedynamic   BootstrapMethod #17, accept:()Ljava/util/function/BiConsumer;
        //   292: invokedynamic   BootstrapMethod #18, apply:()Ljava/util/function/Function;
        //   297: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   300: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   303: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   306: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   309: dup            
        //   310: ldc_w           "ConnectionTimeouts"
        //   313: getstatic       com/hypixel/hytale/server/core/HytaleServerConfig$TimeoutProfile.CODEC:Lcom/hypixel/hytale/codec/Codec;
        //   316: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   319: invokedynamic   BootstrapMethod #19, accept:()Ljava/util/function/BiConsumer;
        //   324: invokedynamic   BootstrapMethod #20, apply:()Ljava/util/function/Function;
        //   329: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   332: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   335: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   338: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   341: dup            
        //   342: ldc_w           "RateLimit"
        //   345: getstatic       com/hypixel/hytale/server/core/HytaleServerConfig$RateLimitConfig.CODEC:Lcom/hypixel/hytale/codec/Codec;
        //   348: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   351: invokedynamic   BootstrapMethod #21, accept:()Ljava/util/function/BiConsumer;
        //   356: invokedynamic   BootstrapMethod #22, apply:()Ljava/util/function/Function;
        //   361: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   364: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   367: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   370: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   373: dup            
        //   374: ldc_w           "Modules"
        //   377: new             Lcom/hypixel/hytale/codec/codecs/map/MapCodec;
        //   380: dup            
        //   381: getstatic       com/hypixel/hytale/server/core/HytaleServerConfig$Module.CODEC:Lcom/hypixel/hytale/codec/DocumentContainingCodec;
        //   384: invokedynamic   BootstrapMethod #3, get:()Ljava/util/function/Supplier;
        //   389: iconst_0       
        //   390: invokespecial   com/hypixel/hytale/codec/codecs/map/MapCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/Supplier;Z)V
        //   393: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   396: invokedynamic   BootstrapMethod #23, accept:()Ljava/util/function/BiConsumer;
        //   401: invokedynamic   BootstrapMethod #24, apply:()Ljava/util/function/Function;
        //   406: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   409: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   412: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   415: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   418: dup            
        //   419: ldc_w           "LogLevels"
        //   422: new             Lcom/hypixel/hytale/codec/codecs/map/MapCodec;
        //   425: dup            
        //   426: getstatic       com/hypixel/hytale/codec/Codec.LOG_LEVEL:Lcom/hypixel/hytale/codec/function/FunctionCodec;
        //   429: invokedynamic   BootstrapMethod #3, get:()Ljava/util/function/Supplier;
        //   434: iconst_0       
        //   435: invokespecial   com/hypixel/hytale/codec/codecs/map/MapCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/Supplier;Z)V
        //   438: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   441: invokedynamic   BootstrapMethod #25, accept:()Ljava/util/function/BiConsumer;
        //   446: invokedynamic   BootstrapMethod #26, apply:()Ljava/util/function/Function;
        //   451: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   454: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   457: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   460: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   463: dup            
        //   464: ldc_w           "Plugins"
        //   467: new             Lcom/hypixel/hytale/codec/codecs/map/ObjectMapCodec;
        //   470: dup            
        //   471: getstatic       com/hypixel/hytale/server/core/HytaleServerConfig$ModConfig.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   474: invokedynamic   BootstrapMethod #27, get:()Ljava/util/function/Supplier;
        //   479: invokedynamic   BootstrapMethod #28, apply:()Ljava/util/function/Function;
        //   484: invokedynamic   BootstrapMethod #29, apply:()Ljava/util/function/Function;
        //   489: iconst_0       
        //   490: invokespecial   com/hypixel/hytale/codec/codecs/map/ObjectMapCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/Supplier;Ljava/util/function/Function;Ljava/util/function/Function;Z)V
        //   493: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   496: invokedynamic   BootstrapMethod #30, accept:()Ljava/util/function/BiConsumer;
        //   501: invokedynamic   BootstrapMethod #31, apply:()Ljava/util/function/Function;
        //   506: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   509: iconst_0       
        //   510: iconst_2       
        //   511: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.setVersionRange:(II)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   514: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   517: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   520: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   523: dup            
        //   524: ldc_w           "Mods"
        //   527: new             Lcom/hypixel/hytale/codec/codecs/map/ObjectMapCodec;
        //   530: dup            
        //   531: getstatic       com/hypixel/hytale/server/core/HytaleServerConfig$ModConfig.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   534: invokedynamic   BootstrapMethod #3, get:()Ljava/util/function/Supplier;
        //   539: invokedynamic   BootstrapMethod #28, apply:()Ljava/util/function/Function;
        //   544: invokedynamic   BootstrapMethod #29, apply:()Ljava/util/function/Function;
        //   549: iconst_0       
        //   550: invokespecial   com/hypixel/hytale/codec/codecs/map/ObjectMapCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/Supplier;Ljava/util/function/Function;Ljava/util/function/Function;Z)V
        //   553: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   556: invokedynamic   BootstrapMethod #32, accept:()Ljava/util/function/BiConsumer;
        //   561: invokedynamic   BootstrapMethod #33, apply:()Ljava/util/function/Function;
        //   566: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   569: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   572: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   575: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   578: dup            
        //   579: ldc_w           "DisplayTmpTagsInStrings"
        //   582: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
        //   585: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   588: invokedynamic   BootstrapMethod #34, accept:()Ljava/util/function/BiConsumer;
        //   593: invokedynamic   BootstrapMethod #35, apply:()Ljava/util/function/Function;
        //   598: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   601: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   604: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   607: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   610: dup            
        //   611: ldc_w           "PlayerStorage"
        //   614: getstatic       com/hypixel/hytale/server/core/universe/playerdata/PlayerStorageProvider.CODEC:Lcom/hypixel/hytale/codec/lookup/BuilderCodecMapCodec;
        //   617: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   620: invokedynamic   BootstrapMethod #36, accept:()Ljava/util/function/BiConsumer;
        //   625: invokedynamic   BootstrapMethod #37, apply:()Ljava/util/function/Function;
        //   630: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   633: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   636: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   639: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   642: dup            
        //   643: ldc_w           "AuthCredentialStore"
        //   646: getstatic       com/hypixel/hytale/codec/Codec.BSON_DOCUMENT:Lcom/hypixel/hytale/codec/codecs/BsonDocumentCodec;
        //   649: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   652: invokedynamic   BootstrapMethod #38, accept:()Ljava/util/function/BiConsumer;
        //   657: invokedynamic   BootstrapMethod #39, apply:()Ljava/util/function/Function;
        //   662: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   665: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   668: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   671: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   674: dup            
        //   675: ldc_w           "Update"
        //   678: getstatic       com/hypixel/hytale/server/core/HytaleServerConfig$UpdateConfig.CODEC:Lcom/hypixel/hytale/codec/Codec;
        //   681: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   684: invokedynamic   BootstrapMethod #40, accept:()Ljava/util/function/BiConsumer;
        //   689: invokedynamic   BootstrapMethod #41, apply:()Ljava/util/function/Function;
        //   694: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   697: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   700: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   703: invokedynamic   BootstrapMethod #42, accept:()Ljava/util/function/Consumer;
        //   708: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.afterDecode:(Ljava/util/function/Consumer;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   711: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   714: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   717: putstatic       com/hypixel/hytale/server/core/HytaleServerConfig.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   720: return         
        // 
        // The error that occurred was:
        // 
        // java.lang.UnsupportedOperationException: The requested operation is not supported.
        //     at com.strobel.util.ContractUtils.unsupported(ContractUtils.java:27)
        //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:284)
        //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:279)
        //     at com.strobel.assembler.metadata.TypeReference.makeGenericType(TypeReference.java:154)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:225)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
        //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:211)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
        //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitMethod(TypeSubstitutionVisitor.java:314)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2611)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1083)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:684)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypesForVariables(TypeAnalysis.java:593)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:405)
        //     at com.strobel.decompiler.ast.TypeAnalysis.run(TypeAnalysis.java:95)
        //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:109)
        //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:42)
        //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:206)
        //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:93)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethodBody(AstBuilder.java:868)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethod(AstBuilder.java:761)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:638)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:605)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:195)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createType(AstBuilder.java:162)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addType(AstBuilder.java:137)
        //     at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:71)
        //     at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59)
        //     at com.strobel.decompiler.DecompilerDriver.decompileType(DecompilerDriver.java:333)
        //     at com.strobel.decompiler.DecompilerDriver.decompileJar(DecompilerDriver.java:254)
        //     at com.strobel.decompiler.DecompilerDriver.main(DecompilerDriver.java:129)
        // 
        throw new IllegalStateException("An error occurred while decompiling this method.");
    }
    
    public static class Module
    {
        @Nonnull
        protected static BuilderCodec.Builder<Module> BUILDER_CODEC_BUILDER;
        @Nonnull
        protected static BuilderCodec<Module> BUILDER_CODEC;
        @Nonnull
        public static final DocumentContainingCodec<Module> CODEC;
        private transient HytaleServerConfig hytaleServerConfig;
        private Boolean enabled;
        @Nonnull
        private Map<String, Module> modules;
        @Nonnull
        private BsonDocument document;
        
        private Module() {
            this.modules = new ConcurrentHashMap<String, Module>();
            this.document = new BsonDocument();
        }
        
        private Module(@Nonnull final HytaleServerConfig hytaleServerConfig) {
            this.modules = new ConcurrentHashMap<String, Module>();
            this.document = new BsonDocument();
            this.hytaleServerConfig = hytaleServerConfig;
        }
        
        public boolean isEnabled(final boolean def) {
            return (this.enabled != null) ? this.enabled : def;
        }
        
        public void setEnabled(final boolean enabled) {
            this.enabled = enabled;
            this.hytaleServerConfig.markChanged();
        }
        
        public Boolean getEnabled() {
            return this.enabled;
        }
        
        @Nonnull
        public Map<String, Module> getModules() {
            return Collections.unmodifiableMap((Map<? extends String, ? extends Module>)this.modules);
        }
        
        @Nonnull
        public Module getModule(@Nonnull final String moduleName) {
            return this.modules.computeIfAbsent(moduleName, k -> new Module(this.hytaleServerConfig));
        }
        
        public void setModules(@Nonnull final Map<String, Module> modules) {
            this.modules = modules;
            this.hytaleServerConfig.markChanged();
        }
        
        @Nonnull
        public BsonDocument getDocument() {
            return this.document;
        }
        
        @Nullable
        public <T> T decode(@Nonnull final Codec<T> codec) {
            return codec.decode(this.document);
        }
        
        public <T> void encode(@Nonnull final Codec<T> codec, @Nonnull final T t) {
            this.document = codec.encode(t).asDocument();
        }
        
        @Nonnull
        public <T> Optional<T> getData(@Nonnull final KeyedCodec<T> keyedCodec) {
            return keyedCodec.get(this.document);
        }
        
        @Nullable
        public <T> T getDataOrNull(@Nonnull final KeyedCodec<T> keyedCodec) {
            return keyedCodec.getOrNull(this.document);
        }
        
        public <T> T getDataNow(@Nonnull final KeyedCodec<T> keyedCodec) {
            return keyedCodec.getNow(this.document);
        }
        
        public <T> void put(@Nonnull final KeyedCodec<T> keyedCodec, final T t) {
            keyedCodec.put(this.document, t);
            this.hytaleServerConfig.markChanged();
        }
        
        public void setDocument(@Nonnull final BsonDocument document) {
            this.document = document;
            this.hytaleServerConfig.markChanged();
        }
        
        void setHytaleServerConfig(@Nonnull final HytaleServerConfig hytaleServerConfig) {
            this.hytaleServerConfig = hytaleServerConfig;
            this.modules.values().forEach(module -> module.setHytaleServerConfig(hytaleServerConfig));
        }
        
        static {
            Module.BUILDER_CODEC_BUILDER = BuilderCodec.builder(Module.class, Module::new).addField(new KeyedCodec<Boolean>("Enabled", Codec.BOOLEAN), (o, i) -> o.enabled = i, o -> o.enabled);
            Module.BUILDER_CODEC = Module.BUILDER_CODEC_BUILDER.build();
            CODEC = new DocumentContainingCodec<Module>(Module.BUILDER_CODEC, (o, i) -> o.document = i, o -> o.document);
        }
    }
    
    public static class Defaults
    {
        public static final KeyedCodec<String> WORLD;
        public static final KeyedCodec<GameMode> GAMEMODE;
        public static final BuilderCodec<Defaults> CODEC;
        private transient HytaleServerConfig hytaleServerConfig;
        private String world;
        private GameMode gameMode;
        
        private Defaults() {
            this.world = "default";
            this.gameMode = GameMode.Adventure;
        }
        
        private Defaults(final HytaleServerConfig hytaleServerConfig) {
            this.world = "default";
            this.gameMode = GameMode.Adventure;
            this.hytaleServerConfig = hytaleServerConfig;
        }
        
        public String getWorld() {
            return this.world;
        }
        
        public void setWorld(final String world) {
            this.world = world;
            this.hytaleServerConfig.markChanged();
        }
        
        public GameMode getGameMode() {
            return this.gameMode;
        }
        
        public void setGameMode(final GameMode gameMode) {
            this.gameMode = gameMode;
            this.hytaleServerConfig.markChanged();
        }
        
        static {
            WORLD = new KeyedCodec<String>("World", Codec.STRING);
            GAMEMODE = new KeyedCodec<GameMode>("GameMode", ProtocolCodecs.GAMEMODE_LEGACY);
            CODEC = BuilderCodec.builder(Defaults.class, Defaults::new).addField(Defaults.WORLD, (o, i) -> o.world = i, o -> o.world).addField(Defaults.GAMEMODE, (o, s) -> o.gameMode = s, o -> o.gameMode).build();
        }
    }
    
    public static class TimeoutProfile
    {
        private static final TimeoutProfile SINGLEPLAYER_DEFAULTS;
        private static final TimeoutProfile MULTIPLAYER_DEFAULTS;
        public static final Codec<TimeoutProfile> CODEC;
        private Duration initial;
        private Duration auth;
        private Duration authGrant;
        private Duration authToken;
        private Duration authServerExchange;
        private Duration password;
        private Duration play;
        private Duration setupWorldSettings;
        private Duration setupAssetsRequest;
        private Duration setupSendAssets;
        private Duration setupAddToUniverse;
        private transient HytaleServerConfig hytaleServerConfig;
        
        public static TimeoutProfile defaults() {
            return Constants.SINGLEPLAYER ? TimeoutProfile.SINGLEPLAYER_DEFAULTS : TimeoutProfile.MULTIPLAYER_DEFAULTS;
        }
        
        public TimeoutProfile() {
        }
        
        public TimeoutProfile(final HytaleServerConfig hytaleServerConfig) {
            this.hytaleServerConfig = hytaleServerConfig;
        }
        
        private TimeoutProfile(final Duration initial, final Duration auth, final Duration authGrant, final Duration authToken, final Duration authServerExchange, final Duration password, final Duration play, final Duration worldSettings, final Duration assetsRequest, final Duration sendAssets, final Duration addToUniverse) {
            this.initial = initial;
            this.auth = auth;
            this.authGrant = authGrant;
            this.authToken = authToken;
            this.authServerExchange = authServerExchange;
            this.password = password;
            this.play = play;
            this.setupWorldSettings = worldSettings;
            this.setupAssetsRequest = assetsRequest;
            this.setupSendAssets = sendAssets;
            this.setupAddToUniverse = addToUniverse;
        }
        
        public Duration getInitial() {
            return (this.initial != null) ? this.initial : defaults().initial;
        }
        
        public void setInitial(final Duration d) {
            this.initial = d;
            this.markChanged();
        }
        
        public Duration getAuth() {
            return (this.auth != null) ? this.auth : defaults().auth;
        }
        
        public void setAuth(final Duration d) {
            this.auth = d;
            this.markChanged();
        }
        
        public Duration getAuthGrant() {
            return (this.authGrant != null) ? this.authGrant : defaults().authGrant;
        }
        
        public void setAuthGrant(final Duration d) {
            this.authGrant = d;
            this.markChanged();
        }
        
        public Duration getAuthToken() {
            return (this.authToken != null) ? this.authToken : defaults().authToken;
        }
        
        public void setAuthToken(final Duration d) {
            this.authToken = d;
            this.markChanged();
        }
        
        public Duration getAuthServerExchange() {
            return (this.authServerExchange != null) ? this.authServerExchange : defaults().authServerExchange;
        }
        
        public void setAuthServerExchange(final Duration d) {
            this.authServerExchange = d;
            this.markChanged();
        }
        
        public Duration getPassword() {
            return (this.password != null) ? this.password : defaults().password;
        }
        
        public void setPassword(final Duration d) {
            this.password = d;
            this.markChanged();
        }
        
        public Duration getPlay() {
            return (this.play != null) ? this.play : defaults().play;
        }
        
        public void setPlay(final Duration d) {
            this.play = d;
            this.markChanged();
        }
        
        public Duration getSetupWorldSettings() {
            return (this.setupWorldSettings != null) ? this.setupWorldSettings : defaults().setupWorldSettings;
        }
        
        public void setSetupWorldSettings(final Duration d) {
            this.setupWorldSettings = d;
            this.markChanged();
        }
        
        public Duration getSetupAssetsRequest() {
            return (this.setupAssetsRequest != null) ? this.setupAssetsRequest : defaults().setupAssetsRequest;
        }
        
        public void setSetupAssetsRequest(final Duration d) {
            this.setupAssetsRequest = d;
            this.markChanged();
        }
        
        public Duration getSetupSendAssets() {
            return (this.setupSendAssets != null) ? this.setupSendAssets : defaults().setupSendAssets;
        }
        
        public void setSetupSendAssets(final Duration d) {
            this.setupSendAssets = d;
            this.markChanged();
        }
        
        public Duration getSetupAddToUniverse() {
            return (this.setupAddToUniverse != null) ? this.setupAddToUniverse : defaults().setupAddToUniverse;
        }
        
        public void setSetupAddToUniverse(final Duration d) {
            this.setupAddToUniverse = d;
            this.markChanged();
        }
        
        private void markChanged() {
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        void setHytaleServerConfig(final HytaleServerConfig hytaleServerConfig) {
            this.hytaleServerConfig = hytaleServerConfig;
        }
        
        static {
            // 
            // This method could not be decompiled.
            // 
            // Original Bytecode:
            // 
            //     3: dup            
            //     4: ldc2_w          30
            //     7: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    10: ldc2_w          60
            //    13: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    16: ldc2_w          60
            //    19: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    22: ldc2_w          60
            //    25: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    28: ldc2_w          30
            //    31: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    34: ldc2_w          60
            //    37: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    40: ldc2_w          120
            //    43: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    46: ldc2_w          30
            //    49: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    52: ldc2_w          300
            //    55: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    58: ldc2_w          300
            //    61: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    64: ldc2_w          120
            //    67: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    70: invokespecial   com/hypixel/hytale/server/core/HytaleServerConfig$TimeoutProfile.<init>:(Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;)V
            //    73: putstatic       com/hypixel/hytale/server/core/HytaleServerConfig$TimeoutProfile.SINGLEPLAYER_DEFAULTS:Lcom/hypixel/hytale/server/core/HytaleServerConfig$TimeoutProfile;
            //    76: new             Lcom/hypixel/hytale/server/core/HytaleServerConfig$TimeoutProfile;
            //    79: dup            
            //    80: ldc2_w          15
            //    83: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    86: ldc2_w          30
            //    89: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    92: ldc2_w          30
            //    95: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //    98: ldc2_w          30
            //   101: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //   104: ldc2_w          15
            //   107: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //   110: ldc2_w          45
            //   113: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //   116: ldc2_w          60
            //   119: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //   122: ldc2_w          15
            //   125: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //   128: ldc2_w          120
            //   131: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //   134: ldc2_w          120
            //   137: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //   140: ldc2_w          60
            //   143: invokestatic    java/time/Duration.ofSeconds:(J)Ljava/time/Duration;
            //   146: invokespecial   com/hypixel/hytale/server/core/HytaleServerConfig$TimeoutProfile.<init>:(Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;Ljava/time/Duration;)V
            //   149: putstatic       com/hypixel/hytale/server/core/HytaleServerConfig$TimeoutProfile.MULTIPLAYER_DEFAULTS:Lcom/hypixel/hytale/server/core/HytaleServerConfig$TimeoutProfile;
            //   152: ldc             Lcom/hypixel/hytale/server/core/HytaleServerConfig$TimeoutProfile;.class
            //   154: invokedynamic   BootstrapMethod #0, get:()Ljava/util/function/Supplier;
            //   159: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   162: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   165: dup            
            //   166: ldc             "InitialTimeout"
            //   168: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   171: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   174: invokedynamic   BootstrapMethod #1, accept:()Ljava/util/function/BiConsumer;
            //   179: invokedynamic   BootstrapMethod #2, apply:()Ljava/util/function/Function;
            //   184: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   187: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   190: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   193: dup            
            //   194: ldc             "AuthTimeout"
            //   196: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   199: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   202: invokedynamic   BootstrapMethod #3, accept:()Ljava/util/function/BiConsumer;
            //   207: invokedynamic   BootstrapMethod #4, apply:()Ljava/util/function/Function;
            //   212: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   215: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   218: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   221: dup            
            //   222: ldc             "AuthGrantTimeout"
            //   224: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   227: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   230: invokedynamic   BootstrapMethod #5, accept:()Ljava/util/function/BiConsumer;
            //   235: invokedynamic   BootstrapMethod #6, apply:()Ljava/util/function/Function;
            //   240: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   243: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   246: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   249: dup            
            //   250: ldc             "AuthTokenTimeout"
            //   252: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   255: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   258: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
            //   263: invokedynamic   BootstrapMethod #8, apply:()Ljava/util/function/Function;
            //   268: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   271: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   274: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   277: dup            
            //   278: ldc             "AuthServerExchangeTimeout"
            //   280: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   283: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   286: invokedynamic   BootstrapMethod #9, accept:()Ljava/util/function/BiConsumer;
            //   291: invokedynamic   BootstrapMethod #10, apply:()Ljava/util/function/Function;
            //   296: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   299: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   302: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   305: dup            
            //   306: ldc             "PasswordTimeout"
            //   308: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   311: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   314: invokedynamic   BootstrapMethod #11, accept:()Ljava/util/function/BiConsumer;
            //   319: invokedynamic   BootstrapMethod #12, apply:()Ljava/util/function/Function;
            //   324: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   327: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   330: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   333: dup            
            //   334: ldc             "PlayTimeout"
            //   336: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   339: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   342: invokedynamic   BootstrapMethod #13, accept:()Ljava/util/function/BiConsumer;
            //   347: invokedynamic   BootstrapMethod #14, apply:()Ljava/util/function/Function;
            //   352: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   355: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   358: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   361: dup            
            //   362: ldc             "SetupWorldSettings"
            //   364: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   367: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   370: invokedynamic   BootstrapMethod #15, accept:()Ljava/util/function/BiConsumer;
            //   375: invokedynamic   BootstrapMethod #16, apply:()Ljava/util/function/Function;
            //   380: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   383: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   386: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   389: dup            
            //   390: ldc             "SetupAssetsRequest"
            //   392: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   395: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   398: invokedynamic   BootstrapMethod #17, accept:()Ljava/util/function/BiConsumer;
            //   403: invokedynamic   BootstrapMethod #18, apply:()Ljava/util/function/Function;
            //   408: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   411: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   414: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   417: dup            
            //   418: ldc             "SetupSendAssets"
            //   420: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   423: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   426: invokedynamic   BootstrapMethod #19, accept:()Ljava/util/function/BiConsumer;
            //   431: invokedynamic   BootstrapMethod #20, apply:()Ljava/util/function/Function;
            //   436: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   439: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   442: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   445: dup            
            //   446: ldc             "SetupAddToUniverse"
            //   448: getstatic       com/hypixel/hytale/codec/Codec.DURATION:Lcom/hypixel/hytale/codec/function/FunctionCodec;
            //   451: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   454: invokedynamic   BootstrapMethod #21, accept:()Ljava/util/function/BiConsumer;
            //   459: invokedynamic   BootstrapMethod #22, apply:()Ljava/util/function/Function;
            //   464: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   467: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   470: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
            //   473: putstatic       com/hypixel/hytale/server/core/HytaleServerConfig$TimeoutProfile.CODEC:Lcom/hypixel/hytale/codec/Codec;
            //   476: return         
            // 
            // The error that occurred was:
            // 
            // java.lang.UnsupportedOperationException: The requested operation is not supported.
            //     at com.strobel.util.ContractUtils.unsupported(ContractUtils.java:27)
            //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:284)
            //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:279)
            //     at com.strobel.assembler.metadata.TypeReference.makeGenericType(TypeReference.java:154)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitClassType(TypeSubstitutionVisitor.java:267)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitClassType(TypeSubstitutionVisitor.java:25)
            //     at com.strobel.assembler.metadata.TypeDefinition.accept(TypeDefinition.java:189)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitMethod(TypeSubstitutionVisitor.java:324)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2586)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1083)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:684)
            //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:667)
            //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:373)
            //     at com.strobel.decompiler.ast.TypeAnalysis.run(TypeAnalysis.java:95)
            //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:344)
            //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:42)
            //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:206)
            //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:93)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethodBody(AstBuilder.java:868)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethod(AstBuilder.java:761)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:638)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:605)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:195)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:662)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:605)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:195)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createType(AstBuilder.java:162)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addType(AstBuilder.java:137)
            //     at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:71)
            //     at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59)
            //     at com.strobel.decompiler.DecompilerDriver.decompileType(DecompilerDriver.java:333)
            //     at com.strobel.decompiler.DecompilerDriver.decompileJar(DecompilerDriver.java:254)
            //     at com.strobel.decompiler.DecompilerDriver.main(DecompilerDriver.java:129)
            // 
            throw new IllegalStateException("An error occurred while decompiling this method.");
        }
    }
    
    public static class RateLimitConfig
    {
        public static final int DEFAULT_PACKETS_PER_SECOND = 2000;
        public static final int DEFAULT_BURST_CAPACITY = 500;
        public static final Codec<RateLimitConfig> CODEC;
        private Boolean enabled;
        private Integer packetsPerSecond;
        private Integer burstCapacity;
        transient HytaleServerConfig hytaleServerConfig;
        
        public RateLimitConfig() {
        }
        
        public RateLimitConfig(final HytaleServerConfig hytaleServerConfig) {
            this.hytaleServerConfig = hytaleServerConfig;
        }
        
        public boolean isEnabled() {
            return this.enabled == null || this.enabled;
        }
        
        public void setEnabled(final boolean enabled) {
            this.enabled = enabled;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        public int getPacketsPerSecond() {
            return (this.packetsPerSecond != null) ? this.packetsPerSecond : 2000;
        }
        
        public void setPacketsPerSecond(final int packetsPerSecond) {
            this.packetsPerSecond = packetsPerSecond;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        public int getBurstCapacity() {
            return (this.burstCapacity != null) ? this.burstCapacity : 500;
        }
        
        public void setBurstCapacity(final int burstCapacity) {
            this.burstCapacity = burstCapacity;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        static {
            CODEC = BuilderCodec.builder(RateLimitConfig.class, RateLimitConfig::new).addField(new KeyedCodec<Boolean>("Enabled", Codec.BOOLEAN), (o, b) -> o.enabled = b, o -> o.enabled).addField(new KeyedCodec("PacketsPerSecond", Codec.INTEGER), (o, i) -> o.packetsPerSecond = i, o -> o.packetsPerSecond).addField(new KeyedCodec("BurstCapacity", Codec.INTEGER), (o, i) -> o.burstCapacity = i, o -> o.burstCapacity).build();
        }
    }
    
    public static class ModConfig
    {
        public static final BuilderCodec<ModConfig> CODEC;
        @Nullable
        private Boolean enabled;
        @Nullable
        private SemverRange requiredVersion;
        
        @Nullable
        public Boolean getEnabled() {
            return this.enabled;
        }
        
        public void setEnabled(final Boolean enabled) {
            this.enabled = enabled;
        }
        
        @Nullable
        public SemverRange getRequiredVersion() {
            return this.requiredVersion;
        }
        
        public void setRequiredVersion(final SemverRange requiredVersion) {
            this.requiredVersion = requiredVersion;
        }
        
        public static void setBoot(final HytaleServerConfig serverConfig, final PluginIdentifier identifier, final boolean enabled) {
            serverConfig.getModConfig().computeIfAbsent(identifier, id -> new ModConfig()).enabled = enabled;
        }
        
        static {
            CODEC = BuilderCodec.builder(ModConfig.class, ModConfig::new).append(new KeyedCodec<Boolean>("Enabled", Codec.BOOLEAN), (modConfig, enabled) -> modConfig.enabled = enabled, modConfig -> modConfig.enabled).add().append(new KeyedCodec("RequiredVersion", SemverRange.CODEC), (modConfig, semverRange) -> modConfig.requiredVersion = semverRange, modConfig -> modConfig.requiredVersion).add().build();
        }
    }
    
    public static class UpdateConfig
    {
        public static final int DEFAULT_CHECK_INTERVAL_SECONDS = 3600;
        public static final Codec<UpdateConfig> CODEC;
        private Boolean enabled;
        private Integer checkIntervalSeconds;
        private Boolean notifyPlayersOnAvailable;
        private String patchline;
        private Boolean runBackupBeforeUpdate;
        private Boolean backupConfigBeforeUpdate;
        private AutoApplyMode autoApplyMode;
        private Integer autoApplyDelayMinutes;
        transient HytaleServerConfig hytaleServerConfig;
        
        public UpdateConfig() {
        }
        
        public UpdateConfig(final HytaleServerConfig hytaleServerConfig) {
            this.hytaleServerConfig = hytaleServerConfig;
        }
        
        public boolean isEnabled() {
            return this.enabled == null || this.enabled;
        }
        
        public void setEnabled(final boolean enabled) {
            this.enabled = enabled;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        public int getCheckIntervalSeconds() {
            return (this.checkIntervalSeconds != null) ? this.checkIntervalSeconds : 3600;
        }
        
        public void setCheckIntervalSeconds(final int checkIntervalSeconds) {
            this.checkIntervalSeconds = checkIntervalSeconds;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        public boolean isNotifyPlayersOnAvailable() {
            return this.notifyPlayersOnAvailable == null || this.notifyPlayersOnAvailable;
        }
        
        public void setNotifyPlayersOnAvailable(final boolean notifyPlayersOnAvailable) {
            this.notifyPlayersOnAvailable = notifyPlayersOnAvailable;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        @Nullable
        public String getPatchline() {
            return this.patchline;
        }
        
        public void setPatchline(@Nullable final String patchline) {
            this.patchline = patchline;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        public boolean isRunBackupBeforeUpdate() {
            return this.runBackupBeforeUpdate == null || this.runBackupBeforeUpdate;
        }
        
        public void setRunBackupBeforeUpdate(final boolean runBackupBeforeUpdate) {
            this.runBackupBeforeUpdate = runBackupBeforeUpdate;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        public boolean isBackupConfigBeforeUpdate() {
            return this.backupConfigBeforeUpdate == null || this.backupConfigBeforeUpdate;
        }
        
        public void setBackupConfigBeforeUpdate(final boolean backupConfigBeforeUpdate) {
            this.backupConfigBeforeUpdate = backupConfigBeforeUpdate;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        @Nonnull
        public AutoApplyMode getAutoApplyMode() {
            return (this.autoApplyMode != null) ? this.autoApplyMode : AutoApplyMode.DISABLED;
        }
        
        public void setAutoApplyMode(@Nonnull final AutoApplyMode autoApplyMode) {
            this.autoApplyMode = autoApplyMode;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        public int getAutoApplyDelayMinutes() {
            return (this.autoApplyDelayMinutes != null) ? this.autoApplyDelayMinutes : 30;
        }
        
        public void setAutoApplyDelayMinutes(final int autoApplyDelayMinutes) {
            this.autoApplyDelayMinutes = autoApplyDelayMinutes;
            if (this.hytaleServerConfig != null) {
                this.hytaleServerConfig.markChanged();
            }
        }
        
        static {
            // 
            // This method could not be decompiled.
            // 
            // Original Bytecode:
            // 
            //     2: invokedynamic   BootstrapMethod #0, get:()Ljava/util/function/Supplier;
            //     7: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //    10: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //    13: dup            
            //    14: ldc             "Enabled"
            //    16: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
            //    19: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //    22: invokedynamic   BootstrapMethod #1, accept:()Ljava/util/function/BiConsumer;
            //    27: invokedynamic   BootstrapMethod #2, apply:()Ljava/util/function/Function;
            //    32: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //    35: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //    38: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //    41: dup            
            //    42: ldc             "CheckIntervalSeconds"
            //    44: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
            //    47: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //    50: invokedynamic   BootstrapMethod #3, accept:()Ljava/util/function/BiConsumer;
            //    55: invokedynamic   BootstrapMethod #4, apply:()Ljava/util/function/Function;
            //    60: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //    63: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //    66: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //    69: dup            
            //    70: ldc             "NotifyPlayersOnAvailable"
            //    72: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
            //    75: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //    78: invokedynamic   BootstrapMethod #5, accept:()Ljava/util/function/BiConsumer;
            //    83: invokedynamic   BootstrapMethod #6, apply:()Ljava/util/function/Function;
            //    88: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //    91: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //    94: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //    97: dup            
            //    98: ldc             "Patchline"
            //   100: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
            //   103: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   106: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
            //   111: invokedynamic   BootstrapMethod #8, apply:()Ljava/util/function/Function;
            //   116: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   119: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   122: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   125: dup            
            //   126: ldc             "RunBackupBeforeUpdate"
            //   128: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
            //   131: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   134: invokedynamic   BootstrapMethod #9, accept:()Ljava/util/function/BiConsumer;
            //   139: invokedynamic   BootstrapMethod #10, apply:()Ljava/util/function/Function;
            //   144: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   147: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   150: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   153: dup            
            //   154: ldc             "BackupConfigBeforeUpdate"
            //   156: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
            //   159: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   162: invokedynamic   BootstrapMethod #11, accept:()Ljava/util/function/BiConsumer;
            //   167: invokedynamic   BootstrapMethod #12, apply:()Ljava/util/function/Function;
            //   172: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   175: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   178: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   181: dup            
            //   182: ldc             "AutoApplyMode"
            //   184: new             Lcom/hypixel/hytale/codec/codecs/EnumCodec;
            //   187: dup            
            //   188: ldc             Lcom/hypixel/hytale/server/core/HytaleServerConfig$UpdateConfig$AutoApplyMode;.class
            //   190: invokespecial   com/hypixel/hytale/codec/codecs/EnumCodec.<init>:(Ljava/lang/Class;)V
            //   193: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   196: invokedynamic   BootstrapMethod #13, accept:()Ljava/util/function/BiConsumer;
            //   201: invokedynamic   BootstrapMethod #14, apply:()Ljava/util/function/Function;
            //   206: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   209: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   212: new             Lcom/hypixel/hytale/codec/KeyedCodec;
            //   215: dup            
            //   216: ldc             "AutoApplyDelayMinutes"
            //   218: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
            //   221: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
            //   224: invokedynamic   BootstrapMethod #15, accept:()Ljava/util/function/BiConsumer;
            //   229: invokedynamic   BootstrapMethod #16, apply:()Ljava/util/function/Function;
            //   234: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.addField:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
            //   237: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
            //   240: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
            //   243: putstatic       com/hypixel/hytale/server/core/HytaleServerConfig$UpdateConfig.CODEC:Lcom/hypixel/hytale/codec/Codec;
            //   246: return         
            // 
            // The error that occurred was:
            // 
            // java.lang.UnsupportedOperationException: The requested operation is not supported.
            //     at com.strobel.util.ContractUtils.unsupported(ContractUtils.java:27)
            //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:284)
            //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:279)
            //     at com.strobel.assembler.metadata.TypeReference.makeGenericType(TypeReference.java:154)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitClassType(TypeSubstitutionVisitor.java:267)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitClassType(TypeSubstitutionVisitor.java:25)
            //     at com.strobel.assembler.metadata.TypeDefinition.accept(TypeDefinition.java:189)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
            //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitMethod(TypeSubstitutionVisitor.java:324)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2586)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2483)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
            //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1083)
            //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
            //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:684)
            //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:667)
            //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:373)
            //     at com.strobel.decompiler.ast.TypeAnalysis.run(TypeAnalysis.java:95)
            //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:344)
            //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:42)
            //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:206)
            //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:93)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethodBody(AstBuilder.java:868)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethod(AstBuilder.java:761)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:638)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:605)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:195)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:662)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:605)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:195)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createType(AstBuilder.java:162)
            //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addType(AstBuilder.java:137)
            //     at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:71)
            //     at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59)
            //     at com.strobel.decompiler.DecompilerDriver.decompileType(DecompilerDriver.java:333)
            //     at com.strobel.decompiler.DecompilerDriver.decompileJar(DecompilerDriver.java:254)
            //     at com.strobel.decompiler.DecompilerDriver.main(DecompilerDriver.java:129)
            // 
            throw new IllegalStateException("An error occurred while decompiling this method.");
        }
        
        public enum AutoApplyMode
        {
            DISABLED, 
            WHEN_EMPTY, 
            SCHEDULED;
        }
    }
}
