// Path: BraintreeAndroidEncryption/src/main/java/com/braintree/org/bouncycastle/util/Arrays.java
// public final class Arrays
// {
//     private Arrays() 
//     {
//         // static class, hide constructor
//     }
//     
//     public static boolean areEqual(
//         boolean[]  a,
//         boolean[]  b)
//     {
//         if (a == b)
//         {
//             return true;
//         }
// 
//         if (a == null || b == null)
//         {
//             return false;
//         }
// 
//         if (a.length != b.length)
//         {
//             return false;
//         }
// 
//         for (int i = 0; i != a.length; i++)
//         {
//             if (a[i] != b[i])
//             {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     public static boolean areEqual(
//         char[]  a,
//         char[]  b)
//     {
//         if (a == b)
//         {
//             return true;
//         }
// 
//         if (a == null || b == null)
//         {
//             return false;
//         }
// 
//         if (a.length != b.length)
//         {
//             return false;
//         }
// 
//         for (int i = 0; i != a.length; i++)
//         {
//             if (a[i] != b[i])
//             {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     public static boolean areEqual(
//         byte[]  a,
//         byte[]  b)
//     {
//         if (a == b)
//         {
//             return true;
//         }
// 
//         if (a == null || b == null)
//         {
//             return false;
//         }
// 
//         if (a.length != b.length)
//         {
//             return false;
//         }
// 
//         for (int i = 0; i != a.length; i++)
//         {
//             if (a[i] != b[i])
//             {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     /**
//      * A constant time equals comparison - does not terminate early if
//      * test will fail.
//      *
//      * @param a first array
//      * @param b second array
//      * @return true if arrays equal, false otherwise.
//      */
//     public static boolean constantTimeAreEqual(
//         byte[]  a,
//         byte[]  b)
//     {
//         if (a == b)
//         {
//             return true;
//         }
// 
//         if (a == null || b == null)
//         {
//             return false;
//         }
// 
//         if (a.length != b.length)
//         {
//             return false;
//         }
// 
//         int nonEqual = 0;
// 
//         for (int i = 0; i != a.length; i++)
//         {
//             nonEqual |= (a[i] ^ b[i]);
//         }
// 
//         return nonEqual == 0;
//     }
// 
//     public static boolean areEqual(
//         int[]  a,
//         int[]  b)
//     {
//         if (a == b)
//         {
//             return true;
//         }
// 
//         if (a == null || b == null)
//         {
//             return false;
//         }
// 
//         if (a.length != b.length)
//         {
//             return false;
//         }
// 
//         for (int i = 0; i != a.length; i++)
//         {
//             if (a[i] != b[i])
//             {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     public static void fill(
//         byte[] array,
//         byte value)
//     {
//         for (int i = 0; i < array.length; i++)
//         {
//             array[i] = value;
//         }
//     }
//     
//     public static void fill(
//         long[] array,
//         long value)
//     {
//         for (int i = 0; i < array.length; i++)
//         {
//             array[i] = value;
//         }
//     }
// 
//     public static void fill(
//         short[] array, 
//         short value)
//     {
//         for (int i = 0; i < array.length; i++)
//         {
//             array[i] = value;
//         }
//     }
// 
//     public static int hashCode(byte[] data)
//     {
//         if (data == null)
//         {
//             return 0;
//         }
// 
//         int i = data.length;
//         int hc = i + 1;
// 
//         while (--i >= 0)
//         {
//             hc *= 257;
//             hc ^= data[i];
//         }
// 
//         return hc;
//     }
// 
//     public static byte[] clone(byte[] data)
//     {
//         if (data == null)
//         {
//             return null;
//         }
//         byte[] copy = new byte[data.length];
// 
//         System.arraycopy(data, 0, copy, 0, data.length);
// 
//         return copy;
//     }
// 
//     public static int[] clone(int[] data)
//     {
//         if (data == null)
//         {
//             return null;
//         }
//         int[] copy = new int[data.length];
// 
//         System.arraycopy(data, 0, copy, 0, data.length);
// 
//         return copy;
//     }
// }


