// Path: src/org/jf/dexlib2/iface/Method.java
// public interface Method extends MethodReference, Member {
//     /**
//      * Gets the type of the class that defines this method.
//      *
//      * @return The type of the class that defines this method
//      */
//     @Override @Nonnull String getDefiningClass();
// 
//     /**
//      * Gets the name of this method.
//      *
//      * @return The name of this method
//      */
//     @Override @Nonnull String getName();
// 
//     /**
//      * Gets a list of the parameters of this method.
//      *
//      * As per the MethodReference interface, the MethodParameter objects contained in the returned list also act
//      * as a simple reference to the type of the parameter. However, the MethodParameter object can also contain
//      * additional information about the parameter.
//      *
//      * Note: In some implementations, the returned list is likely to *not* provide efficient random access.
//      *
//      * @return A list of MethodParameter objects, representing the parameters of this method.
//      */
//     @Nonnull List<? extends MethodParameter> getParameters();
// 
//     /**
//      * Gets the return type of this method.
//      *
//      * @return The return type of this method.
//      */
//     @Override @Nonnull String getReturnType();
// 
//     /**
//      * Gets the access flags for this method.
//      *
//      * This will be a combination of the AccessFlags.* flags that are marked as compatible for use with a method.
//      *
//      * @return The access flags for this method
//      */
//     @Override int getAccessFlags();
// 
//     /**
//      * Gets a set of the annotations that are applied to this method.
//      *
//      * The annotations in the returned set are guaranteed to have unique types.
//      *
//      * @return A set of the annotations that are applied to this method
//      */
//     @Override @Nonnull Set<? extends Annotation> getAnnotations();
// 
//     /**
//      * Gets a MethodImplementation object that defines the implementation of the method.
//      *
//      * If this is an abstract method in an abstract class, or an interface method in an interface definition, then the
//      * method has no implementation, and this will return null.
//      *
//      * @return A MethodImplementation object defining the implementation of this method, or null if the method has no
//      * implementation
//      */
//     @Nullable MethodImplementation getImplementation();
// }
// 
// Path: src/org/jf/dexlib2/util/TypeUtils.java
// public final class TypeUtils {
//     public static boolean isWideType(@Nonnull String type) {
//         char c = type.charAt(0);
//         return c == 'J' || c == 'D';
//     }
// 
//     public static boolean isWideType(@Nonnull TypeReference type) {
//         return isWideType(type.getType());
//     }
// 
//     public static boolean isPrimitiveType(String type) {
//         return type.length() == 1;
//     }
// 
//     @Nonnull
//     public static String getPackage(@Nonnull String type) {
//         int lastSlash = type.lastIndexOf('/');
//         if (lastSlash < 0) {
//             return "";
//         }
//         return type.substring(1, lastSlash);
//     }
// 
//     public static boolean canAccessClass(@Nonnull String accessorType, @Nonnull ClassDef accesseeClassDef) {
//         if (AccessFlags.PUBLIC.isSet(accesseeClassDef.getAccessFlags())) {
//             return true;
//         }
// 
//         // Classes can only be public or package private. Any private or protected inner classes are actually
//         // package private.
//         return getPackage(accesseeClassDef.getType()).equals(getPackage(accessorType));
//     }
// 
//     private TypeUtils() {}
// }


import com.google.common.base.Strings;
import org.jf.dexlib2.iface.Method;
import org.jf.dexlib2.iface.reference.FieldReference;
import org.jf.dexlib2.iface.reference.MethodReference;
import org.jf.dexlib2.immutable.reference.ImmutableFieldReference;
import org.jf.dexlib2.util.TypeUtils;
import org.jf.util.ExceptionWithContext;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
                }
            } catch (UnresolvedClassException ex) {
                // ignore
            }
            return classPath.getClass("Ljava/lang/Object;");
        }

        // otherwise, defer to the other class' getCommonSuperclass
        return other.getCommonSuperclass(this);
    }

    private static final String BRACKETS = Strings.repeat("[", 256);

    @Nonnull
    private static String makeArrayType(@Nonnull String elementType, int dimensions) {
        return BRACKETS.substring(0, dimensions) + elementType;
    }


    @Override
    @Nullable
    public FieldReference getFieldByOffset(int fieldOffset) {
        if (fieldOffset==8) {
            return new ImmutableFieldReference(getType(), "length", "int");
        }
        return null;
    }

    @Override
    @Nullable
