// Path: src/main/java/org/ardverk/io/Streamable.java
// public interface Streamable {
// 
//   /**
//    * Writes this Object to the given {@link OutputStream} and returns
//    * the number of bytes that were written.
//    */
//   public void writeTo(OutputStream out) throws IOException;
// }
// 
// Path: src/main/java/org/ardverk/lang/Bytes.java
// public class Bytes {
//   
//   /**
//    * An empty {@code byte} array.
//    */
//   public static final byte[] EMPTY = new byte[0];
// 
//   private Bytes() {}
//   
//   /**
//    * Compares the given {@code byte} values.
//    * 
//    * @see Comparable
//    * @see Comparator
//    */
//   public static int compare(byte b1, byte b2) {
//     if (b1 < b2) {
//       return -1;
//     } else if (b2 < b1) {
//       return 1;
//     }
//     return 0;
//   }
//   
//   /**
//    * Compares the given {@code byte}s as unsigned values.
//    * 
//    * @see Comparable
//    * @see Comparator
//    */
//   public static int compareUnsigned(int b1, int b2) {
//     return (b1 & 0xFF) - (b2 & 0xFF);
//   }
// }
// 
// Path: src/main/java/org/ardverk/utils/ByteArrayComparator.java
// public class ByteArrayComparator implements Comparator<byte[]>, Serializable {
// 
//   private static final long serialVersionUID = 6625000716332463624L;
// 
//   public static final ByteArrayComparator COMPARATOR = new ByteArrayComparator();
//   
//   @Override
//   public int compare(byte[] o1, byte[] o2) {
//     if (o1.length != o2.length) {
//       return o1.length - o2.length;
//     }
//     
//     for (int i = 0; i < o1.length; i++) {
//       int diff = Bytes.compareUnsigned(o1[i], o2[i]);
//       if (diff != 0) {
//         return diff;
//       }
//     }
// 
//     return 0;
//   }
// }


import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Arrays;
import org.ardverk.io.Streamable;
import org.ardverk.lang.Bytes;
import org.ardverk.utils.ByteArrayComparator;
  /**
   * Returns true if the two given addresses are in the same network.
   */
  boolean isSameNetwork(byte[] a, byte[] b, boolean copy) {
    return Arrays.equals(mask(a, copy), mask(b, copy));
  }

  @Override
  public NetworkMask clone() {
    return this;
  }
  
  @Override
  public int hashCode() {
    return hashCode;
  }

  @Override
  public boolean equals(Object o) {
    if (o == this) {
      return true;
    } else if (!(o instanceof NetworkMask)) {
      return false;
    }
    
    return compareTo((NetworkMask)o) == 0;
  }
  
  @Override
  public int compareTo(NetworkMask o) {
// Path: src/main/java/org/ardverk/io/Streamable.java
// public interface Streamable {
// 
//   /**
//    * Writes this Object to the given {@link OutputStream} and returns
//    * the number of bytes that were written.
//    */
//   public void writeTo(OutputStream out) throws IOException;
// }
// 
// Path: src/main/java/org/ardverk/lang/Bytes.java
// public class Bytes {
//   
//   /**
//    * An empty {@code byte} array.
//    */
//   public static final byte[] EMPTY = new byte[0];
// 
//   private Bytes() {}
//   
//   /**
//    * Compares the given {@code byte} values.
//    * 
//    * @see Comparable
//    * @see Comparator
//    */
//   public static int compare(byte b1, byte b2) {
//     if (b1 < b2) {
//       return -1;
//     } else if (b2 < b1) {
//       return 1;
//     }
//     return 0;
//   }
//   
//   /**
//    * Compares the given {@code byte}s as unsigned values.
//    * 
//    * @see Comparable
//    * @see Comparator
//    */
//   public static int compareUnsigned(int b1, int b2) {
//     return (b1 & 0xFF) - (b2 & 0xFF);
//   }
// }
// 
// Path: src/main/java/org/ardverk/utils/ByteArrayComparator.java
// public class ByteArrayComparator implements Comparator<byte[]>, Serializable {
// 
//   private static final long serialVersionUID = 6625000716332463624L;
// 
//   public static final ByteArrayComparator COMPARATOR = new ByteArrayComparator();
//   
//   @Override
//   public int compare(byte[] o1, byte[] o2) {
//     if (o1.length != o2.length) {
//       return o1.length - o2.length;
//     }
//     
//     for (int i = 0; i < o1.length; i++) {
//       int diff = Bytes.compareUnsigned(o1[i], o2[i]);
//       if (diff != 0) {
//         return diff;
//       }
//     }
// 
//     return 0;
//   }
// }


// Path: src/main/java/org/ardverk/net/NetworkMask.java
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Arrays;
import org.ardverk.io.Streamable;
import org.ardverk.lang.Bytes;
import org.ardverk.utils.ByteArrayComparator;

  /**
   * Returns true if the two given addresses are in the same network.
   */
  boolean isSameNetwork(byte[] a, byte[] b, boolean copy) {
    return Arrays.equals(mask(a, copy), mask(b, copy));
  }

  @Override
  public NetworkMask clone() {
    return this;
  }
  
  @Override
  public int hashCode() {
    return hashCode;
  }

  @Override
  public boolean equals(Object o) {
    if (o == this) {
      return true;
    } else if (!(o instanceof NetworkMask)) {
      return false;
    }
    
    return compareTo((NetworkMask)o) == 0;
  }
  
  @Override
  public int compareTo(NetworkMask o) {
    return ByteArrayComparator.COMPARATOR.compare(mask, o.mask);