import java.io.IOException;
import com.braintree.org.bouncycastle.util.Arrays;

    public byte[] getData()
    {
        return data;
    }

    void encode(
        DEROutputStream  out)
        throws IOException
    {
        out.writeEncoded(isConstructed ? DERTags.CONSTRUCTED : 0, tag, data);
    }
    
    public boolean equals(
        Object o)
    {
        if (!(o instanceof DERUnknownTag))
        {
            return false;
        }
        
        DERUnknownTag other = (DERUnknownTag)o;

        return isConstructed == other.isConstructed
            && tag == other.tag
            && Arrays.areEqual(data, other.data);
    }
    
    public int hashCode()
    {
// Path: BraintreeAndroidEncryption/src/main/java/com/braintree/org/bouncycastle/util/Arrays.java
// public final class Arrays
// {
//     private Arrays() 
//     {
//         // static class, hide constructor
//     }
//     
//     public static boolean areEqual(
//         boolean[]  a,
//         boolean[]  b)
//     {
//         if (a == b)
//         {
//             return true;
//         }
// 
//         if (a == null || b == null)
//         {
//             return false;
//         }
// 
//         if (a.length != b.length)
//         {
//             return false;
//         }
// 
//         for (int i = 0; i != a.length; i++)
//         {
//             if (a[i] != b[i])
//             {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     public static boolean areEqual(
//         char[]  a,
//         char[]  b)
//     {
//         if (a == b)
//         {
//             return true;
//         }
// 
//         if (a == null || b == null)
//         {
//             return false;
//         }
// 
//         if (a.length != b.length)
//         {
//             return false;
//         }
// 
//         for (int i = 0; i != a.length; i++)
//         {
//             if (a[i] != b[i])
//             {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     public static boolean areEqual(
//         byte[]  a,
//         byte[]  b)
//     {
//         if (a == b)
//         {
//             return true;
//         }
// 
//         if (a == null || b == null)
//         {
//             return false;
//         }
// 
//         if (a.length != b.length)
//         {
//             return false;
//         }
// 
//         for (int i = 0; i != a.length; i++)
//         {
//             if (a[i] != b[i])
//             {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     /**
//      * A constant time equals comparison - does not terminate early if
//      * test will fail.
//      *
//      * @param a first array
//      * @param b second array
//      * @return true if arrays equal, false otherwise.
//      */
//     public static boolean constantTimeAreEqual(
//         byte[]  a,
//         byte[]  b)
//     {
//         if (a == b)
//         {
//             return true;
//         }
// 
//         if (a == null || b == null)
//         {
//             return false;
//         }
// 
//         if (a.length != b.length)
//         {
//             return false;
//         }
// 
//         int nonEqual = 0;
// 
//         for (int i = 0; i != a.length; i++)
//         {
//             nonEqual |= (a[i] ^ b[i]);
//         }
// 
//         return nonEqual == 0;
//     }
// 
//     public static boolean areEqual(
//         int[]  a,
//         int[]  b)
//     {
//         if (a == b)
//         {
//             return true;
//         }
// 
//         if (a == null || b == null)
//         {
//             return false;
//         }
// 
//         if (a.length != b.length)
//         {
//             return false;
//         }
// 
//         for (int i = 0; i != a.length; i++)
//         {
//             if (a[i] != b[i])
//             {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     public static void fill(
//         byte[] array,
//         byte value)
//     {
//         for (int i = 0; i < array.length; i++)
//         {
//             array[i] = value;
//         }
//     }
//     
//     public static void fill(
//         long[] array,
//         long value)
//     {
//         for (int i = 0; i < array.length; i++)
//         {
//             array[i] = value;
//         }
//     }
// 
//     public static void fill(
//         short[] array, 
//         short value)
//     {
//         for (int i = 0; i < array.length; i++)
//         {
//             array[i] = value;
//         }
//     }
// 
//     public static int hashCode(byte[] data)
//     {
//         if (data == null)
//         {
//             return 0;
//         }
// 
//         int i = data.length;
//         int hc = i + 1;
// 
//         while (--i >= 0)
//         {
//             hc *= 257;
//             hc ^= data[i];
//         }
// 
//         return hc;
//     }
// 
//     public static byte[] clone(byte[] data)
//     {
//         if (data == null)
//         {
//             return null;
//         }
//         byte[] copy = new byte[data.length];
// 
//         System.arraycopy(data, 0, copy, 0, data.length);
// 
//         return copy;
//     }
// 
//     public static int[] clone(int[] data)
//     {
//         if (data == null)
//         {
//             return null;
//         }
//         int[] copy = new int[data.length];
// 
//         System.arraycopy(data, 0, copy, 0, data.length);
// 
//         return copy;
//     }
// }


// Path: BraintreeAndroidEncryption/src/main/java/com/braintree/org/bouncycastle/asn1/DERUnknownTag.java
import java.io.IOException;
import com.braintree.org.bouncycastle.util.Arrays;


    public byte[] getData()
    {
        return data;
    }

    void encode(
        DEROutputStream  out)
        throws IOException
    {
        out.writeEncoded(isConstructed ? DERTags.CONSTRUCTED : 0, tag, data);
    }
    
    public boolean equals(
        Object o)
    {
        if (!(o instanceof DERUnknownTag))
        {
            return false;
        }
        
        DERUnknownTag other = (DERUnknownTag)o;

        return isConstructed == other.isConstructed
            && tag == other.tag
            && Arrays.areEqual(data, other.data);
    }
    
    public int hashCode()
    {
        return (isConstructed ? ~0 : 0) ^ tag ^ Arrays.hashCode(data);