// Path: src/org/jf/dexlib2/iface/Method.java
// public interface Method extends MethodReference, Member {
//     /**
//      * Gets the type of the class that defines this method.
//      *
//      * @return The type of the class that defines this method
//      */
//     @Override @Nonnull String getDefiningClass();
// 
//     /**
//      * Gets the name of this method.
//      *
//      * @return The name of this method
//      */
//     @Override @Nonnull String getName();
// 
//     /**
//      * Gets a list of the parameters of this method.
//      *
//      * As per the MethodReference interface, the MethodParameter objects contained in the returned list also act
//      * as a simple reference to the type of the parameter. However, the MethodParameter object can also contain
//      * additional information about the parameter.
//      *
//      * Note: In some implementations, the returned list is likely to *not* provide efficient random access.
//      *
//      * @return A list of MethodParameter objects, representing the parameters of this method.
//      */
//     @Nonnull List<? extends MethodParameter> getParameters();
// 
//     /**
//      * Gets the return type of this method.
//      *
//      * @return The return type of this method.
//      */
//     @Override @Nonnull String getReturnType();
// 
//     /**
//      * Gets the access flags for this method.
//      *
//      * This will be a combination of the AccessFlags.* flags that are marked as compatible for use with a method.
//      *
//      * @return The access flags for this method
//      */
//     @Override int getAccessFlags();
// 
//     /**
//      * Gets a set of the annotations that are applied to this method.
//      *
//      * The annotations in the returned set are guaranteed to have unique types.
//      *
//      * @return A set of the annotations that are applied to this method
//      */
//     @Override @Nonnull Set<? extends Annotation> getAnnotations();
// 
//     /**
//      * Gets a MethodImplementation object that defines the implementation of the method.
//      *
//      * If this is an abstract method in an abstract class, or an interface method in an interface definition, then the
//      * method has no implementation, and this will return null.
//      *
//      * @return A MethodImplementation object defining the implementation of this method, or null if the method has no
//      * implementation
//      */
//     @Nullable MethodImplementation getImplementation();
// }
// 
// Path: src/org/jf/dexlib2/util/TypeUtils.java
// public final class TypeUtils {
//     public static boolean isWideType(@Nonnull String type) {
//         char c = type.charAt(0);
//         return c == 'J' || c == 'D';
//     }
// 
//     public static boolean isWideType(@Nonnull TypeReference type) {
//         return isWideType(type.getType());
//     }
// 
//     public static boolean isPrimitiveType(String type) {
//         return type.length() == 1;
//     }
// 
//     @Nonnull
//     public static String getPackage(@Nonnull String type) {
//         int lastSlash = type.lastIndexOf('/');
//         if (lastSlash < 0) {
//             return "";
//         }
//         return type.substring(1, lastSlash);
//     }
// 
//     public static boolean canAccessClass(@Nonnull String accessorType, @Nonnull ClassDef accesseeClassDef) {
//         if (AccessFlags.PUBLIC.isSet(accesseeClassDef.getAccessFlags())) {
//             return true;
//         }
// 
//         // Classes can only be public or package private. Any private or protected inner classes are actually
//         // package private.
//         return getPackage(accesseeClassDef.getType()).equals(getPackage(accessorType));
//     }
// 
//     private TypeUtils() {}
// }


// Path: src/org/jf/dexlib2/analysis/ArrayProto.java
import com.google.common.base.Strings;
import org.jf.dexlib2.iface.Method;
import org.jf.dexlib2.iface.reference.FieldReference;
import org.jf.dexlib2.iface.reference.MethodReference;
import org.jf.dexlib2.immutable.reference.ImmutableFieldReference;
import org.jf.dexlib2.util.TypeUtils;
import org.jf.util.ExceptionWithContext;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

                }
            } catch (UnresolvedClassException ex) {
                // ignore
            }
            return classPath.getClass("Ljava/lang/Object;");
        }

        // otherwise, defer to the other class' getCommonSuperclass
        return other.getCommonSuperclass(this);
    }

    private static final String BRACKETS = Strings.repeat("[", 256);

    @Nonnull
    private static String makeArrayType(@Nonnull String elementType, int dimensions) {
        return BRACKETS.substring(0, dimensions) + elementType;
    }


    @Override
    @Nullable
    public FieldReference getFieldByOffset(int fieldOffset) {
        if (fieldOffset==8) {
            return new ImmutableFieldReference(getType(), "length", "int");
        }
        return null;
    }

    @Override
    @Nullable
    public Method getMethodByVtableIndex(int vtableIndex) {