| Index: third_party/protobuf/java/core/src/main/java/com/google/protobuf/ByteString.java
 | 
| diff --git a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/ByteString.java b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/ByteString.java
 | 
| index 99a312096d8775f964e05945664a47848c0f8a01..62c945085f6195c5e8ae5878859c1ed769ca8c9b 100644
 | 
| --- a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/ByteString.java
 | 
| +++ b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/ByteString.java
 | 
| @@ -51,12 +51,14 @@ import java.util.List;
 | 
|  import java.util.NoSuchElementException;
 | 
|  
 | 
|  /**
 | 
| - * Immutable sequence of bytes. Substring is supported by sharing the reference to the immutable
 | 
| - * underlying bytes. Concatenation is likewise supported without copying (long strings) by building
 | 
| - * a tree of pieces in {@link RopeByteString}.
 | 
| - *
 | 
| - * <p>Like {@link String}, the contents of a {@link ByteString} can never be observed to change, not
 | 
| - * even in the presence of a data race or incorrect API usage in the client code.
 | 
| + * Immutable sequence of bytes.  Substring is supported by sharing the reference
 | 
| + * to the immutable underlying bytes, as with {@link String}.  Concatenation is
 | 
| + * likewise supported without copying (long strings) by building a tree of
 | 
| + * pieces in {@link RopeByteString}.
 | 
| + * <p>
 | 
| + * Like {@link String}, the contents of a {@link ByteString} can never be
 | 
| + * observed to change, not even in the presence of a data race or incorrect
 | 
| + * API usage in the client code.
 | 
|   *
 | 
|   * @author crazybob@google.com Bob Lee
 | 
|   * @author kenton@google.com Kenton Varda
 | 
| @@ -85,17 +87,17 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|     * Empty {@code ByteString}.
 | 
|     */
 | 
|    public static final ByteString EMPTY = new LiteralByteString(Internal.EMPTY_BYTE_ARRAY);
 | 
| -
 | 
| -  /**
 | 
| +  
 | 
| +  /** 
 | 
|     * An interface to efficiently copy {@code byte[]}.
 | 
| -   *
 | 
| -   * <p>One of the noticeable costs of copying a byte[] into a new array using
 | 
| -   * {@code System.arraycopy} is nullification of a new buffer before the copy. It has been shown
 | 
| +   * 
 | 
| +   * <p>One of the noticable costs of copying a byte[] into a new array using 
 | 
| +   * {@code System.arraycopy} is nullification of a new buffer before the copy. It has been shown 
 | 
|     * the Hotspot VM is capable to intrisicfy {@code Arrays.copyOfRange} operation to avoid this
 | 
|     * expensive nullification and provide substantial performance gain. Unfortunately this does not
 | 
|     * hold on Android runtimes and could make the copy slightly slower due to additional code in
 | 
|     * the {@code Arrays.copyOfRange}. Thus we provide two different implementation for array copier
 | 
| -   * for Hotspot and Android runtimes.
 | 
| +   * for Hotspot and Android runtimes. 
 | 
|     */
 | 
|    private interface ByteArrayCopier {
 | 
|      /**
 | 
| @@ -103,7 +105,7 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|       */
 | 
|      byte[] copyFrom(byte[] bytes, int offset, int size);
 | 
|    }
 | 
| -
 | 
| +  
 | 
|    /** Implementation of {@code ByteArrayCopier} which uses {@link System#arraycopy}. */
 | 
|    private static final class SystemByteArrayCopier implements ByteArrayCopier {
 | 
|      @Override
 | 
| @@ -113,7 +115,7 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|        return copy;
 | 
|      }
 | 
|    }
 | 
| -
 | 
| +  
 | 
|    /** Implementation of {@code ByteArrayCopier} which uses {@link Arrays#copyOfRange}. */
 | 
|    private static final class ArraysByteArrayCopier implements ByteArrayCopier {
 | 
|      @Override
 | 
| @@ -121,7 +123,7 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|        return Arrays.copyOfRange(bytes, offset, offset + size);
 | 
|      }
 | 
