// Path: src/main/java/org/fest/util/Arrays.java
// public static boolean isArray(@Nullable Object o) {
//   return o != null && o.getClass().isArray();
// }
// 
// Path: src/main/java/org/fest/util/Preconditions.java
// public static @NotNull <T> T checkNotNull(@Nullable T reference) {
//   if (reference == null) {
//     throw new NullPointerException();
//   }
//   return reference;
// }


import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Array;
import static org.fest.util.Arrays.isArray;
import static org.fest.util.Preconditions.checkNotNull;

  private static boolean areEqualArrays(@Nullable Object o1, @Nullable Object o2) {
    if (!isArray(o1) || !isArray(o2)) {
      return false;
    }
    if (o1 == o2) {
      return true;
    }
    int size = Array.getLength(o1);
    if (Array.getLength(o2) != size) {
      return false;
    }
    for (int i = 0; i < size; i++) {
      Object e1 = Array.get(o1, i);
      Object e2 = Array.get(o2, i);
      if (!areEqual(e1, e2)) {
        return false;
      }
    }
    return true;
  }

  /**
   * Returns an array containing the names of the given types.
   *
   * @param types the given types.
   * @return the names of the given types stored in an array.
   * @throws NullPointerException if the given array of types is {@code null}.
   */
  public static @NotNull String[] namesOf(@NotNull Class<?>... types) {
// Path: src/main/java/org/fest/util/Arrays.java
// public static boolean isArray(@Nullable Object o) {
//   return o != null && o.getClass().isArray();
// }
// 
// Path: src/main/java/org/fest/util/Preconditions.java
// public static @NotNull <T> T checkNotNull(@Nullable T reference) {
//   if (reference == null) {
//     throw new NullPointerException();
//   }
//   return reference;
// }


// Path: src/main/java/org/fest/util/Objects.java
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Array;
import static org.fest.util.Arrays.isArray;
import static org.fest.util.Preconditions.checkNotNull;


  private static boolean areEqualArrays(@Nullable Object o1, @Nullable Object o2) {
    if (!isArray(o1) || !isArray(o2)) {
      return false;
    }
    if (o1 == o2) {
      return true;
    }
    int size = Array.getLength(o1);
    if (Array.getLength(o2) != size) {
      return false;
    }
    for (int i = 0; i < size; i++) {
      Object e1 = Array.get(o1, i);
      Object e2 = Array.get(o2, i);
      if (!areEqual(e1, e2)) {
        return false;
      }
    }
    return true;
  }

  /**
   * Returns an array containing the names of the given types.
   *
   * @param types the given types.
   * @return the names of the given types stored in an array.
   * @throws NullPointerException if the given array of types is {@code null}.
   */
  public static @NotNull String[] namesOf(@NotNull Class<?>... types) {
    checkNotNull(types);