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

package com.hypixel.hytale.server.core.entity.entities.player.data;

import java.util.function.Function;
import java.util.Objects;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockMigration;
import java.util.Iterator;
import com.hypixel.hytale.server.core.universe.Universe;
import java.util.Collection;
import it.unimi.dsi.fastutil.objects.Object2IntMaps;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Collections;
import java.util.HashSet;
import com.hypixel.hytale.math.vector.Vector3f;
import com.hypixel.hytale.math.vector.Vector3d;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import java.util.UUID;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public final class PlayerConfigData
{
    @Nonnull
    public static final BuilderCodec<PlayerConfigData> CODEC;
    @Nonnull
    private final transient AtomicBoolean hasChanged;
    private int blockIdVersion;
    private String world;
    private String preset;
    @Nonnull
    private Set<String> knownRecipes;
    @Nonnull
    private Set<String> unmodifiableKnownRecipes;
    private Map<String, PlayerWorldData> perWorldData;
    @Nonnull
    private Map<String, PlayerWorldData> unmodifiablePerWorldData;
    @Nonnull
    private Set<String> discoveredZones;
    @Nonnull
    private Set<String> unmodifiableDiscoveredZones;
    @Nonnull
    private Set<UUID> discoveredInstances;
    @Nonnull
    private Set<UUID> unmodifiableDiscoveredInstances;
    private Object2IntMap<String> reputationData;
    @Nonnull
    private Object2IntMap<String> unmodifiableReputationData;
    @Nonnull
    private Set<UUID> activeObjectiveUUIDs;
    @Nonnull
    private Set<UUID> unmodifiableActiveObjectiveUUIDs;
    public final Vector3d lastSavedPosition;
    public final Vector3f lastSavedRotation;
    
    public PlayerConfigData() {
        this.hasChanged = new AtomicBoolean();
        this.blockIdVersion = 1;
        this.knownRecipes = new HashSet<String>();
        this.unmodifiableKnownRecipes = Collections.unmodifiableSet((Set<? extends String>)this.knownRecipes);
        this.perWorldData = new ConcurrentHashMap<String, PlayerWorldData>();
        this.unmodifiablePerWorldData = Collections.unmodifiableMap((Map<? extends String, ? extends PlayerWorldData>)this.perWorldData);
        this.discoveredZones = new HashSet<String>();
        this.unmodifiableDiscoveredZones = Collections.unmodifiableSet((Set<? extends String>)this.discoveredZones);
        this.discoveredInstances = new HashSet<UUID>();
        this.unmodifiableDiscoveredInstances = Collections.unmodifiableSet((Set<? extends UUID>)this.discoveredInstances);
        this.reputationData = new Object2IntOpenHashMap<String>();
        this.unmodifiableReputationData = Object2IntMaps.unmodifiable((Object2IntMap<? extends String>)this.reputationData);
        this.activeObjectiveUUIDs = (Set<UUID>)ConcurrentHashMap.newKeySet();
        this.unmodifiableActiveObjectiveUUIDs = Collections.unmodifiableSet((Set<? extends UUID>)this.activeObjectiveUUIDs);
        this.lastSavedPosition = new Vector3d();
        this.lastSavedRotation = new Vector3f();
    }
    
    public int getBlockIdVersion() {
        return this.blockIdVersion;
    }
    
    public void setBlockIdVersion(final int blockIdVersion) {
        this.blockIdVersion = blockIdVersion;
    }
    
    public String getWorld() {
        return this.world;
    }
    
    public void setWorld(@Nonnull final String world) {
        this.world = world;
        this.markChanged();
    }
    
    public String getPreset() {
        return this.preset;
    }
    
    public void setPreset(@Nonnull final String preset) {
        this.preset = preset;
        this.markChanged();
    }
    
    @Nonnull
    public Set<String> getKnownRecipes() {
        return this.unmodifiableKnownRecipes;
    }
    
    public void setKnownRecipes(@Nonnull final Set<String> knownRecipes) {
        this.knownRecipes = knownRecipes;
        this.unmodifiableKnownRecipes = Collections.unmodifiableSet((Set<? extends String>)knownRecipes);
        this.markChanged();
    }
    
    @Nonnull
    public Map<String, PlayerWorldData> getPerWorldData() {
        return this.unmodifiablePerWorldData;
    }
    
    @Nonnull
    public PlayerWorldData getPerWorldData(@Nonnull final String worldName) {
        return this.perWorldData.computeIfAbsent(worldName, s -> new PlayerWorldData(this));
    }
    
    public void setPerWorldData(@Nonnull final Map<String, PlayerWorldData> perWorldData) {
        this.perWorldData = perWorldData;
        this.unmodifiablePerWorldData = Collections.unmodifiableMap((Map<? extends String, ? extends PlayerWorldData>)perWorldData);
        this.markChanged();
    }
    
    @Nonnull
    public Set<String> getDiscoveredZones() {
        return this.unmodifiableDiscoveredZones;
    }
    
    public void setDiscoveredZones(@Nonnull final Set<String> discoveredZones) {
        this.discoveredZones = discoveredZones;
        this.unmodifiableDiscoveredZones = Collections.unmodifiableSet((Set<? extends String>)discoveredZones);
        this.markChanged();
    }
    
    @Nonnull
    public Set<UUID> getDiscoveredInstances() {
        return this.unmodifiableDiscoveredInstances;
    }
    
    public void setDiscoveredInstances(@Nonnull final Set<UUID> discoveredInstances) {
        this.discoveredInstances = discoveredInstances;
        this.unmodifiableDiscoveredInstances = Collections.unmodifiableSet((Set<? extends UUID>)discoveredInstances);
        this.markChanged();
    }
    
    @Nonnull
    public Object2IntMap<String> getReputationData() {
        return this.unmodifiableReputationData;
    }
    
    public void setReputationData(@Nonnull final Object2IntMap<String> reputationData) {
        this.reputationData = reputationData;
        this.unmodifiableReputationData = Object2IntMaps.unmodifiable((Object2IntMap<? extends String>)reputationData);
        this.markChanged();
    }
    
    @Nonnull
    public Set<UUID> getActiveObjectiveUUIDs() {
        return this.unmodifiableActiveObjectiveUUIDs;
    }
    
    public void setActiveObjectiveUUIDs(@Nonnull final Set<UUID> activeObjectiveUUIDs) {
        this.activeObjectiveUUIDs.clear();
        this.activeObjectiveUUIDs.addAll(activeObjectiveUUIDs);
        this.markChanged();
    }
    
    public void markChanged() {
        this.hasChanged.set(true);
    }
    
    public boolean consumeHasChanged() {
        return this.hasChanged.getAndSet(false);
    }
    
    public void cleanup(@Nonnull final Universe universe) {
        final Set<String> keySet = this.perWorldData.keySet();
        final Iterator<String> iterator = keySet.iterator();
        while (iterator.hasNext()) {
            final String worldName = iterator.next();
            if (worldName.startsWith("instance-") && universe.getWorld(worldName) == null) {
                iterator.remove();
            }
        }
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     2: invokedynamic   BootstrapMethod #6, 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_w           "BlockIdVersion"
        //    17: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
        //    20: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    23: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
        //    28: invokedynamic   BootstrapMethod #8, apply:()Ljava/util/function/Function;
        //    33: 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;
        //    36: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    39: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    42: dup            
        //    43: ldc_w           "World"
        //    46: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //    49: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    52: invokedynamic   BootstrapMethod #9, accept:()Ljava/util/function/BiConsumer;
        //    57: invokedynamic   BootstrapMethod #10, apply:()Ljava/util/function/Function;
        //    62: 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;
        //    65: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    68: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    71: dup            
        //    72: ldc_w           "Preset"
        //    75: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //    78: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    81: invokedynamic   BootstrapMethod #11, accept:()Ljava/util/function/BiConsumer;
        //    86: invokedynamic   BootstrapMethod #12, apply:()Ljava/util/function/Function;
        //    91: 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;
        //    94: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    97: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   100: dup            
        //   101: ldc_w           "KnownRecipes"
        //   104: new             Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //   107: dup            
        //   108: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //   111: invokedynamic   BootstrapMethod #13, apply:()Ljava/util/function/IntFunction;
        //   116: invokespecial   com/hypixel/hytale/codec/codecs/array/ArrayCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/IntFunction;)V
        //   119: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   122: invokedynamic   BootstrapMethod #14, accept:()Ljava/util/function/BiConsumer;
        //   127: invokedynamic   BootstrapMethod #15, apply:()Ljava/util/function/Function;
        //   132: 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;
        //   135: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   138: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   141: dup            
        //   142: ldc_w           "PerWorldData"
        //   145: new             Lcom/hypixel/hytale/codec/codecs/map/MapCodec;
        //   148: dup            
        //   149: getstatic       com/hypixel/hytale/server/core/entity/entities/player/data/PlayerWorldData.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   152: invokedynamic   BootstrapMethod #16, get:()Ljava/util/function/Supplier;
        //   157: iconst_0       
        //   158: invokespecial   com/hypixel/hytale/codec/codecs/map/MapCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/Supplier;Z)V
        //   161: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   164: invokedynamic   BootstrapMethod #17, accept:()Ljava/util/function/BiConsumer;
        //   169: invokedynamic   BootstrapMethod #18, apply:()Ljava/util/function/Function;
        //   174: 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;
        //   177: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   180: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   183: dup            
        //   184: ldc_w           "DiscoveredZones"
        //   187: getstatic       com/hypixel/hytale/codec/Codec.STRING_ARRAY:Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //   190: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   193: invokedynamic   BootstrapMethod #19, accept:()Ljava/util/function/BiConsumer;
        //   198: invokedynamic   BootstrapMethod #20, apply:()Ljava/util/function/Function;
        //   203: 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;
        //   206: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   209: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   212: dup            
        //   213: ldc_w           "DiscoveredInstances"
        //   216: new             Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //   219: dup            
        //   220: getstatic       com/hypixel/hytale/codec/Codec.UUID_BINARY:Lcom/hypixel/hytale/codec/codecs/UUIDBinaryCodec;
        //   223: invokedynamic   BootstrapMethod #21, apply:()Ljava/util/function/IntFunction;
        //   228: invokespecial   com/hypixel/hytale/codec/codecs/array/ArrayCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/IntFunction;)V
        //   231: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   234: invokedynamic   BootstrapMethod #22, accept:()Ljava/util/function/BiConsumer;
        //   239: invokedynamic   BootstrapMethod #23, apply:()Ljava/util/function/Function;
        //   244: 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;
        //   247: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   250: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   253: dup            
        //   254: ldc_w           "ReputationData"
        //   257: new             Lcom/hypixel/hytale/codec/codecs/map/Object2IntMapCodec;
        //   260: dup            
        //   261: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //   264: invokedynamic   BootstrapMethod #24, get:()Ljava/util/function/Supplier;
        //   269: iconst_0       
        //   270: invokespecial   com/hypixel/hytale/codec/codecs/map/Object2IntMapCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/Supplier;Z)V
        //   273: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   276: invokedynamic   BootstrapMethod #25, accept:()Ljava/util/function/BiConsumer;
        //   281: invokedynamic   BootstrapMethod #26, apply:()Ljava/util/function/Function;
        //   286: 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;
        //   289: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   292: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   295: dup            
        //   296: ldc_w           "ActiveObjectiveUUIDs"
        //   299: new             Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //   302: dup            
        //   303: getstatic       com/hypixel/hytale/codec/Codec.UUID_BINARY:Lcom/hypixel/hytale/codec/codecs/UUIDBinaryCodec;
        //   306: invokedynamic   BootstrapMethod #27, apply:()Ljava/util/function/IntFunction;
        //   311: invokespecial   com/hypixel/hytale/codec/codecs/array/ArrayCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/IntFunction;)V
        //   314: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   317: invokedynamic   BootstrapMethod #28, accept:()Ljava/util/function/BiConsumer;
        //   322: invokedynamic   BootstrapMethod #29, apply:()Ljava/util/function/Function;
        //   327: 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;
        //   330: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   333: invokedynamic   BootstrapMethod #30, accept:()Ljava/util/function/Consumer;
        //   338: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.afterDecode:(Ljava/util/function/Consumer;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   341: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   344: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   347: putstatic       com/hypixel/hytale/server/core/entity/entities/player/data/PlayerConfigData.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   350: 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.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: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.");
    }
}