|    }
 | 
| -
 | 
| +  
 | 
|    private static final ByteArrayCopier byteArrayCopier;
 | 
|    static {
 | 
|      boolean isAndroid = true;
 | 
| @@ -130,7 +132,7 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|      } catch (ClassNotFoundException e) {
 | 
|        isAndroid = false;
 | 
|      }
 | 
| -
 | 
| +    
 | 
|      byteArrayCopier = isAndroid ? new SystemByteArrayCopier() : new ArraysByteArrayCopier();
 | 
|    }
 | 
|  
 | 
| @@ -307,19 +309,7 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|    public static ByteString copyFrom(byte[] bytes) {
 | 
|      return copyFrom(bytes, 0, bytes.length);
 | 
|    }
 | 
| -
 | 
| -  /**
 | 
| -   * Wraps the given bytes into a {@code ByteString}. Intended for internal only usage.
 | 
| -   */
 | 
| -  static ByteString wrap(ByteBuffer buffer) {
 | 
| -    if (buffer.hasArray()) {
 | 
| -      final int offset = buffer.arrayOffset();
 | 
| -      return ByteString.wrap(buffer.array(), offset + buffer.position(), buffer.remaining());
 | 
| -    } else {
 | 
| -      return new NioByteString(buffer);
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| +  
 | 
|    /**
 | 
|     * Wraps the given bytes into a {@code ByteString}. Intended for internal only
 | 
|     * usage to force a classload of ByteString before LiteralByteString.
 | 
| @@ -412,7 +402,7 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|     * immutable tree of byte arrays ("chunks") of the stream data.  The
 | 
|     * first chunk is small, with subsequent chunks each being double
 | 
|     * the size, up to 8K.
 | 
| -   *
 | 
| +   * 
 | 
|     * <p>Each byte read from the input stream will be copied twice to ensure
 | 
|     * that the resulting ByteString is truly immutable.
 | 
|     *
 | 
| @@ -563,9 +553,7 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|    // Create a balanced concatenation of the next "length" elements from the
 | 
|    // iterable.
 | 
|    private static ByteString balancedConcat(Iterator<ByteString> iterator, int length) {
 | 
| -    if (length < 1) {
 | 
| -      throw new IllegalArgumentException(String.format("length (%s) must be >= 1", length));
 | 
| -    }
 | 
| +    assert length >= 1;
 | 
|      ByteString result;
 | 
|      if (length == 1) {
 | 
|        result = iterator.next();
 | 
| @@ -691,7 +679,6 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|     */
 | 
|    abstract void writeTo(ByteOutput byteOutput) throws IOException;
 | 
|  
 | 
| -
 | 
|    /**
 | 
|     * Constructs a read-only {@code java.nio.ByteBuffer} whose content
 | 
|     * is equal to the contents of this byte string.
 | 
| @@ -833,7 +820,6 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|        return true;
 | 
|      }
 | 
|  
 | 
| -
 | 
|      /**
 | 
|       * Check equality of the substring of given length of this object starting at
 | 
|       * zero with another {@code ByteString} substring starting at offset.
 | 
| @@ -1240,7 +1226,7 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|      return String.format("<ByteString@%s size=%d>",
 | 
|          Integer.toHexString(System.identityHashCode(this)), size());
 | 
|    }
 | 
| -
 | 
| +  
 | 
|    /**
 | 
|     * This class implements a {@link com.google.protobuf.ByteString} backed by a
 | 
|     * single array of bytes, contiguous in memory. It supports substring by
 | 
| @@ -1464,7 +1450,7 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
 | 
|        return 0;
 | 
|      }
 | 
|    }
 | 
| -
 | 
| +  
 | 
|    /**
 | 
|     * This class is used to represent the substring of a {@link ByteString} over a
 | 
|     * single byte array. In terms of the public API of {@link ByteString}, you end
 | 
| 
 |