// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: clientanalytics.proto

package com.google.wireless.android.play.playlog.proto;

public final class ClientAnalytics {
  private ClientAnalytics() {}
  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistry registry) {
  }
  public interface LogEventKeyValuesOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional string key = 1;
    /**
     * <code>optional string key = 1;</code>
     */
    boolean hasKey();
    /**
     * <code>optional string key = 1;</code>
     */
    java.lang.String getKey();
    /**
     * <code>optional string key = 1;</code>
     */
    com.google.protobuf.ByteString
        getKeyBytes();

    // optional string value = 2;
    /**
     * <code>optional string value = 2;</code>
     */
    boolean hasValue();
    /**
     * <code>optional string value = 2;</code>
     */
    java.lang.String getValue();
    /**
     * <code>optional string value = 2;</code>
     */
    com.google.protobuf.ByteString
        getValueBytes();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.LogEventKeyValues}
   *
   * <pre>
   * Semi-arbitrary key-value pairs describing the event. Common entries
   *  will be extracted into strongly typed fields in the GWS log records.
   * </pre>
   */
  public static final class LogEventKeyValues extends
      com.google.protobuf.GeneratedMessage
      implements LogEventKeyValuesOrBuilder {
    // Use LogEventKeyValues.newBuilder() to construct.
    private LogEventKeyValues(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private LogEventKeyValues(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final LogEventKeyValues defaultInstance;
    public static LogEventKeyValues getDefaultInstance() {
      return defaultInstance;
    }

    public LogEventKeyValues getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private LogEventKeyValues(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              bitField0_ |= 0x00000001;
              key_ = input.readBytes();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              value_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogEventKeyValues_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogEventKeyValues_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder.class);
    }

    public static com.google.protobuf.Parser<LogEventKeyValues> PARSER =
        new com.google.protobuf.AbstractParser<LogEventKeyValues>() {
      public LogEventKeyValues parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LogEventKeyValues(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<LogEventKeyValues> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // optional string key = 1;
    public static final int KEY_FIELD_NUMBER = 1;
    private java.lang.Object key_;
    /**
     * <code>optional string key = 1;</code>
     */
    public boolean hasKey() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional string key = 1;</code>
     */
    public java.lang.String getKey() {
      java.lang.Object ref = key_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          key_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string key = 1;</code>
     */
    public com.google.protobuf.ByteString
        getKeyBytes() {
      java.lang.Object ref = key_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        key_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string value = 2;
    public static final int VALUE_FIELD_NUMBER = 2;
    private java.lang.Object value_;
    /**
     * <code>optional string value = 2;</code>
     */
    public boolean hasValue() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string value = 2;</code>
     */
    public java.lang.String getValue() {
      java.lang.Object ref = value_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          value_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string value = 2;</code>
     */
    public com.google.protobuf.ByteString
        getValueBytes() {
      java.lang.Object ref = value_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        value_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private void initFields() {
      key_ = "";
      value_ = "";
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBytes(1, getKeyBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, getValueBytes());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(1, getKeyBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, getValueBytes());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.LogEventKeyValues}
     *
     * <pre>
     * Semi-arbitrary key-value pairs describing the event. Common entries
     *  will be extracted into strongly typed fields in the GWS log records.
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValuesOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogEventKeyValues_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogEventKeyValues_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        key_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        value_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogEventKeyValues_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.key_ = key_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.value_ = value_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.getDefaultInstance()) return this;
        if (other.hasKey()) {
          bitField0_ |= 0x00000001;
          key_ = other.key_;
          onChanged();
        }
        if (other.hasValue()) {
          bitField0_ |= 0x00000002;
          value_ = other.value_;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional string key = 1;
      private java.lang.Object key_ = "";
      /**
       * <code>optional string key = 1;</code>
       */
      public boolean hasKey() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional string key = 1;</code>
       */
      public java.lang.String getKey() {
        java.lang.Object ref = key_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          key_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string key = 1;</code>
       */
      public com.google.protobuf.ByteString
          getKeyBytes() {
        java.lang.Object ref = key_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          key_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string key = 1;</code>
       */
      public Builder setKey(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        key_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string key = 1;</code>
       */
      public Builder clearKey() {
        bitField0_ = (bitField0_ & ~0x00000001);
        key_ = getDefaultInstance().getKey();
        onChanged();
        return this;
      }
      /**
       * <code>optional string key = 1;</code>
       */
      public Builder setKeyBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        key_ = value;
        onChanged();
        return this;
      }

      // optional string value = 2;
      private java.lang.Object value_ = "";
      /**
       * <code>optional string value = 2;</code>
       */
      public boolean hasValue() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string value = 2;</code>
       */
      public java.lang.String getValue() {
        java.lang.Object ref = value_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          value_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string value = 2;</code>
       */
      public com.google.protobuf.ByteString
          getValueBytes() {
        java.lang.Object ref = value_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          value_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string value = 2;</code>
       */
      public Builder setValue(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        value_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string value = 2;</code>
       */
      public Builder clearValue() {
        bitField0_ = (bitField0_ & ~0x00000002);
        value_ = getDefaultInstance().getValue();
        onChanged();
        return this;
      }
      /**
       * <code>optional string value = 2;</code>
       */
      public Builder setValueBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        value_ = value;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.LogEventKeyValues)
    }

    static {
      defaultInstance = new LogEventKeyValues(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.LogEventKeyValues)
  }

  public interface ActiveExperimentsOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // repeated string client_altering_experiment = 1;
    /**
     * <code>repeated string client_altering_experiment = 1;</code>
     *
     * <pre>
     * The list of IDs of client-behavior-altering experiments that are on.
     * </pre>
     */
    java.util.List<java.lang.String>
    getClientAlteringExperimentList();
    /**
     * <code>repeated string client_altering_experiment = 1;</code>
     *
     * <pre>
     * The list of IDs of client-behavior-altering experiments that are on.
     * </pre>
     */
    int getClientAlteringExperimentCount();
    /**
     * <code>repeated string client_altering_experiment = 1;</code>
     *
     * <pre>
     * The list of IDs of client-behavior-altering experiments that are on.
     * </pre>
     */
    java.lang.String getClientAlteringExperiment(int index);
    /**
     * <code>repeated string client_altering_experiment = 1;</code>
     *
     * <pre>
     * The list of IDs of client-behavior-altering experiments that are on.
     * </pre>
     */
    com.google.protobuf.ByteString
        getClientAlteringExperimentBytes(int index);

    // repeated string other_experiment = 2;
    /**
     * <code>repeated string other_experiment = 2;</code>
     *
     * <pre>
     * The list of IDs of other experiments that are on. The client must not
     *  change its behavior in response to these experiments.
     * </pre>
     */
    java.util.List<java.lang.String>
    getOtherExperimentList();
    /**
     * <code>repeated string other_experiment = 2;</code>
     *
     * <pre>
     * The list of IDs of other experiments that are on. The client must not
     *  change its behavior in response to these experiments.
     * </pre>
     */
    int getOtherExperimentCount();
    /**
     * <code>repeated string other_experiment = 2;</code>
     *
     * <pre>
     * The list of IDs of other experiments that are on. The client must not
     *  change its behavior in response to these experiments.
     * </pre>
     */
    java.lang.String getOtherExperiment(int index);
    /**
     * <code>repeated string other_experiment = 2;</code>
     *
     * <pre>
     * The list of IDs of other experiments that are on. The client must not
     *  change its behavior in response to these experiments.
     * </pre>
     */
    com.google.protobuf.ByteString
        getOtherExperimentBytes(int index);

    // repeated int32 gws_experiment = 3;
    /**
     * <code>repeated int32 gws_experiment = 3;</code>
     *
     * <pre>
     * The list of GWS experiments that are on. These are not targeted by Playlog.
     * </pre>
     */
    java.util.List<java.lang.Integer> getGwsExperimentList();
    /**
     * <code>repeated int32 gws_experiment = 3;</code>
     *
     * <pre>
     * The list of GWS experiments that are on. These are not targeted by Playlog.
     * </pre>
     */
    int getGwsExperimentCount();
    /**
     * <code>repeated int32 gws_experiment = 3;</code>
     *
     * <pre>
     * The list of GWS experiments that are on. These are not targeted by Playlog.
     * </pre>
     */
    int getGwsExperiment(int index);

    // repeated int64 play_experiment = 4;
    /**
     * <code>repeated int64 play_experiment = 4;</code>
     *
     * <pre>
     * The list of Play experiments that are enabled for this LogEvent.
     *  Includes both client-side and server-side experiments.
     * </pre>
     */
    java.util.List<java.lang.Long> getPlayExperimentList();
    /**
     * <code>repeated int64 play_experiment = 4;</code>
     *
     * <pre>
     * The list of Play experiments that are enabled for this LogEvent.
     *  Includes both client-side and server-side experiments.
     * </pre>
     */
    int getPlayExperimentCount();
    /**
     * <code>repeated int64 play_experiment = 4;</code>
     *
     * <pre>
     * The list of Play experiments that are enabled for this LogEvent.
     *  Includes both client-side and server-side experiments.
     * </pre>
     */
    long getPlayExperiment(int index);

    // repeated int64 unsupported_play_experiment = 5;
    /**
     * <code>repeated int64 unsupported_play_experiment = 5;</code>
     *
     * <pre>
     * The list of Play experiments that were sent to the client for this LogEvent
     *  but is not recognized by the client. May include server-side experiments
     *  that were active, so correct this list in the logging service.
     * </pre>
     */
    java.util.List<java.lang.Long> getUnsupportedPlayExperimentList();
    /**
     * <code>repeated int64 unsupported_play_experiment = 5;</code>
     *
     * <pre>
     * The list of Play experiments that were sent to the client for this LogEvent
     *  but is not recognized by the client. May include server-side experiments
     *  that were active, so correct this list in the logging service.
     * </pre>
     */
    int getUnsupportedPlayExperimentCount();
    /**
     * <code>repeated int64 unsupported_play_experiment = 5;</code>
     *
     * <pre>
     * The list of Play experiments that were sent to the client for this LogEvent
     *  but is not recognized by the client. May include server-side experiments
     *  that were active, so correct this list in the logging service.
     * </pre>
     */
    long getUnsupportedPlayExperiment(int index);
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.ActiveExperiments}
   *
   * <pre>
   * The set of currently active experiments for a given LogEvent.
   *
   *  Next tag: 6
   * </pre>
   */
  public static final class ActiveExperiments extends
      com.google.protobuf.GeneratedMessage
      implements ActiveExperimentsOrBuilder {
    // Use ActiveExperiments.newBuilder() to construct.
    private ActiveExperiments(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private ActiveExperiments(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final ActiveExperiments defaultInstance;
    public static ActiveExperiments getDefaultInstance() {
      return defaultInstance;
    }

    public ActiveExperiments getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private ActiveExperiments(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
                clientAlteringExperiment_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00000001;
              }
              clientAlteringExperiment_.add(input.readBytes());
              break;
            }
            case 18: {
              if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
                otherExperiment_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00000002;
              }
              otherExperiment_.add(input.readBytes());
              break;
            }
            case 24: {
              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
                gwsExperiment_ = new java.util.ArrayList<java.lang.Integer>();
                mutable_bitField0_ |= 0x00000004;
              }
              gwsExperiment_.add(input.readInt32());
              break;
            }
            case 26: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004) && input.getBytesUntilLimit() > 0) {
                gwsExperiment_ = new java.util.ArrayList<java.lang.Integer>();
                mutable_bitField0_ |= 0x00000004;
              }
              while (input.getBytesUntilLimit() > 0) {
                gwsExperiment_.add(input.readInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 32: {
              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
                playExperiment_ = new java.util.ArrayList<java.lang.Long>();
                mutable_bitField0_ |= 0x00000008;
              }
              playExperiment_.add(input.readInt64());
              break;
            }
            case 34: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000008) == 0x00000008) && input.getBytesUntilLimit() > 0) {
                playExperiment_ = new java.util.ArrayList<java.lang.Long>();
                mutable_bitField0_ |= 0x00000008;
              }
              while (input.getBytesUntilLimit() > 0) {
                playExperiment_.add(input.readInt64());
              }
              input.popLimit(limit);
              break;
            }
            case 40: {
              if (!((mutable_bitField0_ & 0x00000010) == 0x00000010)) {
                unsupportedPlayExperiment_ = new java.util.ArrayList<java.lang.Long>();
                mutable_bitField0_ |= 0x00000010;
              }
              unsupportedPlayExperiment_.add(input.readInt64());
              break;
            }
            case 42: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00000010) == 0x00000010) && input.getBytesUntilLimit() > 0) {
                unsupportedPlayExperiment_ = new java.util.ArrayList<java.lang.Long>();
                mutable_bitField0_ |= 0x00000010;
              }
              while (input.getBytesUntilLimit() > 0) {
                unsupportedPlayExperiment_.add(input.readInt64());
              }
              input.popLimit(limit);
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
          clientAlteringExperiment_ = new com.google.protobuf.UnmodifiableLazyStringList(clientAlteringExperiment_);
        }
        if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
          otherExperiment_ = new com.google.protobuf.UnmodifiableLazyStringList(otherExperiment_);
        }
        if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
          gwsExperiment_ = java.util.Collections.unmodifiableList(gwsExperiment_);
        }
        if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
          playExperiment_ = java.util.Collections.unmodifiableList(playExperiment_);
        }
        if (((mutable_bitField0_ & 0x00000010) == 0x00000010)) {
          unsupportedPlayExperiment_ = java.util.Collections.unmodifiableList(unsupportedPlayExperiment_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ActiveExperiments_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ActiveExperiments_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.Builder.class);
    }

    public static com.google.protobuf.Parser<ActiveExperiments> PARSER =
        new com.google.protobuf.AbstractParser<ActiveExperiments>() {
      public ActiveExperiments parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new ActiveExperiments(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<ActiveExperiments> getParserForType() {
      return PARSER;
    }

    // repeated string client_altering_experiment = 1;
    public static final int CLIENT_ALTERING_EXPERIMENT_FIELD_NUMBER = 1;
    private com.google.protobuf.LazyStringList clientAlteringExperiment_;
    /**
     * <code>repeated string client_altering_experiment = 1;</code>
     *
     * <pre>
     * The list of IDs of client-behavior-altering experiments that are on.
     * </pre>
     */
    public java.util.List<java.lang.String>
        getClientAlteringExperimentList() {
      return clientAlteringExperiment_;
    }
    /**
     * <code>repeated string client_altering_experiment = 1;</code>
     *
     * <pre>
     * The list of IDs of client-behavior-altering experiments that are on.
     * </pre>
     */
    public int getClientAlteringExperimentCount() {
      return clientAlteringExperiment_.size();
    }
    /**
     * <code>repeated string client_altering_experiment = 1;</code>
     *
     * <pre>
     * The list of IDs of client-behavior-altering experiments that are on.
     * </pre>
     */
    public java.lang.String getClientAlteringExperiment(int index) {
      return clientAlteringExperiment_.get(index);
    }
    /**
     * <code>repeated string client_altering_experiment = 1;</code>
     *
     * <pre>
     * The list of IDs of client-behavior-altering experiments that are on.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getClientAlteringExperimentBytes(int index) {
      return clientAlteringExperiment_.getByteString(index);
    }

    // repeated string other_experiment = 2;
    public static final int OTHER_EXPERIMENT_FIELD_NUMBER = 2;
    private com.google.protobuf.LazyStringList otherExperiment_;
    /**
     * <code>repeated string other_experiment = 2;</code>
     *
     * <pre>
     * The list of IDs of other experiments that are on. The client must not
     *  change its behavior in response to these experiments.
     * </pre>
     */
    public java.util.List<java.lang.String>
        getOtherExperimentList() {
      return otherExperiment_;
    }
    /**
     * <code>repeated string other_experiment = 2;</code>
     *
     * <pre>
     * The list of IDs of other experiments that are on. The client must not
     *  change its behavior in response to these experiments.
     * </pre>
     */
    public int getOtherExperimentCount() {
      return otherExperiment_.size();
    }
    /**
     * <code>repeated string other_experiment = 2;</code>
     *
     * <pre>
     * The list of IDs of other experiments that are on. The client must not
     *  change its behavior in response to these experiments.
     * </pre>
     */
    public java.lang.String getOtherExperiment(int index) {
      return otherExperiment_.get(index);
    }
    /**
     * <code>repeated string other_experiment = 2;</code>
     *
     * <pre>
     * The list of IDs of other experiments that are on. The client must not
     *  change its behavior in response to these experiments.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getOtherExperimentBytes(int index) {
      return otherExperiment_.getByteString(index);
    }

    // repeated int32 gws_experiment = 3;
    public static final int GWS_EXPERIMENT_FIELD_NUMBER = 3;
    private java.util.List<java.lang.Integer> gwsExperiment_;
    /**
     * <code>repeated int32 gws_experiment = 3;</code>
     *
     * <pre>
     * The list of GWS experiments that are on. These are not targeted by Playlog.
     * </pre>
     */
    public java.util.List<java.lang.Integer>
        getGwsExperimentList() {
      return gwsExperiment_;
    }
    /**
     * <code>repeated int32 gws_experiment = 3;</code>
     *
     * <pre>
     * The list of GWS experiments that are on. These are not targeted by Playlog.
     * </pre>
     */
    public int getGwsExperimentCount() {
      return gwsExperiment_.size();
    }
    /**
     * <code>repeated int32 gws_experiment = 3;</code>
     *
     * <pre>
     * The list of GWS experiments that are on. These are not targeted by Playlog.
     * </pre>
     */
    public int getGwsExperiment(int index) {
      return gwsExperiment_.get(index);
    }

    // repeated int64 play_experiment = 4;
    public static final int PLAY_EXPERIMENT_FIELD_NUMBER = 4;
    private java.util.List<java.lang.Long> playExperiment_;
    /**
     * <code>repeated int64 play_experiment = 4;</code>
     *
     * <pre>
     * The list of Play experiments that are enabled for this LogEvent.
     *  Includes both client-side and server-side experiments.
     * </pre>
     */
    public java.util.List<java.lang.Long>
        getPlayExperimentList() {
      return playExperiment_;
    }
    /**
     * <code>repeated int64 play_experiment = 4;</code>
     *
     * <pre>
     * The list of Play experiments that are enabled for this LogEvent.
     *  Includes both client-side and server-side experiments.
     * </pre>
     */
    public int getPlayExperimentCount() {
      return playExperiment_.size();
    }
    /**
     * <code>repeated int64 play_experiment = 4;</code>
     *
     * <pre>
     * The list of Play experiments that are enabled for this LogEvent.
     *  Includes both client-side and server-side experiments.
     * </pre>
     */
    public long getPlayExperiment(int index) {
      return playExperiment_.get(index);
    }

    // repeated int64 unsupported_play_experiment = 5;
    public static final int UNSUPPORTED_PLAY_EXPERIMENT_FIELD_NUMBER = 5;
    private java.util.List<java.lang.Long> unsupportedPlayExperiment_;
    /**
     * <code>repeated int64 unsupported_play_experiment = 5;</code>
     *
     * <pre>
     * The list of Play experiments that were sent to the client for this LogEvent
     *  but is not recognized by the client. May include server-side experiments
     *  that were active, so correct this list in the logging service.
     * </pre>
     */
    public java.util.List<java.lang.Long>
        getUnsupportedPlayExperimentList() {
      return unsupportedPlayExperiment_;
    }
    /**
     * <code>repeated int64 unsupported_play_experiment = 5;</code>
     *
     * <pre>
     * The list of Play experiments that were sent to the client for this LogEvent
     *  but is not recognized by the client. May include server-side experiments
     *  that were active, so correct this list in the logging service.
     * </pre>
     */
    public int getUnsupportedPlayExperimentCount() {
      return unsupportedPlayExperiment_.size();
    }
    /**
     * <code>repeated int64 unsupported_play_experiment = 5;</code>
     *
     * <pre>
     * The list of Play experiments that were sent to the client for this LogEvent
     *  but is not recognized by the client. May include server-side experiments
     *  that were active, so correct this list in the logging service.
     * </pre>
     */
    public long getUnsupportedPlayExperiment(int index) {
      return unsupportedPlayExperiment_.get(index);
    }

    private void initFields() {
      clientAlteringExperiment_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      otherExperiment_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      gwsExperiment_ = java.util.Collections.emptyList();
      playExperiment_ = java.util.Collections.emptyList();
      unsupportedPlayExperiment_ = java.util.Collections.emptyList();
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      for (int i = 0; i < clientAlteringExperiment_.size(); i++) {
        output.writeBytes(1, clientAlteringExperiment_.getByteString(i));
      }
      for (int i = 0; i < otherExperiment_.size(); i++) {
        output.writeBytes(2, otherExperiment_.getByteString(i));
      }
      for (int i = 0; i < gwsExperiment_.size(); i++) {
        output.writeInt32(3, gwsExperiment_.get(i));
      }
      for (int i = 0; i < playExperiment_.size(); i++) {
        output.writeInt64(4, playExperiment_.get(i));
      }
      for (int i = 0; i < unsupportedPlayExperiment_.size(); i++) {
        output.writeInt64(5, unsupportedPlayExperiment_.get(i));
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      {
        int dataSize = 0;
        for (int i = 0; i < clientAlteringExperiment_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeBytesSizeNoTag(clientAlteringExperiment_.getByteString(i));
        }
        size += dataSize;
        size += 1 * getClientAlteringExperimentList().size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < otherExperiment_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeBytesSizeNoTag(otherExperiment_.getByteString(i));
        }
        size += dataSize;
        size += 1 * getOtherExperimentList().size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < gwsExperiment_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeInt32SizeNoTag(gwsExperiment_.get(i));
        }
        size += dataSize;
        size += 1 * getGwsExperimentList().size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < playExperiment_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeInt64SizeNoTag(playExperiment_.get(i));
        }
        size += dataSize;
        size += 1 * getPlayExperimentList().size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < unsupportedPlayExperiment_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeInt64SizeNoTag(unsupportedPlayExperiment_.get(i));
        }
        size += dataSize;
        size += 1 * getUnsupportedPlayExperimentList().size();
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.ActiveExperiments}
     *
     * <pre>
     * The set of currently active experiments for a given LogEvent.
     *
     *  Next tag: 6
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperimentsOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ActiveExperiments_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ActiveExperiments_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        clientAlteringExperiment_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        otherExperiment_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000002);
        gwsExperiment_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000004);
        playExperiment_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000008);
        unsupportedPlayExperiment_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ActiveExperiments_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments(this);
        int from_bitField0_ = bitField0_;
        if (((bitField0_ & 0x00000001) == 0x00000001)) {
          clientAlteringExperiment_ = new com.google.protobuf.UnmodifiableLazyStringList(
              clientAlteringExperiment_);
          bitField0_ = (bitField0_ & ~0x00000001);
        }
        result.clientAlteringExperiment_ = clientAlteringExperiment_;
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          otherExperiment_ = new com.google.protobuf.UnmodifiableLazyStringList(
              otherExperiment_);
          bitField0_ = (bitField0_ & ~0x00000002);
        }
        result.otherExperiment_ = otherExperiment_;
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          gwsExperiment_ = java.util.Collections.unmodifiableList(gwsExperiment_);
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.gwsExperiment_ = gwsExperiment_;
        if (((bitField0_ & 0x00000008) == 0x00000008)) {
          playExperiment_ = java.util.Collections.unmodifiableList(playExperiment_);
          bitField0_ = (bitField0_ & ~0x00000008);
        }
        result.playExperiment_ = playExperiment_;
        if (((bitField0_ & 0x00000010) == 0x00000010)) {
          unsupportedPlayExperiment_ = java.util.Collections.unmodifiableList(unsupportedPlayExperiment_);
          bitField0_ = (bitField0_ & ~0x00000010);
        }
        result.unsupportedPlayExperiment_ = unsupportedPlayExperiment_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.getDefaultInstance()) return this;
        if (!other.clientAlteringExperiment_.isEmpty()) {
          if (clientAlteringExperiment_.isEmpty()) {
            clientAlteringExperiment_ = other.clientAlteringExperiment_;
            bitField0_ = (bitField0_ & ~0x00000001);
          } else {
            ensureClientAlteringExperimentIsMutable();
            clientAlteringExperiment_.addAll(other.clientAlteringExperiment_);
          }
          onChanged();
        }
        if (!other.otherExperiment_.isEmpty()) {
          if (otherExperiment_.isEmpty()) {
            otherExperiment_ = other.otherExperiment_;
            bitField0_ = (bitField0_ & ~0x00000002);
          } else {
            ensureOtherExperimentIsMutable();
            otherExperiment_.addAll(other.otherExperiment_);
          }
          onChanged();
        }
        if (!other.gwsExperiment_.isEmpty()) {
          if (gwsExperiment_.isEmpty()) {
            gwsExperiment_ = other.gwsExperiment_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureGwsExperimentIsMutable();
            gwsExperiment_.addAll(other.gwsExperiment_);
          }
          onChanged();
        }
        if (!other.playExperiment_.isEmpty()) {
          if (playExperiment_.isEmpty()) {
            playExperiment_ = other.playExperiment_;
            bitField0_ = (bitField0_ & ~0x00000008);
          } else {
            ensurePlayExperimentIsMutable();
            playExperiment_.addAll(other.playExperiment_);
          }
          onChanged();
        }
        if (!other.unsupportedPlayExperiment_.isEmpty()) {
          if (unsupportedPlayExperiment_.isEmpty()) {
            unsupportedPlayExperiment_ = other.unsupportedPlayExperiment_;
            bitField0_ = (bitField0_ & ~0x00000010);
          } else {
            ensureUnsupportedPlayExperimentIsMutable();
            unsupportedPlayExperiment_.addAll(other.unsupportedPlayExperiment_);
          }
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // repeated string client_altering_experiment = 1;
      private com.google.protobuf.LazyStringList clientAlteringExperiment_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureClientAlteringExperimentIsMutable() {
        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
          clientAlteringExperiment_ = new com.google.protobuf.LazyStringArrayList(clientAlteringExperiment_);
          bitField0_ |= 0x00000001;
         }
      }
      /**
       * <code>repeated string client_altering_experiment = 1;</code>
       *
       * <pre>
       * The list of IDs of client-behavior-altering experiments that are on.
       * </pre>
       */
      public java.util.List<java.lang.String>
          getClientAlteringExperimentList() {
        return java.util.Collections.unmodifiableList(clientAlteringExperiment_);
      }
      /**
       * <code>repeated string client_altering_experiment = 1;</code>
       *
       * <pre>
       * The list of IDs of client-behavior-altering experiments that are on.
       * </pre>
       */
      public int getClientAlteringExperimentCount() {
        return clientAlteringExperiment_.size();
      }
      /**
       * <code>repeated string client_altering_experiment = 1;</code>
       *
       * <pre>
       * The list of IDs of client-behavior-altering experiments that are on.
       * </pre>
       */
      public java.lang.String getClientAlteringExperiment(int index) {
        return clientAlteringExperiment_.get(index);
      }
      /**
       * <code>repeated string client_altering_experiment = 1;</code>
       *
       * <pre>
       * The list of IDs of client-behavior-altering experiments that are on.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getClientAlteringExperimentBytes(int index) {
        return clientAlteringExperiment_.getByteString(index);
      }
      /**
       * <code>repeated string client_altering_experiment = 1;</code>
       *
       * <pre>
       * The list of IDs of client-behavior-altering experiments that are on.
       * </pre>
       */
      public Builder setClientAlteringExperiment(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureClientAlteringExperimentIsMutable();
        clientAlteringExperiment_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string client_altering_experiment = 1;</code>
       *
       * <pre>
       * The list of IDs of client-behavior-altering experiments that are on.
       * </pre>
       */
      public Builder addClientAlteringExperiment(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureClientAlteringExperimentIsMutable();
        clientAlteringExperiment_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string client_altering_experiment = 1;</code>
       *
       * <pre>
       * The list of IDs of client-behavior-altering experiments that are on.
       * </pre>
       */
      public Builder addAllClientAlteringExperiment(
          java.lang.Iterable<java.lang.String> values) {
        ensureClientAlteringExperimentIsMutable();
        super.addAll(values, clientAlteringExperiment_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string client_altering_experiment = 1;</code>
       *
       * <pre>
       * The list of IDs of client-behavior-altering experiments that are on.
       * </pre>
       */
      public Builder clearClientAlteringExperiment() {
        clientAlteringExperiment_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string client_altering_experiment = 1;</code>
       *
       * <pre>
       * The list of IDs of client-behavior-altering experiments that are on.
       * </pre>
       */
      public Builder addClientAlteringExperimentBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureClientAlteringExperimentIsMutable();
        clientAlteringExperiment_.add(value);
        onChanged();
        return this;
      }

      // repeated string other_experiment = 2;
      private com.google.protobuf.LazyStringList otherExperiment_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureOtherExperimentIsMutable() {
        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
          otherExperiment_ = new com.google.protobuf.LazyStringArrayList(otherExperiment_);
          bitField0_ |= 0x00000002;
         }
      }
      /**
       * <code>repeated string other_experiment = 2;</code>
       *
       * <pre>
       * The list of IDs of other experiments that are on. The client must not
       *  change its behavior in response to these experiments.
       * </pre>
       */
      public java.util.List<java.lang.String>
          getOtherExperimentList() {
        return java.util.Collections.unmodifiableList(otherExperiment_);
      }
      /**
       * <code>repeated string other_experiment = 2;</code>
       *
       * <pre>
       * The list of IDs of other experiments that are on. The client must not
       *  change its behavior in response to these experiments.
       * </pre>
       */
      public int getOtherExperimentCount() {
        return otherExperiment_.size();
      }
      /**
       * <code>repeated string other_experiment = 2;</code>
       *
       * <pre>
       * The list of IDs of other experiments that are on. The client must not
       *  change its behavior in response to these experiments.
       * </pre>
       */
      public java.lang.String getOtherExperiment(int index) {
        return otherExperiment_.get(index);
      }
      /**
       * <code>repeated string other_experiment = 2;</code>
       *
       * <pre>
       * The list of IDs of other experiments that are on. The client must not
       *  change its behavior in response to these experiments.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getOtherExperimentBytes(int index) {
        return otherExperiment_.getByteString(index);
      }
      /**
       * <code>repeated string other_experiment = 2;</code>
       *
       * <pre>
       * The list of IDs of other experiments that are on. The client must not
       *  change its behavior in response to these experiments.
       * </pre>
       */
      public Builder setOtherExperiment(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureOtherExperimentIsMutable();
        otherExperiment_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string other_experiment = 2;</code>
       *
       * <pre>
       * The list of IDs of other experiments that are on. The client must not
       *  change its behavior in response to these experiments.
       * </pre>
       */
      public Builder addOtherExperiment(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureOtherExperimentIsMutable();
        otherExperiment_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string other_experiment = 2;</code>
       *
       * <pre>
       * The list of IDs of other experiments that are on. The client must not
       *  change its behavior in response to these experiments.
       * </pre>
       */
      public Builder addAllOtherExperiment(
          java.lang.Iterable<java.lang.String> values) {
        ensureOtherExperimentIsMutable();
        super.addAll(values, otherExperiment_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string other_experiment = 2;</code>
       *
       * <pre>
       * The list of IDs of other experiments that are on. The client must not
       *  change its behavior in response to these experiments.
       * </pre>
       */
      public Builder clearOtherExperiment() {
        otherExperiment_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000002);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string other_experiment = 2;</code>
       *
       * <pre>
       * The list of IDs of other experiments that are on. The client must not
       *  change its behavior in response to these experiments.
       * </pre>
       */
      public Builder addOtherExperimentBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureOtherExperimentIsMutable();
        otherExperiment_.add(value);
        onChanged();
        return this;
      }

      // repeated int32 gws_experiment = 3;
      private java.util.List<java.lang.Integer> gwsExperiment_ = java.util.Collections.emptyList();
      private void ensureGwsExperimentIsMutable() {
        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
          gwsExperiment_ = new java.util.ArrayList<java.lang.Integer>(gwsExperiment_);
          bitField0_ |= 0x00000004;
         }
      }
      /**
       * <code>repeated int32 gws_experiment = 3;</code>
       *
       * <pre>
       * The list of GWS experiments that are on. These are not targeted by Playlog.
       * </pre>
       */
      public java.util.List<java.lang.Integer>
          getGwsExperimentList() {
        return java.util.Collections.unmodifiableList(gwsExperiment_);
      }
      /**
       * <code>repeated int32 gws_experiment = 3;</code>
       *
       * <pre>
       * The list of GWS experiments that are on. These are not targeted by Playlog.
       * </pre>
       */
      public int getGwsExperimentCount() {
        return gwsExperiment_.size();
      }
      /**
       * <code>repeated int32 gws_experiment = 3;</code>
       *
       * <pre>
       * The list of GWS experiments that are on. These are not targeted by Playlog.
       * </pre>
       */
      public int getGwsExperiment(int index) {
        return gwsExperiment_.get(index);
      }
      /**
       * <code>repeated int32 gws_experiment = 3;</code>
       *
       * <pre>
       * The list of GWS experiments that are on. These are not targeted by Playlog.
       * </pre>
       */
      public Builder setGwsExperiment(
          int index, int value) {
        ensureGwsExperimentIsMutable();
        gwsExperiment_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 gws_experiment = 3;</code>
       *
       * <pre>
       * The list of GWS experiments that are on. These are not targeted by Playlog.
       * </pre>
       */
      public Builder addGwsExperiment(int value) {
        ensureGwsExperimentIsMutable();
        gwsExperiment_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 gws_experiment = 3;</code>
       *
       * <pre>
       * The list of GWS experiments that are on. These are not targeted by Playlog.
       * </pre>
       */
      public Builder addAllGwsExperiment(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureGwsExperimentIsMutable();
        super.addAll(values, gwsExperiment_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 gws_experiment = 3;</code>
       *
       * <pre>
       * The list of GWS experiments that are on. These are not targeted by Playlog.
       * </pre>
       */
      public Builder clearGwsExperiment() {
        gwsExperiment_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }

      // repeated int64 play_experiment = 4;
      private java.util.List<java.lang.Long> playExperiment_ = java.util.Collections.emptyList();
      private void ensurePlayExperimentIsMutable() {
        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
          playExperiment_ = new java.util.ArrayList<java.lang.Long>(playExperiment_);
          bitField0_ |= 0x00000008;
         }
      }
      /**
       * <code>repeated int64 play_experiment = 4;</code>
       *
       * <pre>
       * The list of Play experiments that are enabled for this LogEvent.
       *  Includes both client-side and server-side experiments.
       * </pre>
       */
      public java.util.List<java.lang.Long>
          getPlayExperimentList() {
        return java.util.Collections.unmodifiableList(playExperiment_);
      }
      /**
       * <code>repeated int64 play_experiment = 4;</code>
       *
       * <pre>
       * The list of Play experiments that are enabled for this LogEvent.
       *  Includes both client-side and server-side experiments.
       * </pre>
       */
      public int getPlayExperimentCount() {
        return playExperiment_.size();
      }
      /**
       * <code>repeated int64 play_experiment = 4;</code>
       *
       * <pre>
       * The list of Play experiments that are enabled for this LogEvent.
       *  Includes both client-side and server-side experiments.
       * </pre>
       */
      public long getPlayExperiment(int index) {
        return playExperiment_.get(index);
      }
      /**
       * <code>repeated int64 play_experiment = 4;</code>
       *
       * <pre>
       * The list of Play experiments that are enabled for this LogEvent.
       *  Includes both client-side and server-side experiments.
       * </pre>
       */
      public Builder setPlayExperiment(
          int index, long value) {
        ensurePlayExperimentIsMutable();
        playExperiment_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int64 play_experiment = 4;</code>
       *
       * <pre>
       * The list of Play experiments that are enabled for this LogEvent.
       *  Includes both client-side and server-side experiments.
       * </pre>
       */
      public Builder addPlayExperiment(long value) {
        ensurePlayExperimentIsMutable();
        playExperiment_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int64 play_experiment = 4;</code>
       *
       * <pre>
       * The list of Play experiments that are enabled for this LogEvent.
       *  Includes both client-side and server-side experiments.
       * </pre>
       */
      public Builder addAllPlayExperiment(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensurePlayExperimentIsMutable();
        super.addAll(values, playExperiment_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int64 play_experiment = 4;</code>
       *
       * <pre>
       * The list of Play experiments that are enabled for this LogEvent.
       *  Includes both client-side and server-side experiments.
       * </pre>
       */
      public Builder clearPlayExperiment() {
        playExperiment_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000008);
        onChanged();
        return this;
      }

      // repeated int64 unsupported_play_experiment = 5;
      private java.util.List<java.lang.Long> unsupportedPlayExperiment_ = java.util.Collections.emptyList();
      private void ensureUnsupportedPlayExperimentIsMutable() {
        if (!((bitField0_ & 0x00000010) == 0x00000010)) {
          unsupportedPlayExperiment_ = new java.util.ArrayList<java.lang.Long>(unsupportedPlayExperiment_);
          bitField0_ |= 0x00000010;
         }
      }
      /**
       * <code>repeated int64 unsupported_play_experiment = 5;</code>
       *
       * <pre>
       * The list of Play experiments that were sent to the client for this LogEvent
       *  but is not recognized by the client. May include server-side experiments
       *  that were active, so correct this list in the logging service.
       * </pre>
       */
      public java.util.List<java.lang.Long>
          getUnsupportedPlayExperimentList() {
        return java.util.Collections.unmodifiableList(unsupportedPlayExperiment_);
      }
      /**
       * <code>repeated int64 unsupported_play_experiment = 5;</code>
       *
       * <pre>
       * The list of Play experiments that were sent to the client for this LogEvent
       *  but is not recognized by the client. May include server-side experiments
       *  that were active, so correct this list in the logging service.
       * </pre>
       */
      public int getUnsupportedPlayExperimentCount() {
        return unsupportedPlayExperiment_.size();
      }
      /**
       * <code>repeated int64 unsupported_play_experiment = 5;</code>
       *
       * <pre>
       * The list of Play experiments that were sent to the client for this LogEvent
       *  but is not recognized by the client. May include server-side experiments
       *  that were active, so correct this list in the logging service.
       * </pre>
       */
      public long getUnsupportedPlayExperiment(int index) {
        return unsupportedPlayExperiment_.get(index);
      }
      /**
       * <code>repeated int64 unsupported_play_experiment = 5;</code>
       *
       * <pre>
       * The list of Play experiments that were sent to the client for this LogEvent
       *  but is not recognized by the client. May include server-side experiments
       *  that were active, so correct this list in the logging service.
       * </pre>
       */
      public Builder setUnsupportedPlayExperiment(
          int index, long value) {
        ensureUnsupportedPlayExperimentIsMutable();
        unsupportedPlayExperiment_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int64 unsupported_play_experiment = 5;</code>
       *
       * <pre>
       * The list of Play experiments that were sent to the client for this LogEvent
       *  but is not recognized by the client. May include server-side experiments
       *  that were active, so correct this list in the logging service.
       * </pre>
       */
      public Builder addUnsupportedPlayExperiment(long value) {
        ensureUnsupportedPlayExperimentIsMutable();
        unsupportedPlayExperiment_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int64 unsupported_play_experiment = 5;</code>
       *
       * <pre>
       * The list of Play experiments that were sent to the client for this LogEvent
       *  but is not recognized by the client. May include server-side experiments
       *  that were active, so correct this list in the logging service.
       * </pre>
       */
      public Builder addAllUnsupportedPlayExperiment(
          java.lang.Iterable<? extends java.lang.Long> values) {
        ensureUnsupportedPlayExperimentIsMutable();
        super.addAll(values, unsupportedPlayExperiment_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int64 unsupported_play_experiment = 5;</code>
       *
       * <pre>
       * The list of Play experiments that were sent to the client for this LogEvent
       *  but is not recognized by the client. May include server-side experiments
       *  that were active, so correct this list in the logging service.
       * </pre>
       */
      public Builder clearUnsupportedPlayExperiment() {
        unsupportedPlayExperiment_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000010);
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.ActiveExperiments)
    }

    static {
      defaultInstance = new ActiveExperiments(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.ActiveExperiments)
  }

  public interface LogEventOrBuilder extends
      com.google.protobuf.GeneratedMessage.
          ExtendableMessageOrBuilder<LogEvent> {

    // optional int64 event_time_ms = 1;
    /**
     * <code>optional int64 event_time_ms = 1;</code>
     *
     * <pre>
     * Epoch time in milliseconds, according to the wall clock.
     *  See http://go/clearcut-timestamps for details on how this value is used.
     *  This field is required for Odyssey. Otherwise, events will be silently
     *  dropped.
     * </pre>
     */
    boolean hasEventTimeMs();
    /**
     * <code>optional int64 event_time_ms = 1;</code>
     *
     * <pre>
     * Epoch time in milliseconds, according to the wall clock.
     *  See http://go/clearcut-timestamps for details on how this value is used.
     *  This field is required for Odyssey. Otherwise, events will be silently
     *  dropped.
     * </pre>
     */
    long getEventTimeMs();

    // optional int64 event_uptime_ms = 17;
    /**
     * <code>optional int64 event_uptime_ms = 17;</code>
     *
     * <pre>
     * Time in milliseconds since the device was booted.  (On Android this
     *  is the result of SystemClock.elapsedRealtime(), not
     *  SystemClock.uptimeMillis() which does not increment when the device is in
     *  deep sleep.)
     *
     *  See http://go/clearcut-timestamps for details on how this value is used for
     *  timestamp corrections.  It is also copied to
     *  PlayExtension.client_elapsed_realtime_millis if the routing option
     *  "include_client_elapsed_realtime_millis" is set to true.
     * </pre>
     */
    boolean hasEventUptimeMs();
    /**
     * <code>optional int64 event_uptime_ms = 17;</code>
     *
     * <pre>
     * Time in milliseconds since the device was booted.  (On Android this
     *  is the result of SystemClock.elapsedRealtime(), not
     *  SystemClock.uptimeMillis() which does not increment when the device is in
     *  deep sleep.)
     *
     *  See http://go/clearcut-timestamps for details on how this value is used for
     *  timestamp corrections.  It is also copied to
     *  PlayExtension.client_elapsed_realtime_millis if the routing option
     *  "include_client_elapsed_realtime_millis" is set to true.
     * </pre>
     */
    long getEventUptimeMs();

    // optional int64 sequence_position = 21;
    /**
     * <code>optional int64 sequence_position = 21;</code>
     *
     * <pre>
     * Client generated sequence position for this event - defines a total order
     *  for events from a given device. If event A's sequence position is less than
     *  event B's sequence position, then event A happened before event B.
     * </pre>
     */
    boolean hasSequencePosition();
    /**
     * <code>optional int64 sequence_position = 21;</code>
     *
     * <pre>
     * Client generated sequence position for this event - defines a total order
     *  for events from a given device. If event A's sequence position is less than
     *  event B's sequence position, then event A happened before event B.
     * </pre>
     */
    long getSequencePosition();

    // optional string tag = 2;
    /**
     * <code>optional string tag = 2;</code>
     *
     * <pre>
     * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
     *  There will be a common repository of cross-vertical events that should be
     *  used, but any individual app would be free to define their own tags.
     *
     *  STRONGLY DISCOURAGED: use event_code instead.
     * </pre>
     */
    boolean hasTag();
    /**
     * <code>optional string tag = 2;</code>
     *
     * <pre>
     * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
     *  There will be a common repository of cross-vertical events that should be
     *  used, but any individual app would be free to define their own tags.
     *
     *  STRONGLY DISCOURAGED: use event_code instead.
     * </pre>
     */
    java.lang.String getTag();
    /**
     * <code>optional string tag = 2;</code>
     *
     * <pre>
     * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
     *  There will be a common repository of cross-vertical events that should be
     *  used, but any individual app would be free to define their own tags.
     *
     *  STRONGLY DISCOURAGED: use event_code instead.
     * </pre>
     */
    com.google.protobuf.ByteString
        getTagBytes();

    // optional int32 event_code = 11;
    /**
     * <code>optional int32 event_code = 11;</code>
     *
     * <pre>
     * Type of event. Different kinds of events inside a client app should have
     *  different values of 'event_code'. Different client apps may have
     *  overlapping sets of 'event_code' values; these values are only meant to
     *  make sense within the context of a single client app, as identified by
     *  the 'log_source' field of LogRequest.
     *
     *  A typical way to use 'event_code' is to define the enum of possible values
     *  inside of the custom logging extension proto.
     *  TODO(abednego): add an example CL.
     *
     *  This enum type should be annotated with a LogEventRoutingConfig proto.
     * </pre>
     */
    boolean hasEventCode();
    /**
     * <code>optional int32 event_code = 11;</code>
     *
     * <pre>
     * Type of event. Different kinds of events inside a client app should have
     *  different values of 'event_code'. Different client apps may have
     *  overlapping sets of 'event_code' values; these values are only meant to
     *  make sense within the context of a single client app, as identified by
     *  the 'log_source' field of LogRequest.
     *
     *  A typical way to use 'event_code' is to define the enum of possible values
     *  inside of the custom logging extension proto.
     *  TODO(abednego): add an example CL.
     *
     *  This enum type should be annotated with a LogEventRoutingConfig proto.
     * </pre>
     */
    int getEventCode();

    // optional int32 event_flow_id = 12;
    /**
     * <code>optional int32 event_flow_id = 12;</code>
     *
     * <pre>
     * Identifies a group of events that belong to the same flow or session of
     *  user interaction, which is a client-specific concept.
     *
     *  These IDs are used in the Clearcut/UMA pipeline for computing latencies
     *  between pairs of events, where it is necessary to ensure that both events
     *  belong to the same flow.
     *
     *  For example, the Google Play team may want to give a unique ID to each
     *  purchase session, including all of the events starting from the initial
     *  search for an app to the eventual purchase and installation of the app.
     *  Another example would be the Search app wanting to tie together search
     *  query events and clicks on search results, especially if several instances
     *  of the app may be active at the same time.
     * </pre>
     */
    boolean hasEventFlowId();
    /**
     * <code>optional int32 event_flow_id = 12;</code>
     *
     * <pre>
     * Identifies a group of events that belong to the same flow or session of
     *  user interaction, which is a client-specific concept.
     *
     *  These IDs are used in the Clearcut/UMA pipeline for computing latencies
     *  between pairs of events, where it is necessary to ensure that both events
     *  belong to the same flow.
     *
     *  For example, the Google Play team may want to give a unique ID to each
     *  purchase session, including all of the events starting from the initial
     *  search for an app to the eventual purchase and installation of the app.
     *  Another example would be the Search app wanting to tie together search
     *  query events and clicks on search results, especially if several instances
     *  of the app may be active at the same time.
     * </pre>
     */
    int getEventFlowId();

    // optional bool is_user_initiated = 10;
    /**
     * <code>optional bool is_user_initiated = 10;</code>
     *
     * <pre>
     * Whether this event was initiated by the user at the time of the event or
     *  shortly before (vs. a background event like upgrading a database after the
     *  app was automatically updated).
     * </pre>
     */
    boolean hasIsUserInitiated();
    /**
     * <code>optional bool is_user_initiated = 10;</code>
     *
     * <pre>
     * Whether this event was initiated by the user at the time of the event or
     *  shortly before (vs. a background event like upgrading a database after the
     *  app was automatically updated).
     * </pre>
     */
    boolean getIsUserInitiated();

    // repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;
    /**
     * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
     *
     * <pre>
     * These might contain PII and will not be stored for more than 8 days.
     *  If possible, please create a named field in the protos below instead.
     * </pre>
     */
    java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues> 
        getValueList();
    /**
     * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
     *
     * <pre>
     * These might contain PII and will not be stored for more than 8 days.
     *  If possible, please create a named field in the protos below instead.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues getValue(int index);
    /**
     * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
     *
     * <pre>
     * These might contain PII and will not be stored for more than 8 days.
     *  If possible, please create a named field in the protos below instead.
     * </pre>
     */
    int getValueCount();
    /**
     * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
     *
     * <pre>
     * These might contain PII and will not be stored for more than 8 days.
     *  If possible, please create a named field in the protos below instead.
     * </pre>
     */
    java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValuesOrBuilder> 
        getValueOrBuilderList();
    /**
     * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
     *
     * <pre>
     * These might contain PII and will not be stored for more than 8 days.
     *  If possible, please create a named field in the protos below instead.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValuesOrBuilder getValueOrBuilder(
        int index);

    // optional bytes store = 4;
    /**
     * <code>optional bytes store = 4;</code>
     *
     * <pre>
     * TODO(jsw): Remove. We can't do that as of 2015/08/13 because we still get
     *  several thousand QPS from ancient Play Store clients who use this field.
     *
     *  Extension for Play Store app logs. Real type is PlayStoreLogEvent. This
     *  exists to support legacy clients. Use source_extension instead.
     * </pre>
     */
    boolean hasStore();
    /**
     * <code>optional bytes store = 4;</code>
     *
     * <pre>
     * TODO(jsw): Remove. We can't do that as of 2015/08/13 because we still get
     *  several thousand QPS from ancient Play Store clients who use this field.
     *
     *  Extension for Play Store app logs. Real type is PlayStoreLogEvent. This
     *  exists to support legacy clients. Use source_extension instead.
     * </pre>
     */
    com.google.protobuf.ByteString getStore();

    // optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;
    /**
     * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
     *
     * <pre>
     * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
     * </pre>
     */
    boolean hasAppUsage1P();
    /**
     * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
     *
     * <pre>
     * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent getAppUsage1P();
    /**
     * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
     *
     * <pre>
     * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEventOrBuilder getAppUsage1POrBuilder();

    // optional bytes source_extension = 6;
    /**
     * <code>optional bytes source_extension = 6;</code>
     *
     * <pre>
     * A source specific extension (typically a serialized proto). The type of
     *  this data is determined by the log_source of the enclosing LogRequest.
     *  The proto is derived by calling ParseFromString method in
     *  net/proto2/public/message_lite.h.
     * </pre>
     */
    boolean hasSourceExtension();
    /**
     * <code>optional bytes source_extension = 6;</code>
     *
     * <pre>
     * A source specific extension (typically a serialized proto). The type of
     *  this data is determined by the log_source of the enclosing LogRequest.
     *  The proto is derived by calling ParseFromString method in
     *  net/proto2/public/message_lite.h.
     * </pre>
     */
    com.google.protobuf.ByteString getSourceExtension();

    // optional string source_extension_js = 8;
    /**
     * <code>optional string source_extension_js = 8;</code>
     *
     * <pre>
     * A jspb version of source_extension, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    boolean hasSourceExtensionJs();
    /**
     * <code>optional string source_extension_js = 8;</code>
     *
     * <pre>
     * A jspb version of source_extension, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    java.lang.String getSourceExtensionJs();
    /**
     * <code>optional string source_extension_js = 8;</code>
     *
     * <pre>
     * A jspb version of source_extension, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    com.google.protobuf.ByteString
        getSourceExtensionJsBytes();

    // optional string source_extension_json = 13;
    /**
     * <code>optional string source_extension_json = 13;</code>
     *
     * <pre>
     * A stringified json proto version of source_extension.  The json string is
     *  converted back to proto using the json_format utility at
     *  net/proto2/util/public/json_format.h, without any flags.
     * </pre>
     */
    boolean hasSourceExtensionJson();
    /**
     * <code>optional string source_extension_json = 13;</code>
     *
     * <pre>
     * A stringified json proto version of source_extension.  The json string is
     *  converted back to proto using the json_format utility at
     *  net/proto2/util/public/json_format.h, without any flags.
     * </pre>
     */
    java.lang.String getSourceExtensionJson();
    /**
     * <code>optional string source_extension_json = 13;</code>
     *
     * <pre>
     * A stringified json proto version of source_extension.  The json string is
     *  converted back to proto using the json_format utility at
     *  net/proto2/util/public/json_format.h, without any flags.
     * </pre>
     */
    com.google.protobuf.ByteString
        getSourceExtensionJsonBytes();

    // optional .wireless_android_play_playlog.ActiveExperiments exp = 7;
    /**
     * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
     *
     * <pre>
     * The set of currently active experiments. If missing, then the server will
     *  assume that experiment on/off status has not changed since the previous
     *  LogEvent message in the same LogRequest proto. If missing in the very first
     *  LogEvent of a LogRequest, then the server will assume that all experiments
     *  are off.
     * </pre>
     */
    boolean hasExp();
    /**
     * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
     *
     * <pre>
     * The set of currently active experiments. If missing, then the server will
     *  assume that experiment on/off status has not changed since the previous
     *  LogEvent message in the same LogRequest proto. If missing in the very first
     *  LogEvent of a LogRequest, then the server will assume that all experiments
     *  are off.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments getExp();
    /**
     * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
     *
     * <pre>
     * The set of currently active experiments. If missing, then the server will
     *  assume that experiment on/off status has not changed since the previous
     *  LogEvent message in the same LogRequest proto. If missing in the very first
     *  LogEvent of a LogRequest, then the server will assume that all experiments
     *  are off.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperimentsOrBuilder getExpOrBuilder();

    // optional string test_id = 14;
    /**
     * <code>optional string test_id = 14;</code>
     *
     * <pre>
     * A string for identifying a test run.  You may use this string to group log
     *  data coming from a test run.  Usually logs from test apps or from normal
     *  apps running on test devices will have this field set.
     * </pre>
     */
    boolean hasTestId();
    /**
     * <code>optional string test_id = 14;</code>
     *
     * <pre>
     * A string for identifying a test run.  You may use this string to group log
     *  data coming from a test run.  Usually logs from test apps or from normal
     *  apps running on test devices will have this field set.
     * </pre>
     */
    java.lang.String getTestId();
    /**
     * <code>optional string test_id = 14;</code>
     *
     * <pre>
     * A string for identifying a test run.  You may use this string to group log
     *  data coming from a test run.  Usually logs from test apps or from normal
     *  apps running on test devices will have this field set.
     * </pre>
     */
    com.google.protobuf.ByteString
        getTestIdBytes();

    // optional sint64 timezone_offset_seconds = 15 [default = 180000];
    /**
     * <code>optional sint64 timezone_offset_seconds = 15 [default = 180000];</code>
     *
     * <pre>
     * User's timezone offset from UTC in seconds. If the user's UTC time
     *  is X millis then the on-device clock time would be
     *  X + timezone_offset_seconds * 1000.
     *  The default value is non-sensical, mainly so that 0 can be distinguished
     *  from "not specified" using proto nano (and without changing our build
     *  options to use reference types for primitives).
     * </pre>
     */
    boolean hasTimezoneOffsetSeconds();
    /**
     * <code>optional sint64 timezone_offset_seconds = 15 [default = 180000];</code>
     *
     * <pre>
     * User's timezone offset from UTC in seconds. If the user's UTC time
     *  is X millis then the on-device clock time would be
     *  X + timezone_offset_seconds * 1000.
     *  The default value is non-sensical, mainly so that 0 can be distinguished
     *  from "not specified" using proto nano (and without changing our build
     *  options to use reference types for primitives).
     * </pre>
     */
    long getTimezoneOffsetSeconds();

    // optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
     *
     * <pre>
     * serialized DeviceExperimentIds; the experiment ids are propagated
     *  to GWSLog experiment ids
     * </pre>
     */
    boolean hasExperimentIds();
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
     *
     * <pre>
     * serialized DeviceExperimentIds; the experiment ids are propagated
     *  to GWSLog experiment ids
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds getExperimentIds();
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
     *
     * <pre>
     * serialized DeviceExperimentIds; the experiment ids are propagated
     *  to GWSLog experiment ids
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdsOrBuilder getExperimentIdsOrBuilder();

    // optional bytes client_ve = 18;
    /**
     * <code>optional bytes client_ve = 18;</code>
     *
     * <pre>
     * Serialized proto message of ClientVisualElementsProto as defined in
     *  logs/proto/visual_element/client_visual_elements.proto. The client can
     *  optionally send a log event with this field set. In this case, clearcut
     *  server needs to deserialize the bytes as a ClientVisualElementsProto and
     *  sets appropriate fields in the output GWSLogEntryProto.
     *
     *  See http://go/NativeVeLogging for more information.
     * </pre>
     */
    boolean hasClientVe();
    /**
     * <code>optional bytes client_ve = 18;</code>
     *
     * <pre>
     * Serialized proto message of ClientVisualElementsProto as defined in
     *  logs/proto/visual_element/client_visual_elements.proto. The client can
     *  optionally send a log event with this field set. In this case, clearcut
     *  server needs to deserialize the bytes as a ClientVisualElementsProto and
     *  sets appropriate fields in the output GWSLogEntryProto.
     *
     *  See http://go/NativeVeLogging for more information.
     * </pre>
     */
    com.google.protobuf.ByteString getClientVe();

    // optional string client_ve_js = 24;
    /**
     * <code>optional string client_ve_js = 24;</code>
     *
     * <pre>
     * Alternative serialized field for the client_ve field defined in 18.
     *  Serialize using array serialization format. More info at go/jspb.
     * </pre>
     */
    boolean hasClientVeJs();
    /**
     * <code>optional string client_ve_js = 24;</code>
     *
     * <pre>
     * Alternative serialized field for the client_ve field defined in 18.
     *  Serialize using array serialization format. More info at go/jspb.
     * </pre>
     */
    java.lang.String getClientVeJs();
    /**
     * <code>optional string client_ve_js = 24;</code>
     *
     * <pre>
     * Alternative serialized field for the client_ve field defined in 18.
     *  Serialize using array serialization format. More info at go/jspb.
     * </pre>
     */
    com.google.protobuf.ByteString
        getClientVeJsBytes();

    // optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;
    /**
     * <code>optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;</code>
     */
    boolean hasInternalEvent();
    /**
     * <code>optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent getInternalEvent();

    // repeated int32 test_code = 20;
    /**
     * <code>repeated int32 test_code = 20;</code>
     *
     * <pre>
     * Indicates that an interesting thing has occurred. Used to narrow the set
     *  of samples to consider in analysis. Test codes are copied to
     *  GwsLogEntryProto.TestCode.
     *
     *  See google3/ads/base/test_codes/test_codes.proto
     *  for Ads' use of test codes.
     * </pre>
     */
    java.util.List<java.lang.Integer> getTestCodeList();
    /**
     * <code>repeated int32 test_code = 20;</code>
     *
     * <pre>
     * Indicates that an interesting thing has occurred. Used to narrow the set
     *  of samples to consider in analysis. Test codes are copied to
     *  GwsLogEntryProto.TestCode.
     *
     *  See google3/ads/base/test_codes/test_codes.proto
     *  for Ads' use of test codes.
     * </pre>
     */
    int getTestCodeCount();
    /**
     * <code>repeated int32 test_code = 20;</code>
     *
     * <pre>
     * Indicates that an interesting thing has occurred. Used to narrow the set
     *  of samples to consider in analysis. Test codes are copied to
     *  GwsLogEntryProto.TestCode.
     *
     *  See google3/ads/base/test_codes/test_codes.proto
     *  for Ads' use of test codes.
     * </pre>
     */
    int getTestCode(int index);

    // optional int64 boot_count = 22;
    /**
     * <code>optional int64 boot_count = 22;</code>
     *
     * <pre>
     * Number of times the device is known to have booted. Taken together,
     *  {boot-count, uptime} pairs are a monotonically increasing counter which
     *  can be used to order events accross log sources.
     * </pre>
     */
    boolean hasBootCount();
    /**
     * <code>optional int64 boot_count = 22;</code>
     *
     * <pre>
     * Number of times the device is known to have booted. Taken together,
     *  {boot-count, uptime} pairs are a monotonically increasing counter which
     *  can be used to order events accross log sources.
     * </pre>
     */
    long getBootCount();

    // optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;
    /**
     * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
     *
     * <pre>
     * The current network connectivity info when the event was logged in the
     *  client
     * </pre>
     */
    boolean hasNetworkConnectionInfo();
    /**
     * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
     *
     * <pre>
     * The current network connectivity info when the event was logged in the
     *  client
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo getNetworkConnectionInfo();
    /**
     * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
     *
     * <pre>
     * The current network connectivity info when the event was logged in the
     *  client
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfoOrBuilder getNetworkConnectionInfoOrBuilder();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.LogEvent}
   *
   * <pre>
   * Next tag: 25
   * </pre>
   */
  public static final class LogEvent extends
      com.google.protobuf.GeneratedMessage.ExtendableMessage<
        LogEvent> implements LogEventOrBuilder {
    // Use LogEvent.newBuilder() to construct.
    private LogEvent(com.google.protobuf.GeneratedMessage.ExtendableBuilder<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent, ?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private LogEvent(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final LogEvent defaultInstance;
    public static LogEvent getDefaultInstance() {
      return defaultInstance;
    }

    public LogEvent getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private LogEvent(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              bitField0_ |= 0x00000001;
              eventTimeMs_ = input.readInt64();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000008;
              tag_ = input.readBytes();
              break;
            }
            case 26: {
              if (!((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
                value_ = new java.util.ArrayList<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues>();
                mutable_bitField0_ |= 0x00000080;
              }
              value_.add(input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.PARSER, extensionRegistry));
              break;
            }
            case 34: {
              bitField0_ |= 0x00000080;
              store_ = input.readBytes();
              break;
            }
            case 50: {
              bitField0_ |= 0x00000200;
              sourceExtension_ = input.readBytes();
              break;
            }
            case 58: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.Builder subBuilder = null;
              if (((bitField0_ & 0x00001000) == 0x00001000)) {
                subBuilder = exp_.toBuilder();
              }
              exp_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(exp_);
                exp_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00001000;
              break;
            }
            case 66: {
              bitField0_ |= 0x00000400;
              sourceExtensionJs_ = input.readBytes();
              break;
            }
            case 74: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.Builder subBuilder = null;
              if (((bitField0_ & 0x00000100) == 0x00000100)) {
                subBuilder = appUsage1P_.toBuilder();
              }
              appUsage1P_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(appUsage1P_);
                appUsage1P_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000100;
              break;
            }
            case 80: {
              bitField0_ |= 0x00000040;
              isUserInitiated_ = input.readBool();
              break;
            }
            case 88: {
              bitField0_ |= 0x00000010;
              eventCode_ = input.readInt32();
              break;
            }
            case 96: {
              bitField0_ |= 0x00000020;
              eventFlowId_ = input.readInt32();
              break;
            }
            case 106: {
              bitField0_ |= 0x00000800;
              sourceExtensionJson_ = input.readBytes();
              break;
            }
            case 114: {
              bitField0_ |= 0x00002000;
              testId_ = input.readBytes();
              break;
            }
            case 120: {
              bitField0_ |= 0x00004000;
              timezoneOffsetSeconds_ = input.readSInt64();
              break;
            }
            case 130: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.Builder subBuilder = null;
              if (((bitField0_ & 0x00008000) == 0x00008000)) {
                subBuilder = experimentIds_.toBuilder();
              }
              experimentIds_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(experimentIds_);
                experimentIds_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00008000;
              break;
            }
            case 136: {
              bitField0_ |= 0x00000002;
              eventUptimeMs_ = input.readInt64();
              break;
            }
            case 146: {
              bitField0_ |= 0x00010000;
              clientVe_ = input.readBytes();
              break;
            }
            case 152: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(19, rawValue);
              } else {
                bitField0_ |= 0x00040000;
                internalEvent_ = value;
              }
              break;
            }
            case 160: {
              if (!((mutable_bitField0_ & 0x00100000) == 0x00100000)) {
                testCode_ = new java.util.ArrayList<java.lang.Integer>();
                mutable_bitField0_ |= 0x00100000;
              }
              testCode_.add(input.readInt32());
              break;
            }
            case 162: {
              int length = input.readRawVarint32();
              int limit = input.pushLimit(length);
              if (!((mutable_bitField0_ & 0x00100000) == 0x00100000) && input.getBytesUntilLimit() > 0) {
                testCode_ = new java.util.ArrayList<java.lang.Integer>();
                mutable_bitField0_ |= 0x00100000;
              }
              while (input.getBytesUntilLimit() > 0) {
                testCode_.add(input.readInt32());
              }
              input.popLimit(limit);
              break;
            }
            case 168: {
              bitField0_ |= 0x00000004;
              sequencePosition_ = input.readInt64();
              break;
            }
            case 176: {
              bitField0_ |= 0x00080000;
              bootCount_ = input.readInt64();
              break;
            }
            case 186: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00100000) == 0x00100000)) {
                subBuilder = networkConnectionInfo_.toBuilder();
              }
              networkConnectionInfo_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(networkConnectionInfo_);
                networkConnectionInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00100000;
              break;
            }
            case 194: {
              bitField0_ |= 0x00020000;
              clientVeJs_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
          value_ = java.util.Collections.unmodifiableList(value_);
        }
        if (((mutable_bitField0_ & 0x00100000) == 0x00100000)) {
          testCode_ = java.util.Collections.unmodifiableList(testCode_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogEvent_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogEvent_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder.class);
    }

    public static com.google.protobuf.Parser<LogEvent> PARSER =
        new com.google.protobuf.AbstractParser<LogEvent>() {
      public LogEvent parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LogEvent(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<LogEvent> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.LogEvent.InternalEvent}
     */
    public enum InternalEvent
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>NONE = 0;</code>
       */
      NONE(0, 0),
      /**
       * <code>WALL_CLOCK_SET = 1;</code>
       */
      WALL_CLOCK_SET(1, 1),
      /**
       * <code>DEVICE_BOOT = 2;</code>
       */
      DEVICE_BOOT(2, 2),
      ;

      /**
       * <code>NONE = 0;</code>
       */
      public static final int NONE_VALUE = 0;
      /**
       * <code>WALL_CLOCK_SET = 1;</code>
       */
      public static final int WALL_CLOCK_SET_VALUE = 1;
      /**
       * <code>DEVICE_BOOT = 2;</code>
       */
      public static final int DEVICE_BOOT_VALUE = 2;


      public final int getNumber() { return value; }

      public static InternalEvent valueOf(int value) {
        switch (value) {
          case 0: return NONE;
          case 1: return WALL_CLOCK_SET;
          case 2: return DEVICE_BOOT;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<InternalEvent>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<InternalEvent>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<InternalEvent>() {
              public InternalEvent findValueByNumber(int number) {
                return InternalEvent.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.getDescriptor().getEnumTypes().get(0);
      }

      private static final InternalEvent[] VALUES = values();

      public static InternalEvent valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private InternalEvent(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.LogEvent.InternalEvent)
    }

    private int bitField0_;
    // optional int64 event_time_ms = 1;
    public static final int EVENT_TIME_MS_FIELD_NUMBER = 1;
    private long eventTimeMs_;
    /**
     * <code>optional int64 event_time_ms = 1;</code>
     *
     * <pre>
     * Epoch time in milliseconds, according to the wall clock.
     *  See http://go/clearcut-timestamps for details on how this value is used.
     *  This field is required for Odyssey. Otherwise, events will be silently
     *  dropped.
     * </pre>
     */
    public boolean hasEventTimeMs() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional int64 event_time_ms = 1;</code>
     *
     * <pre>
     * Epoch time in milliseconds, according to the wall clock.
     *  See http://go/clearcut-timestamps for details on how this value is used.
     *  This field is required for Odyssey. Otherwise, events will be silently
     *  dropped.
     * </pre>
     */
    public long getEventTimeMs() {
      return eventTimeMs_;
    }

    // optional int64 event_uptime_ms = 17;
    public static final int EVENT_UPTIME_MS_FIELD_NUMBER = 17;
    private long eventUptimeMs_;
    /**
     * <code>optional int64 event_uptime_ms = 17;</code>
     *
     * <pre>
     * Time in milliseconds since the device was booted.  (On Android this
     *  is the result of SystemClock.elapsedRealtime(), not
     *  SystemClock.uptimeMillis() which does not increment when the device is in
     *  deep sleep.)
     *
     *  See http://go/clearcut-timestamps for details on how this value is used for
     *  timestamp corrections.  It is also copied to
     *  PlayExtension.client_elapsed_realtime_millis if the routing option
     *  "include_client_elapsed_realtime_millis" is set to true.
     * </pre>
     */
    public boolean hasEventUptimeMs() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional int64 event_uptime_ms = 17;</code>
     *
     * <pre>
     * Time in milliseconds since the device was booted.  (On Android this
     *  is the result of SystemClock.elapsedRealtime(), not
     *  SystemClock.uptimeMillis() which does not increment when the device is in
     *  deep sleep.)
     *
     *  See http://go/clearcut-timestamps for details on how this value is used for
     *  timestamp corrections.  It is also copied to
     *  PlayExtension.client_elapsed_realtime_millis if the routing option
     *  "include_client_elapsed_realtime_millis" is set to true.
     * </pre>
     */
    public long getEventUptimeMs() {
      return eventUptimeMs_;
    }

    // optional int64 sequence_position = 21;
    public static final int SEQUENCE_POSITION_FIELD_NUMBER = 21;
    private long sequencePosition_;
    /**
     * <code>optional int64 sequence_position = 21;</code>
     *
     * <pre>
     * Client generated sequence position for this event - defines a total order
     *  for events from a given device. If event A's sequence position is less than
     *  event B's sequence position, then event A happened before event B.
     * </pre>
     */
    public boolean hasSequencePosition() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional int64 sequence_position = 21;</code>
     *
     * <pre>
     * Client generated sequence position for this event - defines a total order
     *  for events from a given device. If event A's sequence position is less than
     *  event B's sequence position, then event A happened before event B.
     * </pre>
     */
    public long getSequencePosition() {
      return sequencePosition_;
    }

    // optional string tag = 2;
    public static final int TAG_FIELD_NUMBER = 2;
    private java.lang.Object tag_;
    /**
     * <code>optional string tag = 2;</code>
     *
     * <pre>
     * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
     *  There will be a common repository of cross-vertical events that should be
     *  used, but any individual app would be free to define their own tags.
     *
     *  STRONGLY DISCOURAGED: use event_code instead.
     * </pre>
     */
    public boolean hasTag() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional string tag = 2;</code>
     *
     * <pre>
     * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
     *  There will be a common repository of cross-vertical events that should be
     *  used, but any individual app would be free to define their own tags.
     *
     *  STRONGLY DISCOURAGED: use event_code instead.
     * </pre>
     */
    public java.lang.String getTag() {
      java.lang.Object ref = tag_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          tag_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string tag = 2;</code>
     *
     * <pre>
     * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
     *  There will be a common repository of cross-vertical events that should be
     *  used, but any individual app would be free to define their own tags.
     *
     *  STRONGLY DISCOURAGED: use event_code instead.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getTagBytes() {
      java.lang.Object ref = tag_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        tag_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional int32 event_code = 11;
    public static final int EVENT_CODE_FIELD_NUMBER = 11;
    private int eventCode_;
    /**
     * <code>optional int32 event_code = 11;</code>
     *
     * <pre>
     * Type of event. Different kinds of events inside a client app should have
     *  different values of 'event_code'. Different client apps may have
     *  overlapping sets of 'event_code' values; these values are only meant to
     *  make sense within the context of a single client app, as identified by
     *  the 'log_source' field of LogRequest.
     *
     *  A typical way to use 'event_code' is to define the enum of possible values
     *  inside of the custom logging extension proto.
     *  TODO(abednego): add an example CL.
     *
     *  This enum type should be annotated with a LogEventRoutingConfig proto.
     * </pre>
     */
    public boolean hasEventCode() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional int32 event_code = 11;</code>
     *
     * <pre>
     * Type of event. Different kinds of events inside a client app should have
     *  different values of 'event_code'. Different client apps may have
     *  overlapping sets of 'event_code' values; these values are only meant to
     *  make sense within the context of a single client app, as identified by
     *  the 'log_source' field of LogRequest.
     *
     *  A typical way to use 'event_code' is to define the enum of possible values
     *  inside of the custom logging extension proto.
     *  TODO(abednego): add an example CL.
     *
     *  This enum type should be annotated with a LogEventRoutingConfig proto.
     * </pre>
     */
    public int getEventCode() {
      return eventCode_;
    }

    // optional int32 event_flow_id = 12;
    public static final int EVENT_FLOW_ID_FIELD_NUMBER = 12;
    private int eventFlowId_;
    /**
     * <code>optional int32 event_flow_id = 12;</code>
     *
     * <pre>
     * Identifies a group of events that belong to the same flow or session of
     *  user interaction, which is a client-specific concept.
     *
     *  These IDs are used in the Clearcut/UMA pipeline for computing latencies
     *  between pairs of events, where it is necessary to ensure that both events
     *  belong to the same flow.
     *
     *  For example, the Google Play team may want to give a unique ID to each
     *  purchase session, including all of the events starting from the initial
     *  search for an app to the eventual purchase and installation of the app.
     *  Another example would be the Search app wanting to tie together search
     *  query events and clicks on search results, especially if several instances
     *  of the app may be active at the same time.
     * </pre>
     */
    public boolean hasEventFlowId() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * <code>optional int32 event_flow_id = 12;</code>
     *
     * <pre>
     * Identifies a group of events that belong to the same flow or session of
     *  user interaction, which is a client-specific concept.
     *
     *  These IDs are used in the Clearcut/UMA pipeline for computing latencies
     *  between pairs of events, where it is necessary to ensure that both events
     *  belong to the same flow.
     *
     *  For example, the Google Play team may want to give a unique ID to each
     *  purchase session, including all of the events starting from the initial
     *  search for an app to the eventual purchase and installation of the app.
     *  Another example would be the Search app wanting to tie together search
     *  query events and clicks on search results, especially if several instances
     *  of the app may be active at the same time.
     * </pre>
     */
    public int getEventFlowId() {
      return eventFlowId_;
    }

    // optional bool is_user_initiated = 10;
    public static final int IS_USER_INITIATED_FIELD_NUMBER = 10;
    private boolean isUserInitiated_;
    /**
     * <code>optional bool is_user_initiated = 10;</code>
     *
     * <pre>
     * Whether this event was initiated by the user at the time of the event or
     *  shortly before (vs. a background event like upgrading a database after the
     *  app was automatically updated).
     * </pre>
     */
    public boolean hasIsUserInitiated() {
      return ((bitField0_ & 0x00000040) == 0x00000040);
    }
    /**
     * <code>optional bool is_user_initiated = 10;</code>
     *
     * <pre>
     * Whether this event was initiated by the user at the time of the event or
     *  shortly before (vs. a background event like upgrading a database after the
     *  app was automatically updated).
     * </pre>
     */
    public boolean getIsUserInitiated() {
      return isUserInitiated_;
    }

    // repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;
    public static final int VALUE_FIELD_NUMBER = 3;
    private java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues> value_;
    /**
     * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
     *
     * <pre>
     * These might contain PII and will not be stored for more than 8 days.
     *  If possible, please create a named field in the protos below instead.
     * </pre>
     */
    public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues> getValueList() {
      return value_;
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
     *
     * <pre>
     * These might contain PII and will not be stored for more than 8 days.
     *  If possible, please create a named field in the protos below instead.
     * </pre>
     */
    public java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValuesOrBuilder> 
        getValueOrBuilderList() {
      return value_;
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
     *
     * <pre>
     * These might contain PII and will not be stored for more than 8 days.
     *  If possible, please create a named field in the protos below instead.
     * </pre>
     */
    public int getValueCount() {
      return value_.size();
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
     *
     * <pre>
     * These might contain PII and will not be stored for more than 8 days.
     *  If possible, please create a named field in the protos below instead.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues getValue(int index) {
      return value_.get(index);
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
     *
     * <pre>
     * These might contain PII and will not be stored for more than 8 days.
     *  If possible, please create a named field in the protos below instead.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValuesOrBuilder getValueOrBuilder(
        int index) {
      return value_.get(index);
    }

    // optional bytes store = 4;
    public static final int STORE_FIELD_NUMBER = 4;
    private com.google.protobuf.ByteString store_;
    /**
     * <code>optional bytes store = 4;</code>
     *
     * <pre>
     * TODO(jsw): Remove. We can't do that as of 2015/08/13 because we still get
     *  several thousand QPS from ancient Play Store clients who use this field.
     *
     *  Extension for Play Store app logs. Real type is PlayStoreLogEvent. This
     *  exists to support legacy clients. Use source_extension instead.
     * </pre>
     */
    public boolean hasStore() {
      return ((bitField0_ & 0x00000080) == 0x00000080);
    }
    /**
     * <code>optional bytes store = 4;</code>
     *
     * <pre>
     * TODO(jsw): Remove. We can't do that as of 2015/08/13 because we still get
     *  several thousand QPS from ancient Play Store clients who use this field.
     *
     *  Extension for Play Store app logs. Real type is PlayStoreLogEvent. This
     *  exists to support legacy clients. Use source_extension instead.
     * </pre>
     */
    public com.google.protobuf.ByteString getStore() {
      return store_;
    }

    // optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;
    public static final int APP_USAGE_1P_FIELD_NUMBER = 9;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent appUsage1P_;
    /**
     * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
     *
     * <pre>
     * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
     * </pre>
     */
    public boolean hasAppUsage1P() {
      return ((bitField0_ & 0x00000100) == 0x00000100);
    }
    /**
     * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
     *
     * <pre>
     * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent getAppUsage1P() {
      return appUsage1P_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
     *
     * <pre>
     * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEventOrBuilder getAppUsage1POrBuilder() {
      return appUsage1P_;
    }

    // optional bytes source_extension = 6;
    public static final int SOURCE_EXTENSION_FIELD_NUMBER = 6;
    private com.google.protobuf.ByteString sourceExtension_;
    /**
     * <code>optional bytes source_extension = 6;</code>
     *
     * <pre>
     * A source specific extension (typically a serialized proto). The type of
     *  this data is determined by the log_source of the enclosing LogRequest.
     *  The proto is derived by calling ParseFromString method in
     *  net/proto2/public/message_lite.h.
     * </pre>
     */
    public boolean hasSourceExtension() {
      return ((bitField0_ & 0x00000200) == 0x00000200);
    }
    /**
     * <code>optional bytes source_extension = 6;</code>
     *
     * <pre>
     * A source specific extension (typically a serialized proto). The type of
     *  this data is determined by the log_source of the enclosing LogRequest.
     *  The proto is derived by calling ParseFromString method in
     *  net/proto2/public/message_lite.h.
     * </pre>
     */
    public com.google.protobuf.ByteString getSourceExtension() {
      return sourceExtension_;
    }

    // optional string source_extension_js = 8;
    public static final int SOURCE_EXTENSION_JS_FIELD_NUMBER = 8;
    private java.lang.Object sourceExtensionJs_;
    /**
     * <code>optional string source_extension_js = 8;</code>
     *
     * <pre>
     * A jspb version of source_extension, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    public boolean hasSourceExtensionJs() {
      return ((bitField0_ & 0x00000400) == 0x00000400);
    }
    /**
     * <code>optional string source_extension_js = 8;</code>
     *
     * <pre>
     * A jspb version of source_extension, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    public java.lang.String getSourceExtensionJs() {
      java.lang.Object ref = sourceExtensionJs_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          sourceExtensionJs_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string source_extension_js = 8;</code>
     *
     * <pre>
     * A jspb version of source_extension, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getSourceExtensionJsBytes() {
      java.lang.Object ref = sourceExtensionJs_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        sourceExtensionJs_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string source_extension_json = 13;
    public static final int SOURCE_EXTENSION_JSON_FIELD_NUMBER = 13;
    private java.lang.Object sourceExtensionJson_;
    /**
     * <code>optional string source_extension_json = 13;</code>
     *
     * <pre>
     * A stringified json proto version of source_extension.  The json string is
     *  converted back to proto using the json_format utility at
     *  net/proto2/util/public/json_format.h, without any flags.
     * </pre>
     */
    public boolean hasSourceExtensionJson() {
      return ((bitField0_ & 0x00000800) == 0x00000800);
    }
    /**
     * <code>optional string source_extension_json = 13;</code>
     *
     * <pre>
     * A stringified json proto version of source_extension.  The json string is
     *  converted back to proto using the json_format utility at
     *  net/proto2/util/public/json_format.h, without any flags.
     * </pre>
     */
    public java.lang.String getSourceExtensionJson() {
      java.lang.Object ref = sourceExtensionJson_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          sourceExtensionJson_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string source_extension_json = 13;</code>
     *
     * <pre>
     * A stringified json proto version of source_extension.  The json string is
     *  converted back to proto using the json_format utility at
     *  net/proto2/util/public/json_format.h, without any flags.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getSourceExtensionJsonBytes() {
      java.lang.Object ref = sourceExtensionJson_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        sourceExtensionJson_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional .wireless_android_play_playlog.ActiveExperiments exp = 7;
    public static final int EXP_FIELD_NUMBER = 7;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments exp_;
    /**
     * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
     *
     * <pre>
     * The set of currently active experiments. If missing, then the server will
     *  assume that experiment on/off status has not changed since the previous
     *  LogEvent message in the same LogRequest proto. If missing in the very first
     *  LogEvent of a LogRequest, then the server will assume that all experiments
     *  are off.
     * </pre>
     */
    public boolean hasExp() {
      return ((bitField0_ & 0x00001000) == 0x00001000);
    }
    /**
     * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
     *
     * <pre>
     * The set of currently active experiments. If missing, then the server will
     *  assume that experiment on/off status has not changed since the previous
     *  LogEvent message in the same LogRequest proto. If missing in the very first
     *  LogEvent of a LogRequest, then the server will assume that all experiments
     *  are off.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments getExp() {
      return exp_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
     *
     * <pre>
     * The set of currently active experiments. If missing, then the server will
     *  assume that experiment on/off status has not changed since the previous
     *  LogEvent message in the same LogRequest proto. If missing in the very first
     *  LogEvent of a LogRequest, then the server will assume that all experiments
     *  are off.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperimentsOrBuilder getExpOrBuilder() {
      return exp_;
    }

    // optional string test_id = 14;
    public static final int TEST_ID_FIELD_NUMBER = 14;
    private java.lang.Object testId_;
    /**
     * <code>optional string test_id = 14;</code>
     *
     * <pre>
     * A string for identifying a test run.  You may use this string to group log
     *  data coming from a test run.  Usually logs from test apps or from normal
     *  apps running on test devices will have this field set.
     * </pre>
     */
    public boolean hasTestId() {
      return ((bitField0_ & 0x00002000) == 0x00002000);
    }
    /**
     * <code>optional string test_id = 14;</code>
     *
     * <pre>
     * A string for identifying a test run.  You may use this string to group log
     *  data coming from a test run.  Usually logs from test apps or from normal
     *  apps running on test devices will have this field set.
     * </pre>
     */
    public java.lang.String getTestId() {
      java.lang.Object ref = testId_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          testId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string test_id = 14;</code>
     *
     * <pre>
     * A string for identifying a test run.  You may use this string to group log
     *  data coming from a test run.  Usually logs from test apps or from normal
     *  apps running on test devices will have this field set.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getTestIdBytes() {
      java.lang.Object ref = testId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        testId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional sint64 timezone_offset_seconds = 15 [default = 180000];
    public static final int TIMEZONE_OFFSET_SECONDS_FIELD_NUMBER = 15;
    private long timezoneOffsetSeconds_;
    /**
     * <code>optional sint64 timezone_offset_seconds = 15 [default = 180000];</code>
     *
     * <pre>
     * User's timezone offset from UTC in seconds. If the user's UTC time
     *  is X millis then the on-device clock time would be
     *  X + timezone_offset_seconds * 1000.
     *  The default value is non-sensical, mainly so that 0 can be distinguished
     *  from "not specified" using proto nano (and without changing our build
     *  options to use reference types for primitives).
     * </pre>
     */
    public boolean hasTimezoneOffsetSeconds() {
      return ((bitField0_ & 0x00004000) == 0x00004000);
    }
    /**
     * <code>optional sint64 timezone_offset_seconds = 15 [default = 180000];</code>
     *
     * <pre>
     * User's timezone offset from UTC in seconds. If the user's UTC time
     *  is X millis then the on-device clock time would be
     *  X + timezone_offset_seconds * 1000.
     *  The default value is non-sensical, mainly so that 0 can be distinguished
     *  from "not specified" using proto nano (and without changing our build
     *  options to use reference types for primitives).
     * </pre>
     */
    public long getTimezoneOffsetSeconds() {
      return timezoneOffsetSeconds_;
    }

    // optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;
    public static final int EXPERIMENT_IDS_FIELD_NUMBER = 16;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds experimentIds_;
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
     *
     * <pre>
     * serialized DeviceExperimentIds; the experiment ids are propagated
     *  to GWSLog experiment ids
     * </pre>
     */
    public boolean hasExperimentIds() {
      return ((bitField0_ & 0x00008000) == 0x00008000);
    }
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
     *
     * <pre>
     * serialized DeviceExperimentIds; the experiment ids are propagated
     *  to GWSLog experiment ids
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds getExperimentIds() {
      return experimentIds_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
     *
     * <pre>
     * serialized DeviceExperimentIds; the experiment ids are propagated
     *  to GWSLog experiment ids
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdsOrBuilder getExperimentIdsOrBuilder() {
      return experimentIds_;
    }

    // optional bytes client_ve = 18;
    public static final int CLIENT_VE_FIELD_NUMBER = 18;
    private com.google.protobuf.ByteString clientVe_;
    /**
     * <code>optional bytes client_ve = 18;</code>
     *
     * <pre>
     * Serialized proto message of ClientVisualElementsProto as defined in
     *  logs/proto/visual_element/client_visual_elements.proto. The client can
     *  optionally send a log event with this field set. In this case, clearcut
     *  server needs to deserialize the bytes as a ClientVisualElementsProto and
     *  sets appropriate fields in the output GWSLogEntryProto.
     *
     *  See http://go/NativeVeLogging for more information.
     * </pre>
     */
    public boolean hasClientVe() {
      return ((bitField0_ & 0x00010000) == 0x00010000);
    }
    /**
     * <code>optional bytes client_ve = 18;</code>
     *
     * <pre>
     * Serialized proto message of ClientVisualElementsProto as defined in
     *  logs/proto/visual_element/client_visual_elements.proto. The client can
     *  optionally send a log event with this field set. In this case, clearcut
     *  server needs to deserialize the bytes as a ClientVisualElementsProto and
     *  sets appropriate fields in the output GWSLogEntryProto.
     *
     *  See http://go/NativeVeLogging for more information.
     * </pre>
     */
    public com.google.protobuf.ByteString getClientVe() {
      return clientVe_;
    }

    // optional string client_ve_js = 24;
    public static final int CLIENT_VE_JS_FIELD_NUMBER = 24;
    private java.lang.Object clientVeJs_;
    /**
     * <code>optional string client_ve_js = 24;</code>
     *
     * <pre>
     * Alternative serialized field for the client_ve field defined in 18.
     *  Serialize using array serialization format. More info at go/jspb.
     * </pre>
     */
    public boolean hasClientVeJs() {
      return ((bitField0_ & 0x00020000) == 0x00020000);
    }
    /**
     * <code>optional string client_ve_js = 24;</code>
     *
     * <pre>
     * Alternative serialized field for the client_ve field defined in 18.
     *  Serialize using array serialization format. More info at go/jspb.
     * </pre>
     */
    public java.lang.String getClientVeJs() {
      java.lang.Object ref = clientVeJs_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          clientVeJs_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string client_ve_js = 24;</code>
     *
     * <pre>
     * Alternative serialized field for the client_ve field defined in 18.
     *  Serialize using array serialization format. More info at go/jspb.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getClientVeJsBytes() {
      java.lang.Object ref = clientVeJs_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        clientVeJs_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;
    public static final int INTERNAL_EVENT_FIELD_NUMBER = 19;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent internalEvent_;
    /**
     * <code>optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;</code>
     */
    public boolean hasInternalEvent() {
      return ((bitField0_ & 0x00040000) == 0x00040000);
    }
    /**
     * <code>optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent getInternalEvent() {
      return internalEvent_;
    }

    // repeated int32 test_code = 20;
    public static final int TEST_CODE_FIELD_NUMBER = 20;
    private java.util.List<java.lang.Integer> testCode_;
    /**
     * <code>repeated int32 test_code = 20;</code>
     *
     * <pre>
     * Indicates that an interesting thing has occurred. Used to narrow the set
     *  of samples to consider in analysis. Test codes are copied to
     *  GwsLogEntryProto.TestCode.
     *
     *  See google3/ads/base/test_codes/test_codes.proto
     *  for Ads' use of test codes.
     * </pre>
     */
    public java.util.List<java.lang.Integer>
        getTestCodeList() {
      return testCode_;
    }
    /**
     * <code>repeated int32 test_code = 20;</code>
     *
     * <pre>
     * Indicates that an interesting thing has occurred. Used to narrow the set
     *  of samples to consider in analysis. Test codes are copied to
     *  GwsLogEntryProto.TestCode.
     *
     *  See google3/ads/base/test_codes/test_codes.proto
     *  for Ads' use of test codes.
     * </pre>
     */
    public int getTestCodeCount() {
      return testCode_.size();
    }
    /**
     * <code>repeated int32 test_code = 20;</code>
     *
     * <pre>
     * Indicates that an interesting thing has occurred. Used to narrow the set
     *  of samples to consider in analysis. Test codes are copied to
     *  GwsLogEntryProto.TestCode.
     *
     *  See google3/ads/base/test_codes/test_codes.proto
     *  for Ads' use of test codes.
     * </pre>
     */
    public int getTestCode(int index) {
      return testCode_.get(index);
    }

    // optional int64 boot_count = 22;
    public static final int BOOT_COUNT_FIELD_NUMBER = 22;
    private long bootCount_;
    /**
     * <code>optional int64 boot_count = 22;</code>
     *
     * <pre>
     * Number of times the device is known to have booted. Taken together,
     *  {boot-count, uptime} pairs are a monotonically increasing counter which
     *  can be used to order events accross log sources.
     * </pre>
     */
    public boolean hasBootCount() {
      return ((bitField0_ & 0x00080000) == 0x00080000);
    }
    /**
     * <code>optional int64 boot_count = 22;</code>
     *
     * <pre>
     * Number of times the device is known to have booted. Taken together,
     *  {boot-count, uptime} pairs are a monotonically increasing counter which
     *  can be used to order events accross log sources.
     * </pre>
     */
    public long getBootCount() {
      return bootCount_;
    }

    // optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;
    public static final int NETWORK_CONNECTION_INFO_FIELD_NUMBER = 23;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo networkConnectionInfo_;
    /**
     * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
     *
     * <pre>
     * The current network connectivity info when the event was logged in the
     *  client
     * </pre>
     */
    public boolean hasNetworkConnectionInfo() {
      return ((bitField0_ & 0x00100000) == 0x00100000);
    }
    /**
     * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
     *
     * <pre>
     * The current network connectivity info when the event was logged in the
     *  client
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo getNetworkConnectionInfo() {
      return networkConnectionInfo_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
     *
     * <pre>
     * The current network connectivity info when the event was logged in the
     *  client
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfoOrBuilder getNetworkConnectionInfoOrBuilder() {
      return networkConnectionInfo_;
    }

    private void initFields() {
      eventTimeMs_ = 0L;
      eventUptimeMs_ = 0L;
      sequencePosition_ = 0L;
      tag_ = "";
      eventCode_ = 0;
      eventFlowId_ = 0;
      isUserInitiated_ = false;
      value_ = java.util.Collections.emptyList();
      store_ = com.google.protobuf.ByteString.EMPTY;
      appUsage1P_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.getDefaultInstance();
      sourceExtension_ = com.google.protobuf.ByteString.EMPTY;
      sourceExtensionJs_ = "";
      sourceExtensionJson_ = "";
      exp_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.getDefaultInstance();
      testId_ = "";
      timezoneOffsetSeconds_ = 180000L;
      experimentIds_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.getDefaultInstance();
      clientVe_ = com.google.protobuf.ByteString.EMPTY;
      clientVeJs_ = "";
      internalEvent_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent.NONE;
      testCode_ = java.util.Collections.emptyList();
      bootCount_ = 0L;
      networkConnectionInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.getDefaultInstance();
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      if (!extensionsAreInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      com.google.protobuf.GeneratedMessage
        .ExtendableMessage<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent>.ExtensionWriter extensionWriter =
          newExtensionWriter();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt64(1, eventTimeMs_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBytes(2, getTagBytes());
      }
      for (int i = 0; i < value_.size(); i++) {
        output.writeMessage(3, value_.get(i));
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        output.writeBytes(4, store_);
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        output.writeBytes(6, sourceExtension_);
      }
      if (((bitField0_ & 0x00001000) == 0x00001000)) {
        output.writeMessage(7, exp_);
      }
      if (((bitField0_ & 0x00000400) == 0x00000400)) {
        output.writeBytes(8, getSourceExtensionJsBytes());
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        output.writeMessage(9, appUsage1P_);
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        output.writeBool(10, isUserInitiated_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeInt32(11, eventCode_);
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeInt32(12, eventFlowId_);
      }
      if (((bitField0_ & 0x00000800) == 0x00000800)) {
        output.writeBytes(13, getSourceExtensionJsonBytes());
      }
      if (((bitField0_ & 0x00002000) == 0x00002000)) {
        output.writeBytes(14, getTestIdBytes());
      }
      if (((bitField0_ & 0x00004000) == 0x00004000)) {
        output.writeSInt64(15, timezoneOffsetSeconds_);
      }
      if (((bitField0_ & 0x00008000) == 0x00008000)) {
        output.writeMessage(16, experimentIds_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeInt64(17, eventUptimeMs_);
      }
      if (((bitField0_ & 0x00010000) == 0x00010000)) {
        output.writeBytes(18, clientVe_);
      }
      if (((bitField0_ & 0x00040000) == 0x00040000)) {
        output.writeEnum(19, internalEvent_.getNumber());
      }
      for (int i = 0; i < testCode_.size(); i++) {
        output.writeInt32(20, testCode_.get(i));
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeInt64(21, sequencePosition_);
      }
      if (((bitField0_ & 0x00080000) == 0x00080000)) {
        output.writeInt64(22, bootCount_);
      }
      if (((bitField0_ & 0x00100000) == 0x00100000)) {
        output.writeMessage(23, networkConnectionInfo_);
      }
      if (((bitField0_ & 0x00020000) == 0x00020000)) {
        output.writeBytes(24, getClientVeJsBytes());
      }
      extensionWriter.writeUntil(536870912, output);
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(1, eventTimeMs_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, getTagBytes());
      }
      for (int i = 0; i < value_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, value_.get(i));
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, store_);
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(6, sourceExtension_);
      }
      if (((bitField0_ & 0x00001000) == 0x00001000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(7, exp_);
      }
      if (((bitField0_ & 0x00000400) == 0x00000400)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(8, getSourceExtensionJsBytes());
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(9, appUsage1P_);
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(10, isUserInitiated_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(11, eventCode_);
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(12, eventFlowId_);
      }
      if (((bitField0_ & 0x00000800) == 0x00000800)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(13, getSourceExtensionJsonBytes());
      }
      if (((bitField0_ & 0x00002000) == 0x00002000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(14, getTestIdBytes());
      }
      if (((bitField0_ & 0x00004000) == 0x00004000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeSInt64Size(15, timezoneOffsetSeconds_);
      }
      if (((bitField0_ & 0x00008000) == 0x00008000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(16, experimentIds_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(17, eventUptimeMs_);
      }
      if (((bitField0_ & 0x00010000) == 0x00010000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(18, clientVe_);
      }
      if (((bitField0_ & 0x00040000) == 0x00040000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(19, internalEvent_.getNumber());
      }
      {
        int dataSize = 0;
        for (int i = 0; i < testCode_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeInt32SizeNoTag(testCode_.get(i));
        }
        size += dataSize;
        size += 2 * getTestCodeList().size();
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(21, sequencePosition_);
      }
      if (((bitField0_ & 0x00080000) == 0x00080000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(22, bootCount_);
      }
      if (((bitField0_ & 0x00100000) == 0x00100000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(23, networkConnectionInfo_);
      }
      if (((bitField0_ & 0x00020000) == 0x00020000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(24, getClientVeJsBytes());
      }
      size += extensionsSerializedSize();
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.LogEvent}
     *
     * <pre>
     * Next tag: 25
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent, Builder> implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogEvent_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogEvent_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          getValueFieldBuilder();
          getAppUsage1PFieldBuilder();
          getExpFieldBuilder();
          getExperimentIdsFieldBuilder();
          getNetworkConnectionInfoFieldBuilder();
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        eventTimeMs_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000001);
        eventUptimeMs_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000002);
        sequencePosition_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000004);
        tag_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        eventCode_ = 0;
        bitField0_ = (bitField0_ & ~0x00000010);
        eventFlowId_ = 0;
        bitField0_ = (bitField0_ & ~0x00000020);
        isUserInitiated_ = false;
        bitField0_ = (bitField0_ & ~0x00000040);
        if (valueBuilder_ == null) {
          value_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000080);
        } else {
          valueBuilder_.clear();
        }
        store_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000100);
        if (appUsage1PBuilder_ == null) {
          appUsage1P_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.getDefaultInstance();
        } else {
          appUsage1PBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000200);
        sourceExtension_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000400);
        sourceExtensionJs_ = "";
        bitField0_ = (bitField0_ & ~0x00000800);
        sourceExtensionJson_ = "";
        bitField0_ = (bitField0_ & ~0x00001000);
        if (expBuilder_ == null) {
          exp_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.getDefaultInstance();
        } else {
          expBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00002000);
        testId_ = "";
        bitField0_ = (bitField0_ & ~0x00004000);
        timezoneOffsetSeconds_ = 180000L;
        bitField0_ = (bitField0_ & ~0x00008000);
        if (experimentIdsBuilder_ == null) {
          experimentIds_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.getDefaultInstance();
        } else {
          experimentIdsBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00010000);
        clientVe_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00020000);
        clientVeJs_ = "";
        bitField0_ = (bitField0_ & ~0x00040000);
        internalEvent_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent.NONE;
        bitField0_ = (bitField0_ & ~0x00080000);
        testCode_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00100000);
        bootCount_ = 0L;
        bitField0_ = (bitField0_ & ~0x00200000);
        if (networkConnectionInfoBuilder_ == null) {
          networkConnectionInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.getDefaultInstance();
        } else {
          networkConnectionInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00400000);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogEvent_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.eventTimeMs_ = eventTimeMs_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.eventUptimeMs_ = eventUptimeMs_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.sequencePosition_ = sequencePosition_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.tag_ = tag_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.eventCode_ = eventCode_;
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        result.eventFlowId_ = eventFlowId_;
        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
          to_bitField0_ |= 0x00000040;
        }
        result.isUserInitiated_ = isUserInitiated_;
        if (valueBuilder_ == null) {
          if (((bitField0_ & 0x00000080) == 0x00000080)) {
            value_ = java.util.Collections.unmodifiableList(value_);
            bitField0_ = (bitField0_ & ~0x00000080);
          }
          result.value_ = value_;
        } else {
          result.value_ = valueBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
          to_bitField0_ |= 0x00000080;
        }
        result.store_ = store_;
        if (((from_bitField0_ & 0x00000200) == 0x00000200)) {
          to_bitField0_ |= 0x00000100;
        }
        if (appUsage1PBuilder_ == null) {
          result.appUsage1P_ = appUsage1P_;
        } else {
          result.appUsage1P_ = appUsage1PBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
          to_bitField0_ |= 0x00000200;
        }
        result.sourceExtension_ = sourceExtension_;
        if (((from_bitField0_ & 0x00000800) == 0x00000800)) {
          to_bitField0_ |= 0x00000400;
        }
        result.sourceExtensionJs_ = sourceExtensionJs_;
        if (((from_bitField0_ & 0x00001000) == 0x00001000)) {
          to_bitField0_ |= 0x00000800;
        }
        result.sourceExtensionJson_ = sourceExtensionJson_;
        if (((from_bitField0_ & 0x00002000) == 0x00002000)) {
          to_bitField0_ |= 0x00001000;
        }
        if (expBuilder_ == null) {
          result.exp_ = exp_;
        } else {
          result.exp_ = expBuilder_.build();
        }
        if (((from_bitField0_ & 0x00004000) == 0x00004000)) {
          to_bitField0_ |= 0x00002000;
        }
        result.testId_ = testId_;
        if (((from_bitField0_ & 0x00008000) == 0x00008000)) {
          to_bitField0_ |= 0x00004000;
        }
        result.timezoneOffsetSeconds_ = timezoneOffsetSeconds_;
        if (((from_bitField0_ & 0x00010000) == 0x00010000)) {
          to_bitField0_ |= 0x00008000;
        }
        if (experimentIdsBuilder_ == null) {
          result.experimentIds_ = experimentIds_;
        } else {
          result.experimentIds_ = experimentIdsBuilder_.build();
        }
        if (((from_bitField0_ & 0x00020000) == 0x00020000)) {
          to_bitField0_ |= 0x00010000;
        }
        result.clientVe_ = clientVe_;
        if (((from_bitField0_ & 0x00040000) == 0x00040000)) {
          to_bitField0_ |= 0x00020000;
        }
        result.clientVeJs_ = clientVeJs_;
        if (((from_bitField0_ & 0x00080000) == 0x00080000)) {
          to_bitField0_ |= 0x00040000;
        }
        result.internalEvent_ = internalEvent_;
        if (((bitField0_ & 0x00100000) == 0x00100000)) {
          testCode_ = java.util.Collections.unmodifiableList(testCode_);
          bitField0_ = (bitField0_ & ~0x00100000);
        }
        result.testCode_ = testCode_;
        if (((from_bitField0_ & 0x00200000) == 0x00200000)) {
          to_bitField0_ |= 0x00080000;
        }
        result.bootCount_ = bootCount_;
        if (((from_bitField0_ & 0x00400000) == 0x00400000)) {
          to_bitField0_ |= 0x00100000;
        }
        if (networkConnectionInfoBuilder_ == null) {
          result.networkConnectionInfo_ = networkConnectionInfo_;
        } else {
          result.networkConnectionInfo_ = networkConnectionInfoBuilder_.build();
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.getDefaultInstance()) return this;
        if (other.hasEventTimeMs()) {
          setEventTimeMs(other.getEventTimeMs());
        }
        if (other.hasEventUptimeMs()) {
          setEventUptimeMs(other.getEventUptimeMs());
        }
        if (other.hasSequencePosition()) {
          setSequencePosition(other.getSequencePosition());
        }
        if (other.hasTag()) {
          bitField0_ |= 0x00000008;
          tag_ = other.tag_;
          onChanged();
        }
        if (other.hasEventCode()) {
          setEventCode(other.getEventCode());
        }
        if (other.hasEventFlowId()) {
          setEventFlowId(other.getEventFlowId());
        }
        if (other.hasIsUserInitiated()) {
          setIsUserInitiated(other.getIsUserInitiated());
        }
        if (valueBuilder_ == null) {
          if (!other.value_.isEmpty()) {
            if (value_.isEmpty()) {
              value_ = other.value_;
              bitField0_ = (bitField0_ & ~0x00000080);
            } else {
              ensureValueIsMutable();
              value_.addAll(other.value_);
            }
            onChanged();
          }
        } else {
          if (!other.value_.isEmpty()) {
            if (valueBuilder_.isEmpty()) {
              valueBuilder_.dispose();
              valueBuilder_ = null;
              value_ = other.value_;
              bitField0_ = (bitField0_ & ~0x00000080);
              valueBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getValueFieldBuilder() : null;
            } else {
              valueBuilder_.addAllMessages(other.value_);
            }
          }
        }
        if (other.hasStore()) {
          setStore(other.getStore());
        }
        if (other.hasAppUsage1P()) {
          mergeAppUsage1P(other.getAppUsage1P());
        }
        if (other.hasSourceExtension()) {
          setSourceExtension(other.getSourceExtension());
        }
        if (other.hasSourceExtensionJs()) {
          bitField0_ |= 0x00000800;
          sourceExtensionJs_ = other.sourceExtensionJs_;
          onChanged();
        }
        if (other.hasSourceExtensionJson()) {
          bitField0_ |= 0x00001000;
          sourceExtensionJson_ = other.sourceExtensionJson_;
          onChanged();
        }
        if (other.hasExp()) {
          mergeExp(other.getExp());
        }
        if (other.hasTestId()) {
          bitField0_ |= 0x00004000;
          testId_ = other.testId_;
          onChanged();
        }
        if (other.hasTimezoneOffsetSeconds()) {
          setTimezoneOffsetSeconds(other.getTimezoneOffsetSeconds());
        }
        if (other.hasExperimentIds()) {
          mergeExperimentIds(other.getExperimentIds());
        }
        if (other.hasClientVe()) {
          setClientVe(other.getClientVe());
        }
        if (other.hasClientVeJs()) {
          bitField0_ |= 0x00040000;
          clientVeJs_ = other.clientVeJs_;
          onChanged();
        }
        if (other.hasInternalEvent()) {
          setInternalEvent(other.getInternalEvent());
        }
        if (!other.testCode_.isEmpty()) {
          if (testCode_.isEmpty()) {
            testCode_ = other.testCode_;
            bitField0_ = (bitField0_ & ~0x00100000);
          } else {
            ensureTestCodeIsMutable();
            testCode_.addAll(other.testCode_);
          }
          onChanged();
        }
        if (other.hasBootCount()) {
          setBootCount(other.getBootCount());
        }
        if (other.hasNetworkConnectionInfo()) {
          mergeNetworkConnectionInfo(other.getNetworkConnectionInfo());
        }
        this.mergeExtensionFields(other);
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        if (!extensionsAreInitialized()) {
          
          return false;
        }
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional int64 event_time_ms = 1;
      private long eventTimeMs_ ;
      /**
       * <code>optional int64 event_time_ms = 1;</code>
       *
       * <pre>
       * Epoch time in milliseconds, according to the wall clock.
       *  See http://go/clearcut-timestamps for details on how this value is used.
       *  This field is required for Odyssey. Otherwise, events will be silently
       *  dropped.
       * </pre>
       */
      public boolean hasEventTimeMs() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional int64 event_time_ms = 1;</code>
       *
       * <pre>
       * Epoch time in milliseconds, according to the wall clock.
       *  See http://go/clearcut-timestamps for details on how this value is used.
       *  This field is required for Odyssey. Otherwise, events will be silently
       *  dropped.
       * </pre>
       */
      public long getEventTimeMs() {
        return eventTimeMs_;
      }
      /**
       * <code>optional int64 event_time_ms = 1;</code>
       *
       * <pre>
       * Epoch time in milliseconds, according to the wall clock.
       *  See http://go/clearcut-timestamps for details on how this value is used.
       *  This field is required for Odyssey. Otherwise, events will be silently
       *  dropped.
       * </pre>
       */
      public Builder setEventTimeMs(long value) {
        bitField0_ |= 0x00000001;
        eventTimeMs_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 event_time_ms = 1;</code>
       *
       * <pre>
       * Epoch time in milliseconds, according to the wall clock.
       *  See http://go/clearcut-timestamps for details on how this value is used.
       *  This field is required for Odyssey. Otherwise, events will be silently
       *  dropped.
       * </pre>
       */
      public Builder clearEventTimeMs() {
        bitField0_ = (bitField0_ & ~0x00000001);
        eventTimeMs_ = 0L;
        onChanged();
        return this;
      }

      // optional int64 event_uptime_ms = 17;
      private long eventUptimeMs_ ;
      /**
       * <code>optional int64 event_uptime_ms = 17;</code>
       *
       * <pre>
       * Time in milliseconds since the device was booted.  (On Android this
       *  is the result of SystemClock.elapsedRealtime(), not
       *  SystemClock.uptimeMillis() which does not increment when the device is in
       *  deep sleep.)
       *
       *  See http://go/clearcut-timestamps for details on how this value is used for
       *  timestamp corrections.  It is also copied to
       *  PlayExtension.client_elapsed_realtime_millis if the routing option
       *  "include_client_elapsed_realtime_millis" is set to true.
       * </pre>
       */
      public boolean hasEventUptimeMs() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional int64 event_uptime_ms = 17;</code>
       *
       * <pre>
       * Time in milliseconds since the device was booted.  (On Android this
       *  is the result of SystemClock.elapsedRealtime(), not
       *  SystemClock.uptimeMillis() which does not increment when the device is in
       *  deep sleep.)
       *
       *  See http://go/clearcut-timestamps for details on how this value is used for
       *  timestamp corrections.  It is also copied to
       *  PlayExtension.client_elapsed_realtime_millis if the routing option
       *  "include_client_elapsed_realtime_millis" is set to true.
       * </pre>
       */
      public long getEventUptimeMs() {
        return eventUptimeMs_;
      }
      /**
       * <code>optional int64 event_uptime_ms = 17;</code>
       *
       * <pre>
       * Time in milliseconds since the device was booted.  (On Android this
       *  is the result of SystemClock.elapsedRealtime(), not
       *  SystemClock.uptimeMillis() which does not increment when the device is in
       *  deep sleep.)
       *
       *  See http://go/clearcut-timestamps for details on how this value is used for
       *  timestamp corrections.  It is also copied to
       *  PlayExtension.client_elapsed_realtime_millis if the routing option
       *  "include_client_elapsed_realtime_millis" is set to true.
       * </pre>
       */
      public Builder setEventUptimeMs(long value) {
        bitField0_ |= 0x00000002;
        eventUptimeMs_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 event_uptime_ms = 17;</code>
       *
       * <pre>
       * Time in milliseconds since the device was booted.  (On Android this
       *  is the result of SystemClock.elapsedRealtime(), not
       *  SystemClock.uptimeMillis() which does not increment when the device is in
       *  deep sleep.)
       *
       *  See http://go/clearcut-timestamps for details on how this value is used for
       *  timestamp corrections.  It is also copied to
       *  PlayExtension.client_elapsed_realtime_millis if the routing option
       *  "include_client_elapsed_realtime_millis" is set to true.
       * </pre>
       */
      public Builder clearEventUptimeMs() {
        bitField0_ = (bitField0_ & ~0x00000002);
        eventUptimeMs_ = 0L;
        onChanged();
        return this;
      }

      // optional int64 sequence_position = 21;
      private long sequencePosition_ ;
      /**
       * <code>optional int64 sequence_position = 21;</code>
       *
       * <pre>
       * Client generated sequence position for this event - defines a total order
       *  for events from a given device. If event A's sequence position is less than
       *  event B's sequence position, then event A happened before event B.
       * </pre>
       */
      public boolean hasSequencePosition() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional int64 sequence_position = 21;</code>
       *
       * <pre>
       * Client generated sequence position for this event - defines a total order
       *  for events from a given device. If event A's sequence position is less than
       *  event B's sequence position, then event A happened before event B.
       * </pre>
       */
      public long getSequencePosition() {
        return sequencePosition_;
      }
      /**
       * <code>optional int64 sequence_position = 21;</code>
       *
       * <pre>
       * Client generated sequence position for this event - defines a total order
       *  for events from a given device. If event A's sequence position is less than
       *  event B's sequence position, then event A happened before event B.
       * </pre>
       */
      public Builder setSequencePosition(long value) {
        bitField0_ |= 0x00000004;
        sequencePosition_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 sequence_position = 21;</code>
       *
       * <pre>
       * Client generated sequence position for this event - defines a total order
       *  for events from a given device. If event A's sequence position is less than
       *  event B's sequence position, then event A happened before event B.
       * </pre>
       */
      public Builder clearSequencePosition() {
        bitField0_ = (bitField0_ & ~0x00000004);
        sequencePosition_ = 0L;
        onChanged();
        return this;
      }

      // optional string tag = 2;
      private java.lang.Object tag_ = "";
      /**
       * <code>optional string tag = 2;</code>
       *
       * <pre>
       * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
       *  There will be a common repository of cross-vertical events that should be
       *  used, but any individual app would be free to define their own tags.
       *
       *  STRONGLY DISCOURAGED: use event_code instead.
       * </pre>
       */
      public boolean hasTag() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional string tag = 2;</code>
       *
       * <pre>
       * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
       *  There will be a common repository of cross-vertical events that should be
       *  used, but any individual app would be free to define their own tags.
       *
       *  STRONGLY DISCOURAGED: use event_code instead.
       * </pre>
       */
      public java.lang.String getTag() {
        java.lang.Object ref = tag_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          tag_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string tag = 2;</code>
       *
       * <pre>
       * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
       *  There will be a common repository of cross-vertical events that should be
       *  used, but any individual app would be free to define their own tags.
       *
       *  STRONGLY DISCOURAGED: use event_code instead.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getTagBytes() {
        java.lang.Object ref = tag_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          tag_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string tag = 2;</code>
       *
       * <pre>
       * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
       *  There will be a common repository of cross-vertical events that should be
       *  used, but any individual app would be free to define their own tags.
       *
       *  STRONGLY DISCOURAGED: use event_code instead.
       * </pre>
       */
      public Builder setTag(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        tag_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string tag = 2;</code>
       *
       * <pre>
       * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
       *  There will be a common repository of cross-vertical events that should be
       *  used, but any individual app would be free to define their own tags.
       *
       *  STRONGLY DISCOURAGED: use event_code instead.
       * </pre>
       */
      public Builder clearTag() {
        bitField0_ = (bitField0_ & ~0x00000008);
        tag_ = getDefaultInstance().getTag();
        onChanged();
        return this;
      }
      /**
       * <code>optional string tag = 2;</code>
       *
       * <pre>
       * Type of event, could be "CLICK" or "PAGE_VIEW" or "DOWNLOAD_STATUS".
       *  There will be a common repository of cross-vertical events that should be
       *  used, but any individual app would be free to define their own tags.
       *
       *  STRONGLY DISCOURAGED: use event_code instead.
       * </pre>
       */
      public Builder setTagBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        tag_ = value;
        onChanged();
        return this;
      }

      // optional int32 event_code = 11;
      private int eventCode_ ;
      /**
       * <code>optional int32 event_code = 11;</code>
       *
       * <pre>
       * Type of event. Different kinds of events inside a client app should have
       *  different values of 'event_code'. Different client apps may have
       *  overlapping sets of 'event_code' values; these values are only meant to
       *  make sense within the context of a single client app, as identified by
       *  the 'log_source' field of LogRequest.
       *
       *  A typical way to use 'event_code' is to define the enum of possible values
       *  inside of the custom logging extension proto.
       *  TODO(abednego): add an example CL.
       *
       *  This enum type should be annotated with a LogEventRoutingConfig proto.
       * </pre>
       */
      public boolean hasEventCode() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional int32 event_code = 11;</code>
       *
       * <pre>
       * Type of event. Different kinds of events inside a client app should have
       *  different values of 'event_code'. Different client apps may have
       *  overlapping sets of 'event_code' values; these values are only meant to
       *  make sense within the context of a single client app, as identified by
       *  the 'log_source' field of LogRequest.
       *
       *  A typical way to use 'event_code' is to define the enum of possible values
       *  inside of the custom logging extension proto.
       *  TODO(abednego): add an example CL.
       *
       *  This enum type should be annotated with a LogEventRoutingConfig proto.
       * </pre>
       */
      public int getEventCode() {
        return eventCode_;
      }
      /**
       * <code>optional int32 event_code = 11;</code>
       *
       * <pre>
       * Type of event. Different kinds of events inside a client app should have
       *  different values of 'event_code'. Different client apps may have
       *  overlapping sets of 'event_code' values; these values are only meant to
       *  make sense within the context of a single client app, as identified by
       *  the 'log_source' field of LogRequest.
       *
       *  A typical way to use 'event_code' is to define the enum of possible values
       *  inside of the custom logging extension proto.
       *  TODO(abednego): add an example CL.
       *
       *  This enum type should be annotated with a LogEventRoutingConfig proto.
       * </pre>
       */
      public Builder setEventCode(int value) {
        bitField0_ |= 0x00000010;
        eventCode_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 event_code = 11;</code>
       *
       * <pre>
       * Type of event. Different kinds of events inside a client app should have
       *  different values of 'event_code'. Different client apps may have
       *  overlapping sets of 'event_code' values; these values are only meant to
       *  make sense within the context of a single client app, as identified by
       *  the 'log_source' field of LogRequest.
       *
       *  A typical way to use 'event_code' is to define the enum of possible values
       *  inside of the custom logging extension proto.
       *  TODO(abednego): add an example CL.
       *
       *  This enum type should be annotated with a LogEventRoutingConfig proto.
       * </pre>
       */
      public Builder clearEventCode() {
        bitField0_ = (bitField0_ & ~0x00000010);
        eventCode_ = 0;
        onChanged();
        return this;
      }

      // optional int32 event_flow_id = 12;
      private int eventFlowId_ ;
      /**
       * <code>optional int32 event_flow_id = 12;</code>
       *
       * <pre>
       * Identifies a group of events that belong to the same flow or session of
       *  user interaction, which is a client-specific concept.
       *
       *  These IDs are used in the Clearcut/UMA pipeline for computing latencies
       *  between pairs of events, where it is necessary to ensure that both events
       *  belong to the same flow.
       *
       *  For example, the Google Play team may want to give a unique ID to each
       *  purchase session, including all of the events starting from the initial
       *  search for an app to the eventual purchase and installation of the app.
       *  Another example would be the Search app wanting to tie together search
       *  query events and clicks on search results, especially if several instances
       *  of the app may be active at the same time.
       * </pre>
       */
      public boolean hasEventFlowId() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * <code>optional int32 event_flow_id = 12;</code>
       *
       * <pre>
       * Identifies a group of events that belong to the same flow or session of
       *  user interaction, which is a client-specific concept.
       *
       *  These IDs are used in the Clearcut/UMA pipeline for computing latencies
       *  between pairs of events, where it is necessary to ensure that both events
       *  belong to the same flow.
       *
       *  For example, the Google Play team may want to give a unique ID to each
       *  purchase session, including all of the events starting from the initial
       *  search for an app to the eventual purchase and installation of the app.
       *  Another example would be the Search app wanting to tie together search
       *  query events and clicks on search results, especially if several instances
       *  of the app may be active at the same time.
       * </pre>
       */
      public int getEventFlowId() {
        return eventFlowId_;
      }
      /**
       * <code>optional int32 event_flow_id = 12;</code>
       *
       * <pre>
       * Identifies a group of events that belong to the same flow or session of
       *  user interaction, which is a client-specific concept.
       *
       *  These IDs are used in the Clearcut/UMA pipeline for computing latencies
       *  between pairs of events, where it is necessary to ensure that both events
       *  belong to the same flow.
       *
       *  For example, the Google Play team may want to give a unique ID to each
       *  purchase session, including all of the events starting from the initial
       *  search for an app to the eventual purchase and installation of the app.
       *  Another example would be the Search app wanting to tie together search
       *  query events and clicks on search results, especially if several instances
       *  of the app may be active at the same time.
       * </pre>
       */
      public Builder setEventFlowId(int value) {
        bitField0_ |= 0x00000020;
        eventFlowId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 event_flow_id = 12;</code>
       *
       * <pre>
       * Identifies a group of events that belong to the same flow or session of
       *  user interaction, which is a client-specific concept.
       *
       *  These IDs are used in the Clearcut/UMA pipeline for computing latencies
       *  between pairs of events, where it is necessary to ensure that both events
       *  belong to the same flow.
       *
       *  For example, the Google Play team may want to give a unique ID to each
       *  purchase session, including all of the events starting from the initial
       *  search for an app to the eventual purchase and installation of the app.
       *  Another example would be the Search app wanting to tie together search
       *  query events and clicks on search results, especially if several instances
       *  of the app may be active at the same time.
       * </pre>
       */
      public Builder clearEventFlowId() {
        bitField0_ = (bitField0_ & ~0x00000020);
        eventFlowId_ = 0;
        onChanged();
        return this;
      }

      // optional bool is_user_initiated = 10;
      private boolean isUserInitiated_ ;
      /**
       * <code>optional bool is_user_initiated = 10;</code>
       *
       * <pre>
       * Whether this event was initiated by the user at the time of the event or
       *  shortly before (vs. a background event like upgrading a database after the
       *  app was automatically updated).
       * </pre>
       */
      public boolean hasIsUserInitiated() {
        return ((bitField0_ & 0x00000040) == 0x00000040);
      }
      /**
       * <code>optional bool is_user_initiated = 10;</code>
       *
       * <pre>
       * Whether this event was initiated by the user at the time of the event or
       *  shortly before (vs. a background event like upgrading a database after the
       *  app was automatically updated).
       * </pre>
       */
      public boolean getIsUserInitiated() {
        return isUserInitiated_;
      }
      /**
       * <code>optional bool is_user_initiated = 10;</code>
       *
       * <pre>
       * Whether this event was initiated by the user at the time of the event or
       *  shortly before (vs. a background event like upgrading a database after the
       *  app was automatically updated).
       * </pre>
       */
      public Builder setIsUserInitiated(boolean value) {
        bitField0_ |= 0x00000040;
        isUserInitiated_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool is_user_initiated = 10;</code>
       *
       * <pre>
       * Whether this event was initiated by the user at the time of the event or
       *  shortly before (vs. a background event like upgrading a database after the
       *  app was automatically updated).
       * </pre>
       */
      public Builder clearIsUserInitiated() {
        bitField0_ = (bitField0_ & ~0x00000040);
        isUserInitiated_ = false;
        onChanged();
        return this;
      }

      // repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;
      private java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues> value_ =
        java.util.Collections.emptyList();
      private void ensureValueIsMutable() {
        if (!((bitField0_ & 0x00000080) == 0x00000080)) {
          value_ = new java.util.ArrayList<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues>(value_);
          bitField0_ |= 0x00000080;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValuesOrBuilder> valueBuilder_;

      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues> getValueList() {
        if (valueBuilder_ == null) {
          return java.util.Collections.unmodifiableList(value_);
        } else {
          return valueBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public int getValueCount() {
        if (valueBuilder_ == null) {
          return value_.size();
        } else {
          return valueBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues getValue(int index) {
        if (valueBuilder_ == null) {
          return value_.get(index);
        } else {
          return valueBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public Builder setValue(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues value) {
        if (valueBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureValueIsMutable();
          value_.set(index, value);
          onChanged();
        } else {
          valueBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public Builder setValue(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder builderForValue) {
        if (valueBuilder_ == null) {
          ensureValueIsMutable();
          value_.set(index, builderForValue.build());
          onChanged();
        } else {
          valueBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public Builder addValue(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues value) {
        if (valueBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureValueIsMutable();
          value_.add(value);
          onChanged();
        } else {
          valueBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public Builder addValue(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues value) {
        if (valueBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureValueIsMutable();
          value_.add(index, value);
          onChanged();
        } else {
          valueBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public Builder addValue(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder builderForValue) {
        if (valueBuilder_ == null) {
          ensureValueIsMutable();
          value_.add(builderForValue.build());
          onChanged();
        } else {
          valueBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public Builder addValue(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder builderForValue) {
        if (valueBuilder_ == null) {
          ensureValueIsMutable();
          value_.add(index, builderForValue.build());
          onChanged();
        } else {
          valueBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public Builder addAllValue(
          java.lang.Iterable<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues> values) {
        if (valueBuilder_ == null) {
          ensureValueIsMutable();
          super.addAll(values, value_);
          onChanged();
        } else {
          valueBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public Builder clearValue() {
        if (valueBuilder_ == null) {
          value_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000080);
          onChanged();
        } else {
          valueBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public Builder removeValue(int index) {
        if (valueBuilder_ == null) {
          ensureValueIsMutable();
          value_.remove(index);
          onChanged();
        } else {
          valueBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder getValueBuilder(
          int index) {
        return getValueFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValuesOrBuilder getValueOrBuilder(
          int index) {
        if (valueBuilder_ == null) {
          return value_.get(index);  } else {
          return valueBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValuesOrBuilder> 
           getValueOrBuilderList() {
        if (valueBuilder_ != null) {
          return valueBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(value_);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder addValueBuilder() {
        return getValueFieldBuilder().addBuilder(
            com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.getDefaultInstance());
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder addValueBuilder(
          int index) {
        return getValueFieldBuilder().addBuilder(
            index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.getDefaultInstance());
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEventKeyValues value = 3;</code>
       *
       * <pre>
       * These might contain PII and will not be stored for more than 8 days.
       *  If possible, please create a named field in the protos below instead.
       * </pre>
       */
      public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder> 
           getValueBuilderList() {
        return getValueFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValuesOrBuilder> 
          getValueFieldBuilder() {
        if (valueBuilder_ == null) {
          valueBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValues.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventKeyValuesOrBuilder>(
                  value_,
                  ((bitField0_ & 0x00000080) == 0x00000080),
                  getParentForChildren(),
                  isClean());
          value_ = null;
        }
        return valueBuilder_;
      }

      // optional bytes store = 4;
      private com.google.protobuf.ByteString store_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>optional bytes store = 4;</code>
       *
       * <pre>
       * TODO(jsw): Remove. We can't do that as of 2015/08/13 because we still get
       *  several thousand QPS from ancient Play Store clients who use this field.
       *
       *  Extension for Play Store app logs. Real type is PlayStoreLogEvent. This
       *  exists to support legacy clients. Use source_extension instead.
       * </pre>
       */
      public boolean hasStore() {
        return ((bitField0_ & 0x00000100) == 0x00000100);
      }
      /**
       * <code>optional bytes store = 4;</code>
       *
       * <pre>
       * TODO(jsw): Remove. We can't do that as of 2015/08/13 because we still get
       *  several thousand QPS from ancient Play Store clients who use this field.
       *
       *  Extension for Play Store app logs. Real type is PlayStoreLogEvent. This
       *  exists to support legacy clients. Use source_extension instead.
       * </pre>
       */
      public com.google.protobuf.ByteString getStore() {
        return store_;
      }
      /**
       * <code>optional bytes store = 4;</code>
       *
       * <pre>
       * TODO(jsw): Remove. We can't do that as of 2015/08/13 because we still get
       *  several thousand QPS from ancient Play Store clients who use this field.
       *
       *  Extension for Play Store app logs. Real type is PlayStoreLogEvent. This
       *  exists to support legacy clients. Use source_extension instead.
       * </pre>
       */
      public Builder setStore(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        store_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bytes store = 4;</code>
       *
       * <pre>
       * TODO(jsw): Remove. We can't do that as of 2015/08/13 because we still get
       *  several thousand QPS from ancient Play Store clients who use this field.
       *
       *  Extension for Play Store app logs. Real type is PlayStoreLogEvent. This
       *  exists to support legacy clients. Use source_extension instead.
       * </pre>
       */
      public Builder clearStore() {
        bitField0_ = (bitField0_ & ~0x00000100);
        store_ = getDefaultInstance().getStore();
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent appUsage1P_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEventOrBuilder> appUsage1PBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
       *
       * <pre>
       * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
       * </pre>
       */
      public boolean hasAppUsage1P() {
        return ((bitField0_ & 0x00000200) == 0x00000200);
      }
      /**
       * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
       *
       * <pre>
       * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent getAppUsage1P() {
        if (appUsage1PBuilder_ == null) {
          return appUsage1P_;
        } else {
          return appUsage1PBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
       *
       * <pre>
       * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
       * </pre>
       */
      public Builder setAppUsage1P(com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent value) {
        if (appUsage1PBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          appUsage1P_ = value;
          onChanged();
        } else {
          appUsage1PBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
       *
       * <pre>
       * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
       * </pre>
       */
      public Builder setAppUsage1P(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.Builder builderForValue) {
        if (appUsage1PBuilder_ == null) {
          appUsage1P_ = builderForValue.build();
          onChanged();
        } else {
          appUsage1PBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
       *
       * <pre>
       * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
       * </pre>
       */
      public Builder mergeAppUsage1P(com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent value) {
        if (appUsage1PBuilder_ == null) {
          if (((bitField0_ & 0x00000200) == 0x00000200) &&
              appUsage1P_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.getDefaultInstance()) {
            appUsage1P_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.newBuilder(appUsage1P_).mergeFrom(value).buildPartial();
          } else {
            appUsage1P_ = value;
          }
          onChanged();
        } else {
          appUsage1PBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
       *
       * <pre>
       * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
       * </pre>
       */
      public Builder clearAppUsage1P() {
        if (appUsage1PBuilder_ == null) {
          appUsage1P_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.getDefaultInstance();
          onChanged();
        } else {
          appUsage1PBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000200);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
       *
       * <pre>
       * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.Builder getAppUsage1PBuilder() {
        bitField0_ |= 0x00000200;
        onChanged();
        return getAppUsage1PFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
       *
       * <pre>
       * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEventOrBuilder getAppUsage1POrBuilder() {
        if (appUsage1PBuilder_ != null) {
          return appUsage1PBuilder_.getMessageOrBuilder();
        } else {
          return appUsage1P_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.AppUsage1pLogEvent app_usage_1p = 9;</code>
       *
       * <pre>
       * First-party app usage tracking. Used only when log_source = APP_USAGE_1P.
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEventOrBuilder> 
          getAppUsage1PFieldBuilder() {
        if (appUsage1PBuilder_ == null) {
          appUsage1PBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEventOrBuilder>(
                  appUsage1P_,
                  getParentForChildren(),
                  isClean());
          appUsage1P_ = null;
        }
        return appUsage1PBuilder_;
      }

      // optional bytes source_extension = 6;
      private com.google.protobuf.ByteString sourceExtension_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>optional bytes source_extension = 6;</code>
       *
       * <pre>
       * A source specific extension (typically a serialized proto). The type of
       *  this data is determined by the log_source of the enclosing LogRequest.
       *  The proto is derived by calling ParseFromString method in
       *  net/proto2/public/message_lite.h.
       * </pre>
       */
      public boolean hasSourceExtension() {
        return ((bitField0_ & 0x00000400) == 0x00000400);
      }
      /**
       * <code>optional bytes source_extension = 6;</code>
       *
       * <pre>
       * A source specific extension (typically a serialized proto). The type of
       *  this data is determined by the log_source of the enclosing LogRequest.
       *  The proto is derived by calling ParseFromString method in
       *  net/proto2/public/message_lite.h.
       * </pre>
       */
      public com.google.protobuf.ByteString getSourceExtension() {
        return sourceExtension_;
      }
      /**
       * <code>optional bytes source_extension = 6;</code>
       *
       * <pre>
       * A source specific extension (typically a serialized proto). The type of
       *  this data is determined by the log_source of the enclosing LogRequest.
       *  The proto is derived by calling ParseFromString method in
       *  net/proto2/public/message_lite.h.
       * </pre>
       */
      public Builder setSourceExtension(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        sourceExtension_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bytes source_extension = 6;</code>
       *
       * <pre>
       * A source specific extension (typically a serialized proto). The type of
       *  this data is determined by the log_source of the enclosing LogRequest.
       *  The proto is derived by calling ParseFromString method in
       *  net/proto2/public/message_lite.h.
       * </pre>
       */
      public Builder clearSourceExtension() {
        bitField0_ = (bitField0_ & ~0x00000400);
        sourceExtension_ = getDefaultInstance().getSourceExtension();
        onChanged();
        return this;
      }

      // optional string source_extension_js = 8;
      private java.lang.Object sourceExtensionJs_ = "";
      /**
       * <code>optional string source_extension_js = 8;</code>
       *
       * <pre>
       * A jspb version of source_extension, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public boolean hasSourceExtensionJs() {
        return ((bitField0_ & 0x00000800) == 0x00000800);
      }
      /**
       * <code>optional string source_extension_js = 8;</code>
       *
       * <pre>
       * A jspb version of source_extension, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public java.lang.String getSourceExtensionJs() {
        java.lang.Object ref = sourceExtensionJs_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          sourceExtensionJs_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string source_extension_js = 8;</code>
       *
       * <pre>
       * A jspb version of source_extension, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getSourceExtensionJsBytes() {
        java.lang.Object ref = sourceExtensionJs_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          sourceExtensionJs_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string source_extension_js = 8;</code>
       *
       * <pre>
       * A jspb version of source_extension, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public Builder setSourceExtensionJs(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
        sourceExtensionJs_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string source_extension_js = 8;</code>
       *
       * <pre>
       * A jspb version of source_extension, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public Builder clearSourceExtensionJs() {
        bitField0_ = (bitField0_ & ~0x00000800);
        sourceExtensionJs_ = getDefaultInstance().getSourceExtensionJs();
        onChanged();
        return this;
      }
      /**
       * <code>optional string source_extension_js = 8;</code>
       *
       * <pre>
       * A jspb version of source_extension, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public Builder setSourceExtensionJsBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
        sourceExtensionJs_ = value;
        onChanged();
        return this;
      }

      // optional string source_extension_json = 13;
      private java.lang.Object sourceExtensionJson_ = "";
      /**
       * <code>optional string source_extension_json = 13;</code>
       *
       * <pre>
       * A stringified json proto version of source_extension.  The json string is
       *  converted back to proto using the json_format utility at
       *  net/proto2/util/public/json_format.h, without any flags.
       * </pre>
       */
      public boolean hasSourceExtensionJson() {
        return ((bitField0_ & 0x00001000) == 0x00001000);
      }
      /**
       * <code>optional string source_extension_json = 13;</code>
       *
       * <pre>
       * A stringified json proto version of source_extension.  The json string is
       *  converted back to proto using the json_format utility at
       *  net/proto2/util/public/json_format.h, without any flags.
       * </pre>
       */
      public java.lang.String getSourceExtensionJson() {
        java.lang.Object ref = sourceExtensionJson_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          sourceExtensionJson_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string source_extension_json = 13;</code>
       *
       * <pre>
       * A stringified json proto version of source_extension.  The json string is
       *  converted back to proto using the json_format utility at
       *  net/proto2/util/public/json_format.h, without any flags.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getSourceExtensionJsonBytes() {
        java.lang.Object ref = sourceExtensionJson_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          sourceExtensionJson_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string source_extension_json = 13;</code>
       *
       * <pre>
       * A stringified json proto version of source_extension.  The json string is
       *  converted back to proto using the json_format utility at
       *  net/proto2/util/public/json_format.h, without any flags.
       * </pre>
       */
      public Builder setSourceExtensionJson(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00001000;
        sourceExtensionJson_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string source_extension_json = 13;</code>
       *
       * <pre>
       * A stringified json proto version of source_extension.  The json string is
       *  converted back to proto using the json_format utility at
       *  net/proto2/util/public/json_format.h, without any flags.
       * </pre>
       */
      public Builder clearSourceExtensionJson() {
        bitField0_ = (bitField0_ & ~0x00001000);
        sourceExtensionJson_ = getDefaultInstance().getSourceExtensionJson();
        onChanged();
        return this;
      }
      /**
       * <code>optional string source_extension_json = 13;</code>
       *
       * <pre>
       * A stringified json proto version of source_extension.  The json string is
       *  converted back to proto using the json_format utility at
       *  net/proto2/util/public/json_format.h, without any flags.
       * </pre>
       */
      public Builder setSourceExtensionJsonBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00001000;
        sourceExtensionJson_ = value;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.ActiveExperiments exp = 7;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments exp_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperimentsOrBuilder> expBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
       *
       * <pre>
       * The set of currently active experiments. If missing, then the server will
       *  assume that experiment on/off status has not changed since the previous
       *  LogEvent message in the same LogRequest proto. If missing in the very first
       *  LogEvent of a LogRequest, then the server will assume that all experiments
       *  are off.
       * </pre>
       */
      public boolean hasExp() {
        return ((bitField0_ & 0x00002000) == 0x00002000);
      }
      /**
       * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
       *
       * <pre>
       * The set of currently active experiments. If missing, then the server will
       *  assume that experiment on/off status has not changed since the previous
       *  LogEvent message in the same LogRequest proto. If missing in the very first
       *  LogEvent of a LogRequest, then the server will assume that all experiments
       *  are off.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments getExp() {
        if (expBuilder_ == null) {
          return exp_;
        } else {
          return expBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
       *
       * <pre>
       * The set of currently active experiments. If missing, then the server will
       *  assume that experiment on/off status has not changed since the previous
       *  LogEvent message in the same LogRequest proto. If missing in the very first
       *  LogEvent of a LogRequest, then the server will assume that all experiments
       *  are off.
       * </pre>
       */
      public Builder setExp(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments value) {
        if (expBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          exp_ = value;
          onChanged();
        } else {
          expBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00002000;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
       *
       * <pre>
       * The set of currently active experiments. If missing, then the server will
       *  assume that experiment on/off status has not changed since the previous
       *  LogEvent message in the same LogRequest proto. If missing in the very first
       *  LogEvent of a LogRequest, then the server will assume that all experiments
       *  are off.
       * </pre>
       */
      public Builder setExp(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.Builder builderForValue) {
        if (expBuilder_ == null) {
          exp_ = builderForValue.build();
          onChanged();
        } else {
          expBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00002000;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
       *
       * <pre>
       * The set of currently active experiments. If missing, then the server will
       *  assume that experiment on/off status has not changed since the previous
       *  LogEvent message in the same LogRequest proto. If missing in the very first
       *  LogEvent of a LogRequest, then the server will assume that all experiments
       *  are off.
       * </pre>
       */
      public Builder mergeExp(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments value) {
        if (expBuilder_ == null) {
          if (((bitField0_ & 0x00002000) == 0x00002000) &&
              exp_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.getDefaultInstance()) {
            exp_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.newBuilder(exp_).mergeFrom(value).buildPartial();
          } else {
            exp_ = value;
          }
          onChanged();
        } else {
          expBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00002000;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
       *
       * <pre>
       * The set of currently active experiments. If missing, then the server will
       *  assume that experiment on/off status has not changed since the previous
       *  LogEvent message in the same LogRequest proto. If missing in the very first
       *  LogEvent of a LogRequest, then the server will assume that all experiments
       *  are off.
       * </pre>
       */
      public Builder clearExp() {
        if (expBuilder_ == null) {
          exp_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.getDefaultInstance();
          onChanged();
        } else {
          expBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00002000);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
       *
       * <pre>
       * The set of currently active experiments. If missing, then the server will
       *  assume that experiment on/off status has not changed since the previous
       *  LogEvent message in the same LogRequest proto. If missing in the very first
       *  LogEvent of a LogRequest, then the server will assume that all experiments
       *  are off.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.Builder getExpBuilder() {
        bitField0_ |= 0x00002000;
        onChanged();
        return getExpFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
       *
       * <pre>
       * The set of currently active experiments. If missing, then the server will
       *  assume that experiment on/off status has not changed since the previous
       *  LogEvent message in the same LogRequest proto. If missing in the very first
       *  LogEvent of a LogRequest, then the server will assume that all experiments
       *  are off.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperimentsOrBuilder getExpOrBuilder() {
        if (expBuilder_ != null) {
          return expBuilder_.getMessageOrBuilder();
        } else {
          return exp_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.ActiveExperiments exp = 7;</code>
       *
       * <pre>
       * The set of currently active experiments. If missing, then the server will
       *  assume that experiment on/off status has not changed since the previous
       *  LogEvent message in the same LogRequest proto. If missing in the very first
       *  LogEvent of a LogRequest, then the server will assume that all experiments
       *  are off.
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperimentsOrBuilder> 
          getExpFieldBuilder() {
        if (expBuilder_ == null) {
          expBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperiments.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ActiveExperimentsOrBuilder>(
                  exp_,
                  getParentForChildren(),
                  isClean());
          exp_ = null;
        }
        return expBuilder_;
      }

      // optional string test_id = 14;
      private java.lang.Object testId_ = "";
      /**
       * <code>optional string test_id = 14;</code>
       *
       * <pre>
       * A string for identifying a test run.  You may use this string to group log
       *  data coming from a test run.  Usually logs from test apps or from normal
       *  apps running on test devices will have this field set.
       * </pre>
       */
      public boolean hasTestId() {
        return ((bitField0_ & 0x00004000) == 0x00004000);
      }
      /**
       * <code>optional string test_id = 14;</code>
       *
       * <pre>
       * A string for identifying a test run.  You may use this string to group log
       *  data coming from a test run.  Usually logs from test apps or from normal
       *  apps running on test devices will have this field set.
       * </pre>
       */
      public java.lang.String getTestId() {
        java.lang.Object ref = testId_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          testId_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string test_id = 14;</code>
       *
       * <pre>
       * A string for identifying a test run.  You may use this string to group log
       *  data coming from a test run.  Usually logs from test apps or from normal
       *  apps running on test devices will have this field set.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getTestIdBytes() {
        java.lang.Object ref = testId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          testId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string test_id = 14;</code>
       *
       * <pre>
       * A string for identifying a test run.  You may use this string to group log
       *  data coming from a test run.  Usually logs from test apps or from normal
       *  apps running on test devices will have this field set.
       * </pre>
       */
      public Builder setTestId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
        testId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string test_id = 14;</code>
       *
       * <pre>
       * A string for identifying a test run.  You may use this string to group log
       *  data coming from a test run.  Usually logs from test apps or from normal
       *  apps running on test devices will have this field set.
       * </pre>
       */
      public Builder clearTestId() {
        bitField0_ = (bitField0_ & ~0x00004000);
        testId_ = getDefaultInstance().getTestId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string test_id = 14;</code>
       *
       * <pre>
       * A string for identifying a test run.  You may use this string to group log
       *  data coming from a test run.  Usually logs from test apps or from normal
       *  apps running on test devices will have this field set.
       * </pre>
       */
      public Builder setTestIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
        testId_ = value;
        onChanged();
        return this;
      }

      // optional sint64 timezone_offset_seconds = 15 [default = 180000];
      private long timezoneOffsetSeconds_ = 180000L;
      /**
       * <code>optional sint64 timezone_offset_seconds = 15 [default = 180000];</code>
       *
       * <pre>
       * User's timezone offset from UTC in seconds. If the user's UTC time
       *  is X millis then the on-device clock time would be
       *  X + timezone_offset_seconds * 1000.
       *  The default value is non-sensical, mainly so that 0 can be distinguished
       *  from "not specified" using proto nano (and without changing our build
       *  options to use reference types for primitives).
       * </pre>
       */
      public boolean hasTimezoneOffsetSeconds() {
        return ((bitField0_ & 0x00008000) == 0x00008000);
      }
      /**
       * <code>optional sint64 timezone_offset_seconds = 15 [default = 180000];</code>
       *
       * <pre>
       * User's timezone offset from UTC in seconds. If the user's UTC time
       *  is X millis then the on-device clock time would be
       *  X + timezone_offset_seconds * 1000.
       *  The default value is non-sensical, mainly so that 0 can be distinguished
       *  from "not specified" using proto nano (and without changing our build
       *  options to use reference types for primitives).
       * </pre>
       */
      public long getTimezoneOffsetSeconds() {
        return timezoneOffsetSeconds_;
      }
      /**
       * <code>optional sint64 timezone_offset_seconds = 15 [default = 180000];</code>
       *
       * <pre>
       * User's timezone offset from UTC in seconds. If the user's UTC time
       *  is X millis then the on-device clock time would be
       *  X + timezone_offset_seconds * 1000.
       *  The default value is non-sensical, mainly so that 0 can be distinguished
       *  from "not specified" using proto nano (and without changing our build
       *  options to use reference types for primitives).
       * </pre>
       */
      public Builder setTimezoneOffsetSeconds(long value) {
        bitField0_ |= 0x00008000;
        timezoneOffsetSeconds_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional sint64 timezone_offset_seconds = 15 [default = 180000];</code>
       *
       * <pre>
       * User's timezone offset from UTC in seconds. If the user's UTC time
       *  is X millis then the on-device clock time would be
       *  X + timezone_offset_seconds * 1000.
       *  The default value is non-sensical, mainly so that 0 can be distinguished
       *  from "not specified" using proto nano (and without changing our build
       *  options to use reference types for primitives).
       * </pre>
       */
      public Builder clearTimezoneOffsetSeconds() {
        bitField0_ = (bitField0_ & ~0x00008000);
        timezoneOffsetSeconds_ = 180000L;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds experimentIds_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdsOrBuilder> experimentIdsBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
       *
       * <pre>
       * serialized DeviceExperimentIds; the experiment ids are propagated
       *  to GWSLog experiment ids
       * </pre>
       */
      public boolean hasExperimentIds() {
        return ((bitField0_ & 0x00010000) == 0x00010000);
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
       *
       * <pre>
       * serialized DeviceExperimentIds; the experiment ids are propagated
       *  to GWSLog experiment ids
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds getExperimentIds() {
        if (experimentIdsBuilder_ == null) {
          return experimentIds_;
        } else {
          return experimentIdsBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
       *
       * <pre>
       * serialized DeviceExperimentIds; the experiment ids are propagated
       *  to GWSLog experiment ids
       * </pre>
       */
      public Builder setExperimentIds(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds value) {
        if (experimentIdsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          experimentIds_ = value;
          onChanged();
        } else {
          experimentIdsBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00010000;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
       *
       * <pre>
       * serialized DeviceExperimentIds; the experiment ids are propagated
       *  to GWSLog experiment ids
       * </pre>
       */
      public Builder setExperimentIds(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.Builder builderForValue) {
        if (experimentIdsBuilder_ == null) {
          experimentIds_ = builderForValue.build();
          onChanged();
        } else {
          experimentIdsBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00010000;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
       *
       * <pre>
       * serialized DeviceExperimentIds; the experiment ids are propagated
       *  to GWSLog experiment ids
       * </pre>
       */
      public Builder mergeExperimentIds(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds value) {
        if (experimentIdsBuilder_ == null) {
          if (((bitField0_ & 0x00010000) == 0x00010000) &&
              experimentIds_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.getDefaultInstance()) {
            experimentIds_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.newBuilder(experimentIds_).mergeFrom(value).buildPartial();
          } else {
            experimentIds_ = value;
          }
          onChanged();
        } else {
          experimentIdsBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00010000;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
       *
       * <pre>
       * serialized DeviceExperimentIds; the experiment ids are propagated
       *  to GWSLog experiment ids
       * </pre>
       */
      public Builder clearExperimentIds() {
        if (experimentIdsBuilder_ == null) {
          experimentIds_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.getDefaultInstance();
          onChanged();
        } else {
          experimentIdsBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00010000);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
       *
       * <pre>
       * serialized DeviceExperimentIds; the experiment ids are propagated
       *  to GWSLog experiment ids
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.Builder getExperimentIdsBuilder() {
        bitField0_ |= 0x00010000;
        onChanged();
        return getExperimentIdsFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
       *
       * <pre>
       * serialized DeviceExperimentIds; the experiment ids are propagated
       *  to GWSLog experiment ids
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdsOrBuilder getExperimentIdsOrBuilder() {
        if (experimentIdsBuilder_ != null) {
          return experimentIdsBuilder_.getMessageOrBuilder();
        } else {
          return experimentIds_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIds experiment_ids = 16;</code>
       *
       * <pre>
       * serialized DeviceExperimentIds; the experiment ids are propagated
       *  to GWSLog experiment ids
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdsOrBuilder> 
          getExperimentIdsFieldBuilder() {
        if (experimentIdsBuilder_ == null) {
          experimentIdsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdsOrBuilder>(
                  experimentIds_,
                  getParentForChildren(),
                  isClean());
          experimentIds_ = null;
        }
        return experimentIdsBuilder_;
      }

      // optional bytes client_ve = 18;
      private com.google.protobuf.ByteString clientVe_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>optional bytes client_ve = 18;</code>
       *
       * <pre>
       * Serialized proto message of ClientVisualElementsProto as defined in
       *  logs/proto/visual_element/client_visual_elements.proto. The client can
       *  optionally send a log event with this field set. In this case, clearcut
       *  server needs to deserialize the bytes as a ClientVisualElementsProto and
       *  sets appropriate fields in the output GWSLogEntryProto.
       *
       *  See http://go/NativeVeLogging for more information.
       * </pre>
       */
      public boolean hasClientVe() {
        return ((bitField0_ & 0x00020000) == 0x00020000);
      }
      /**
       * <code>optional bytes client_ve = 18;</code>
       *
       * <pre>
       * Serialized proto message of ClientVisualElementsProto as defined in
       *  logs/proto/visual_element/client_visual_elements.proto. The client can
       *  optionally send a log event with this field set. In this case, clearcut
       *  server needs to deserialize the bytes as a ClientVisualElementsProto and
       *  sets appropriate fields in the output GWSLogEntryProto.
       *
       *  See http://go/NativeVeLogging for more information.
       * </pre>
       */
      public com.google.protobuf.ByteString getClientVe() {
        return clientVe_;
      }
      /**
       * <code>optional bytes client_ve = 18;</code>
       *
       * <pre>
       * Serialized proto message of ClientVisualElementsProto as defined in
       *  logs/proto/visual_element/client_visual_elements.proto. The client can
       *  optionally send a log event with this field set. In this case, clearcut
       *  server needs to deserialize the bytes as a ClientVisualElementsProto and
       *  sets appropriate fields in the output GWSLogEntryProto.
       *
       *  See http://go/NativeVeLogging for more information.
       * </pre>
       */
      public Builder setClientVe(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00020000;
        clientVe_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bytes client_ve = 18;</code>
       *
       * <pre>
       * Serialized proto message of ClientVisualElementsProto as defined in
       *  logs/proto/visual_element/client_visual_elements.proto. The client can
       *  optionally send a log event with this field set. In this case, clearcut
       *  server needs to deserialize the bytes as a ClientVisualElementsProto and
       *  sets appropriate fields in the output GWSLogEntryProto.
       *
       *  See http://go/NativeVeLogging for more information.
       * </pre>
       */
      public Builder clearClientVe() {
        bitField0_ = (bitField0_ & ~0x00020000);
        clientVe_ = getDefaultInstance().getClientVe();
        onChanged();
        return this;
      }

      // optional string client_ve_js = 24;
      private java.lang.Object clientVeJs_ = "";
      /**
       * <code>optional string client_ve_js = 24;</code>
       *
       * <pre>
       * Alternative serialized field for the client_ve field defined in 18.
       *  Serialize using array serialization format. More info at go/jspb.
       * </pre>
       */
      public boolean hasClientVeJs() {
        return ((bitField0_ & 0x00040000) == 0x00040000);
      }
      /**
       * <code>optional string client_ve_js = 24;</code>
       *
       * <pre>
       * Alternative serialized field for the client_ve field defined in 18.
       *  Serialize using array serialization format. More info at go/jspb.
       * </pre>
       */
      public java.lang.String getClientVeJs() {
        java.lang.Object ref = clientVeJs_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          clientVeJs_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string client_ve_js = 24;</code>
       *
       * <pre>
       * Alternative serialized field for the client_ve field defined in 18.
       *  Serialize using array serialization format. More info at go/jspb.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getClientVeJsBytes() {
        java.lang.Object ref = clientVeJs_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          clientVeJs_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string client_ve_js = 24;</code>
       *
       * <pre>
       * Alternative serialized field for the client_ve field defined in 18.
       *  Serialize using array serialization format. More info at go/jspb.
       * </pre>
       */
      public Builder setClientVeJs(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00040000;
        clientVeJs_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string client_ve_js = 24;</code>
       *
       * <pre>
       * Alternative serialized field for the client_ve field defined in 18.
       *  Serialize using array serialization format. More info at go/jspb.
       * </pre>
       */
      public Builder clearClientVeJs() {
        bitField0_ = (bitField0_ & ~0x00040000);
        clientVeJs_ = getDefaultInstance().getClientVeJs();
        onChanged();
        return this;
      }
      /**
       * <code>optional string client_ve_js = 24;</code>
       *
       * <pre>
       * Alternative serialized field for the client_ve field defined in 18.
       *  Serialize using array serialization format. More info at go/jspb.
       * </pre>
       */
      public Builder setClientVeJsBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00040000;
        clientVeJs_ = value;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent internalEvent_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent.NONE;
      /**
       * <code>optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;</code>
       */
      public boolean hasInternalEvent() {
        return ((bitField0_ & 0x00080000) == 0x00080000);
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent getInternalEvent() {
        return internalEvent_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;</code>
       */
      public Builder setInternalEvent(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00080000;
        internalEvent_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogEvent.InternalEvent internal_event = 19;</code>
       */
      public Builder clearInternalEvent() {
        bitField0_ = (bitField0_ & ~0x00080000);
        internalEvent_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.InternalEvent.NONE;
        onChanged();
        return this;
      }

      // repeated int32 test_code = 20;
      private java.util.List<java.lang.Integer> testCode_ = java.util.Collections.emptyList();
      private void ensureTestCodeIsMutable() {
        if (!((bitField0_ & 0x00100000) == 0x00100000)) {
          testCode_ = new java.util.ArrayList<java.lang.Integer>(testCode_);
          bitField0_ |= 0x00100000;
         }
      }
      /**
       * <code>repeated int32 test_code = 20;</code>
       *
       * <pre>
       * Indicates that an interesting thing has occurred. Used to narrow the set
       *  of samples to consider in analysis. Test codes are copied to
       *  GwsLogEntryProto.TestCode.
       *
       *  See google3/ads/base/test_codes/test_codes.proto
       *  for Ads' use of test codes.
       * </pre>
       */
      public java.util.List<java.lang.Integer>
          getTestCodeList() {
        return java.util.Collections.unmodifiableList(testCode_);
      }
      /**
       * <code>repeated int32 test_code = 20;</code>
       *
       * <pre>
       * Indicates that an interesting thing has occurred. Used to narrow the set
       *  of samples to consider in analysis. Test codes are copied to
       *  GwsLogEntryProto.TestCode.
       *
       *  See google3/ads/base/test_codes/test_codes.proto
       *  for Ads' use of test codes.
       * </pre>
       */
      public int getTestCodeCount() {
        return testCode_.size();
      }
      /**
       * <code>repeated int32 test_code = 20;</code>
       *
       * <pre>
       * Indicates that an interesting thing has occurred. Used to narrow the set
       *  of samples to consider in analysis. Test codes are copied to
       *  GwsLogEntryProto.TestCode.
       *
       *  See google3/ads/base/test_codes/test_codes.proto
       *  for Ads' use of test codes.
       * </pre>
       */
      public int getTestCode(int index) {
        return testCode_.get(index);
      }
      /**
       * <code>repeated int32 test_code = 20;</code>
       *
       * <pre>
       * Indicates that an interesting thing has occurred. Used to narrow the set
       *  of samples to consider in analysis. Test codes are copied to
       *  GwsLogEntryProto.TestCode.
       *
       *  See google3/ads/base/test_codes/test_codes.proto
       *  for Ads' use of test codes.
       * </pre>
       */
      public Builder setTestCode(
          int index, int value) {
        ensureTestCodeIsMutable();
        testCode_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 test_code = 20;</code>
       *
       * <pre>
       * Indicates that an interesting thing has occurred. Used to narrow the set
       *  of samples to consider in analysis. Test codes are copied to
       *  GwsLogEntryProto.TestCode.
       *
       *  See google3/ads/base/test_codes/test_codes.proto
       *  for Ads' use of test codes.
       * </pre>
       */
      public Builder addTestCode(int value) {
        ensureTestCodeIsMutable();
        testCode_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 test_code = 20;</code>
       *
       * <pre>
       * Indicates that an interesting thing has occurred. Used to narrow the set
       *  of samples to consider in analysis. Test codes are copied to
       *  GwsLogEntryProto.TestCode.
       *
       *  See google3/ads/base/test_codes/test_codes.proto
       *  for Ads' use of test codes.
       * </pre>
       */
      public Builder addAllTestCode(
          java.lang.Iterable<? extends java.lang.Integer> values) {
        ensureTestCodeIsMutable();
        super.addAll(values, testCode_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated int32 test_code = 20;</code>
       *
       * <pre>
       * Indicates that an interesting thing has occurred. Used to narrow the set
       *  of samples to consider in analysis. Test codes are copied to
       *  GwsLogEntryProto.TestCode.
       *
       *  See google3/ads/base/test_codes/test_codes.proto
       *  for Ads' use of test codes.
       * </pre>
       */
      public Builder clearTestCode() {
        testCode_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00100000);
        onChanged();
        return this;
      }

      // optional int64 boot_count = 22;
      private long bootCount_ ;
      /**
       * <code>optional int64 boot_count = 22;</code>
       *
       * <pre>
       * Number of times the device is known to have booted. Taken together,
       *  {boot-count, uptime} pairs are a monotonically increasing counter which
       *  can be used to order events accross log sources.
       * </pre>
       */
      public boolean hasBootCount() {
        return ((bitField0_ & 0x00200000) == 0x00200000);
      }
      /**
       * <code>optional int64 boot_count = 22;</code>
       *
       * <pre>
       * Number of times the device is known to have booted. Taken together,
       *  {boot-count, uptime} pairs are a monotonically increasing counter which
       *  can be used to order events accross log sources.
       * </pre>
       */
      public long getBootCount() {
        return bootCount_;
      }
      /**
       * <code>optional int64 boot_count = 22;</code>
       *
       * <pre>
       * Number of times the device is known to have booted. Taken together,
       *  {boot-count, uptime} pairs are a monotonically increasing counter which
       *  can be used to order events accross log sources.
       * </pre>
       */
      public Builder setBootCount(long value) {
        bitField0_ |= 0x00200000;
        bootCount_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 boot_count = 22;</code>
       *
       * <pre>
       * Number of times the device is known to have booted. Taken together,
       *  {boot-count, uptime} pairs are a monotonically increasing counter which
       *  can be used to order events accross log sources.
       * </pre>
       */
      public Builder clearBootCount() {
        bitField0_ = (bitField0_ & ~0x00200000);
        bootCount_ = 0L;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo networkConnectionInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfoOrBuilder> networkConnectionInfoBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
       *
       * <pre>
       * The current network connectivity info when the event was logged in the
       *  client
       * </pre>
       */
      public boolean hasNetworkConnectionInfo() {
        return ((bitField0_ & 0x00400000) == 0x00400000);
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
       *
       * <pre>
       * The current network connectivity info when the event was logged in the
       *  client
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo getNetworkConnectionInfo() {
        if (networkConnectionInfoBuilder_ == null) {
          return networkConnectionInfo_;
        } else {
          return networkConnectionInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
       *
       * <pre>
       * The current network connectivity info when the event was logged in the
       *  client
       * </pre>
       */
      public Builder setNetworkConnectionInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo value) {
        if (networkConnectionInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          networkConnectionInfo_ = value;
          onChanged();
        } else {
          networkConnectionInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00400000;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
       *
       * <pre>
       * The current network connectivity info when the event was logged in the
       *  client
       * </pre>
       */
      public Builder setNetworkConnectionInfo(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.Builder builderForValue) {
        if (networkConnectionInfoBuilder_ == null) {
          networkConnectionInfo_ = builderForValue.build();
          onChanged();
        } else {
          networkConnectionInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00400000;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
       *
       * <pre>
       * The current network connectivity info when the event was logged in the
       *  client
       * </pre>
       */
      public Builder mergeNetworkConnectionInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo value) {
        if (networkConnectionInfoBuilder_ == null) {
          if (((bitField0_ & 0x00400000) == 0x00400000) &&
              networkConnectionInfo_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.getDefaultInstance()) {
            networkConnectionInfo_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.newBuilder(networkConnectionInfo_).mergeFrom(value).buildPartial();
          } else {
            networkConnectionInfo_ = value;
          }
          onChanged();
        } else {
          networkConnectionInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00400000;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
       *
       * <pre>
       * The current network connectivity info when the event was logged in the
       *  client
       * </pre>
       */
      public Builder clearNetworkConnectionInfo() {
        if (networkConnectionInfoBuilder_ == null) {
          networkConnectionInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.getDefaultInstance();
          onChanged();
        } else {
          networkConnectionInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00400000);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
       *
       * <pre>
       * The current network connectivity info when the event was logged in the
       *  client
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.Builder getNetworkConnectionInfoBuilder() {
        bitField0_ |= 0x00400000;
        onChanged();
        return getNetworkConnectionInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
       *
       * <pre>
       * The current network connectivity info when the event was logged in the
       *  client
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfoOrBuilder getNetworkConnectionInfoOrBuilder() {
        if (networkConnectionInfoBuilder_ != null) {
          return networkConnectionInfoBuilder_.getMessageOrBuilder();
        } else {
          return networkConnectionInfo_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo network_connection_info = 23;</code>
       *
       * <pre>
       * The current network connectivity info when the event was logged in the
       *  client
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfoOrBuilder> 
          getNetworkConnectionInfoFieldBuilder() {
        if (networkConnectionInfoBuilder_ == null) {
          networkConnectionInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfoOrBuilder>(
                  networkConnectionInfo_,
                  getParentForChildren(),
                  isClean());
          networkConnectionInfo_ = null;
        }
        return networkConnectionInfoBuilder_;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.LogEvent)
    }

    static {
      defaultInstance = new LogEvent(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.LogEvent)
  }

  public interface NetworkConnectionInfoOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];
    /**
     * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];</code>
     *
     * <pre>
     * The current network connectivity type when the event was logged in the
     *  client
     * </pre>
     */
    boolean hasNetworkType();
    /**
     * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];</code>
     *
     * <pre>
     * The current network connectivity type when the event was logged in the
     *  client
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType getNetworkType();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.NetworkConnectionInfo}
   *
   * <pre>
   * To describe the network connectivity of the client.
   *  Next tag: 2
   * </pre>
   */
  public static final class NetworkConnectionInfo extends
      com.google.protobuf.GeneratedMessage
      implements NetworkConnectionInfoOrBuilder {
    // Use NetworkConnectionInfo.newBuilder() to construct.
    private NetworkConnectionInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private NetworkConnectionInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final NetworkConnectionInfo defaultInstance;
    public static NetworkConnectionInfo getDefaultInstance() {
      return defaultInstance;
    }

    public NetworkConnectionInfo getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private NetworkConnectionInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(1, rawValue);
              } else {
                bitField0_ |= 0x00000001;
                networkType_ = value;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_NetworkConnectionInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_NetworkConnectionInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.Builder.class);
    }

    public static com.google.protobuf.Parser<NetworkConnectionInfo> PARSER =
        new com.google.protobuf.AbstractParser<NetworkConnectionInfo>() {
      public NetworkConnectionInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new NetworkConnectionInfo(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<NetworkConnectionInfo> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.NetworkConnectionInfo.NetworkType}
     *
     * <pre>
     * From android/frameworks/base/core/java/android/net/ConnectivityManager.java
     *  Note: data will only be recorded for internet connections. This means
     *  BLUETOOTH corresponds to when bluetooth was used for reverse tethering
     *  (i.e. using a computer's internet connection on the phone) and NOT for
     *  general device pairing via bluetooth, such as clockwork.
     * </pre>
     */
    public enum NetworkType
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>NONE = -1;</code>
       */
      NONE(0, -1),
      /**
       * <code>MOBILE = 0;</code>
       */
      MOBILE(1, 0),
      /**
       * <code>WIFI = 1;</code>
       */
      WIFI(2, 1),
      /**
       * <code>MOBILE_MMS = 2;</code>
       */
      MOBILE_MMS(3, 2),
      /**
       * <code>MOBILE_SUPL = 3;</code>
       */
      MOBILE_SUPL(4, 3),
      /**
       * <code>MOBILE_DUN = 4;</code>
       */
      MOBILE_DUN(5, 4),
      /**
       * <code>MOBILE_HIPRI = 5;</code>
       */
      MOBILE_HIPRI(6, 5),
      /**
       * <code>WIMAX = 6;</code>
       */
      WIMAX(7, 6),
      /**
       * <code>BLUETOOTH = 7;</code>
       */
      BLUETOOTH(8, 7),
      /**
       * <code>DUMMY = 8;</code>
       */
      DUMMY(9, 8),
      /**
       * <code>ETHERNET = 9;</code>
       */
      ETHERNET(10, 9),
      /**
       * <code>MOBILE_FOTA = 10;</code>
       */
      MOBILE_FOTA(11, 10),
      /**
       * <code>MOBILE_IMS = 11;</code>
       */
      MOBILE_IMS(12, 11),
      /**
       * <code>MOBILE_CBS = 12;</code>
       */
      MOBILE_CBS(13, 12),
      /**
       * <code>WIFI_P2P = 13;</code>
       */
      WIFI_P2P(14, 13),
      /**
       * <code>MOBILE_IA = 14;</code>
       */
      MOBILE_IA(15, 14),
      /**
       * <code>MOBILE_EMERGENCY = 15;</code>
       */
      MOBILE_EMERGENCY(16, 15),
      /**
       * <code>PROXY = 16;</code>
       */
      PROXY(17, 16),
      /**
       * <code>VPN = 17;</code>
       */
      VPN(18, 17),
      ;

      /**
       * <code>NONE = -1;</code>
       */
      public static final int NONE_VALUE = -1;
      /**
       * <code>MOBILE = 0;</code>
       */
      public static final int MOBILE_VALUE = 0;
      /**
       * <code>WIFI = 1;</code>
       */
      public static final int WIFI_VALUE = 1;
      /**
       * <code>MOBILE_MMS = 2;</code>
       */
      public static final int MOBILE_MMS_VALUE = 2;
      /**
       * <code>MOBILE_SUPL = 3;</code>
       */
      public static final int MOBILE_SUPL_VALUE = 3;
      /**
       * <code>MOBILE_DUN = 4;</code>
       */
      public static final int MOBILE_DUN_VALUE = 4;
      /**
       * <code>MOBILE_HIPRI = 5;</code>
       */
      public static final int MOBILE_HIPRI_VALUE = 5;
      /**
       * <code>WIMAX = 6;</code>
       */
      public static final int WIMAX_VALUE = 6;
      /**
       * <code>BLUETOOTH = 7;</code>
       */
      public static final int BLUETOOTH_VALUE = 7;
      /**
       * <code>DUMMY = 8;</code>
       */
      public static final int DUMMY_VALUE = 8;
      /**
       * <code>ETHERNET = 9;</code>
       */
      public static final int ETHERNET_VALUE = 9;
      /**
       * <code>MOBILE_FOTA = 10;</code>
       */
      public static final int MOBILE_FOTA_VALUE = 10;
      /**
       * <code>MOBILE_IMS = 11;</code>
       */
      public static final int MOBILE_IMS_VALUE = 11;
      /**
       * <code>MOBILE_CBS = 12;</code>
       */
      public static final int MOBILE_CBS_VALUE = 12;
      /**
       * <code>WIFI_P2P = 13;</code>
       */
      public static final int WIFI_P2P_VALUE = 13;
      /**
       * <code>MOBILE_IA = 14;</code>
       */
      public static final int MOBILE_IA_VALUE = 14;
      /**
       * <code>MOBILE_EMERGENCY = 15;</code>
       */
      public static final int MOBILE_EMERGENCY_VALUE = 15;
      /**
       * <code>PROXY = 16;</code>
       */
      public static final int PROXY_VALUE = 16;
      /**
       * <code>VPN = 17;</code>
       */
      public static final int VPN_VALUE = 17;


      public final int getNumber() { return value; }

      public static NetworkType valueOf(int value) {
        switch (value) {
          case -1: return NONE;
          case 0: return MOBILE;
          case 1: return WIFI;
          case 2: return MOBILE_MMS;
          case 3: return MOBILE_SUPL;
          case 4: return MOBILE_DUN;
          case 5: return MOBILE_HIPRI;
          case 6: return WIMAX;
          case 7: return BLUETOOTH;
          case 8: return DUMMY;
          case 9: return ETHERNET;
          case 10: return MOBILE_FOTA;
          case 11: return MOBILE_IMS;
          case 12: return MOBILE_CBS;
          case 13: return WIFI_P2P;
          case 14: return MOBILE_IA;
          case 15: return MOBILE_EMERGENCY;
          case 16: return PROXY;
          case 17: return VPN;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<NetworkType>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<NetworkType>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<NetworkType>() {
              public NetworkType findValueByNumber(int number) {
                return NetworkType.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.getDescriptor().getEnumTypes().get(0);
      }

      private static final NetworkType[] VALUES = values();

      public static NetworkType valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private NetworkType(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.NetworkConnectionInfo.NetworkType)
    }

    private int bitField0_;
    // optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];
    public static final int NETWORK_TYPE_FIELD_NUMBER = 1;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType networkType_;
    /**
     * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];</code>
     *
     * <pre>
     * The current network connectivity type when the event was logged in the
     *  client
     * </pre>
     */
    public boolean hasNetworkType() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];</code>
     *
     * <pre>
     * The current network connectivity type when the event was logged in the
     *  client
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType getNetworkType() {
      return networkType_;
    }

    private void initFields() {
      networkType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType.NONE;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeEnum(1, networkType_.getNumber());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(1, networkType_.getNumber());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.NetworkConnectionInfo}
     *
     * <pre>
     * To describe the network connectivity of the client.
     *  Next tag: 2
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_NetworkConnectionInfo_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_NetworkConnectionInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        networkType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType.NONE;
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_NetworkConnectionInfo_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.networkType_ = networkType_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.getDefaultInstance()) return this;
        if (other.hasNetworkType()) {
          setNetworkType(other.getNetworkType());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType networkType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType.NONE;
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];</code>
       *
       * <pre>
       * The current network connectivity type when the event was logged in the
       *  client
       * </pre>
       */
      public boolean hasNetworkType() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];</code>
       *
       * <pre>
       * The current network connectivity type when the event was logged in the
       *  client
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType getNetworkType() {
        return networkType_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];</code>
       *
       * <pre>
       * The current network connectivity type when the event was logged in the
       *  client
       * </pre>
       */
      public Builder setNetworkType(com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000001;
        networkType_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.NetworkConnectionInfo.NetworkType network_type = 1 [default = NONE];</code>
       *
       * <pre>
       * The current network connectivity type when the event was logged in the
       *  client
       * </pre>
       */
      public Builder clearNetworkType() {
        bitField0_ = (bitField0_ & ~0x00000001);
        networkType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.NetworkConnectionInfo.NetworkType.NONE;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.NetworkConnectionInfo)
    }

    static {
      defaultInstance = new NetworkConnectionInfo(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.NetworkConnectionInfo)
  }

  public interface ExperimentIdsOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional bytes clear_blob = 1;
    /**
     * <code>optional bytes clear_blob = 1;</code>
     *
     * <pre>
     * The client selected experiment ids in the clear (e.g. from Chrome).
     *  serialized experiments.heterodyne.DeviceExperimentIds
     * </pre>
     */
    boolean hasClearBlob();
    /**
     * <code>optional bytes clear_blob = 1;</code>
     *
     * <pre>
     * The client selected experiment ids in the clear (e.g. from Chrome).
     *  serialized experiments.heterodyne.DeviceExperimentIds
     * </pre>
     */
    com.google.protobuf.ByteString getClearBlob();

    // optional string clear_blob_js = 4;
    /**
     * <code>optional string clear_blob_js = 4;</code>
     *
     * <pre>
     * A jspb version of clear_blob, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    boolean hasClearBlobJs();
    /**
     * <code>optional string clear_blob_js = 4;</code>
     *
     * <pre>
     * A jspb version of clear_blob, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    java.lang.String getClearBlobJs();
    /**
     * <code>optional string clear_blob_js = 4;</code>
     *
     * <pre>
     * A jspb version of clear_blob, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    com.google.protobuf.ByteString
        getClearBlobJsBytes();

    // repeated bytes encrypted_blob = 2;
    /**
     * <code>repeated bytes encrypted_blob = 2;</code>
     *
     * <pre>
     * encrypted serialized experiments.heterodyne.DeviceExperimentIds
     * </pre>
     */
    java.util.List<com.google.protobuf.ByteString> getEncryptedBlobList();
    /**
     * <code>repeated bytes encrypted_blob = 2;</code>
     *
     * <pre>
     * encrypted serialized experiments.heterodyne.DeviceExperimentIds
     * </pre>
     */
    int getEncryptedBlobCount();
    /**
     * <code>repeated bytes encrypted_blob = 2;</code>
     *
     * <pre>
     * encrypted serialized experiments.heterodyne.DeviceExperimentIds
     * </pre>
     */
    com.google.protobuf.ByteString getEncryptedBlob(int index);

    // optional bool users_match = 3;
    /**
     * <code>optional bool users_match = 3;</code>
     *
     * <pre>
     * indicates whether the Phenotype committed user matches the upload account
     * </pre>
     */
    boolean hasUsersMatch();
    /**
     * <code>optional bool users_match = 3;</code>
     *
     * <pre>
     * indicates whether the Phenotype committed user matches the upload account
     * </pre>
     */
    boolean getUsersMatch();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.ExperimentIds}
   *
   * <pre>
   * The experiment ids, both in the clear and encrypted.
   * </pre>
   */
  public static final class ExperimentIds extends
      com.google.protobuf.GeneratedMessage
      implements ExperimentIdsOrBuilder {
    // Use ExperimentIds.newBuilder() to construct.
    private ExperimentIds(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private ExperimentIds(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final ExperimentIds defaultInstance;
    public static ExperimentIds getDefaultInstance() {
      return defaultInstance;
    }

    public ExperimentIds getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private ExperimentIds(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              bitField0_ |= 0x00000001;
              clearBlob_ = input.readBytes();
              break;
            }
            case 18: {
              if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
                encryptedBlob_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
                mutable_bitField0_ |= 0x00000004;
              }
              encryptedBlob_.add(input.readBytes());
              break;
            }
            case 24: {
              bitField0_ |= 0x00000004;
              usersMatch_ = input.readBool();
              break;
            }
            case 34: {
              bitField0_ |= 0x00000002;
              clearBlobJs_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
          encryptedBlob_ = java.util.Collections.unmodifiableList(encryptedBlob_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExperimentIds_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExperimentIds_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.Builder.class);
    }

    public static com.google.protobuf.Parser<ExperimentIds> PARSER =
        new com.google.protobuf.AbstractParser<ExperimentIds>() {
      public ExperimentIds parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new ExperimentIds(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<ExperimentIds> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // optional bytes clear_blob = 1;
    public static final int CLEAR_BLOB_FIELD_NUMBER = 1;
    private com.google.protobuf.ByteString clearBlob_;
    /**
     * <code>optional bytes clear_blob = 1;</code>
     *
     * <pre>
     * The client selected experiment ids in the clear (e.g. from Chrome).
     *  serialized experiments.heterodyne.DeviceExperimentIds
     * </pre>
     */
    public boolean hasClearBlob() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional bytes clear_blob = 1;</code>
     *
     * <pre>
     * The client selected experiment ids in the clear (e.g. from Chrome).
     *  serialized experiments.heterodyne.DeviceExperimentIds
     * </pre>
     */
    public com.google.protobuf.ByteString getClearBlob() {
      return clearBlob_;
    }

    // optional string clear_blob_js = 4;
    public static final int CLEAR_BLOB_JS_FIELD_NUMBER = 4;
    private java.lang.Object clearBlobJs_;
    /**
     * <code>optional string clear_blob_js = 4;</code>
     *
     * <pre>
     * A jspb version of clear_blob, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    public boolean hasClearBlobJs() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string clear_blob_js = 4;</code>
     *
     * <pre>
     * A jspb version of clear_blob, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    public java.lang.String getClearBlobJs() {
      java.lang.Object ref = clearBlobJs_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          clearBlobJs_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string clear_blob_js = 4;</code>
     *
     * <pre>
     * A jspb version of clear_blob, using array serialization format.
     *  More info on JSPB at go/jspb.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getClearBlobJsBytes() {
      java.lang.Object ref = clearBlobJs_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        clearBlobJs_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // repeated bytes encrypted_blob = 2;
    public static final int ENCRYPTED_BLOB_FIELD_NUMBER = 2;
    private java.util.List<com.google.protobuf.ByteString> encryptedBlob_;
    /**
     * <code>repeated bytes encrypted_blob = 2;</code>
     *
     * <pre>
     * encrypted serialized experiments.heterodyne.DeviceExperimentIds
     * </pre>
     */
    public java.util.List<com.google.protobuf.ByteString>
        getEncryptedBlobList() {
      return encryptedBlob_;
    }
    /**
     * <code>repeated bytes encrypted_blob = 2;</code>
     *
     * <pre>
     * encrypted serialized experiments.heterodyne.DeviceExperimentIds
     * </pre>
     */
    public int getEncryptedBlobCount() {
      return encryptedBlob_.size();
    }
    /**
     * <code>repeated bytes encrypted_blob = 2;</code>
     *
     * <pre>
     * encrypted serialized experiments.heterodyne.DeviceExperimentIds
     * </pre>
     */
    public com.google.protobuf.ByteString getEncryptedBlob(int index) {
      return encryptedBlob_.get(index);
    }

    // optional bool users_match = 3;
    public static final int USERS_MATCH_FIELD_NUMBER = 3;
    private boolean usersMatch_;
    /**
     * <code>optional bool users_match = 3;</code>
     *
     * <pre>
     * indicates whether the Phenotype committed user matches the upload account
     * </pre>
     */
    public boolean hasUsersMatch() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional bool users_match = 3;</code>
     *
     * <pre>
     * indicates whether the Phenotype committed user matches the upload account
     * </pre>
     */
    public boolean getUsersMatch() {
      return usersMatch_;
    }

    private void initFields() {
      clearBlob_ = com.google.protobuf.ByteString.EMPTY;
      clearBlobJs_ = "";
      encryptedBlob_ = java.util.Collections.emptyList();
      usersMatch_ = false;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBytes(1, clearBlob_);
      }
      for (int i = 0; i < encryptedBlob_.size(); i++) {
        output.writeBytes(2, encryptedBlob_.get(i));
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBool(3, usersMatch_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(4, getClearBlobJsBytes());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(1, clearBlob_);
      }
      {
        int dataSize = 0;
        for (int i = 0; i < encryptedBlob_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeBytesSizeNoTag(encryptedBlob_.get(i));
        }
        size += dataSize;
        size += 1 * getEncryptedBlobList().size();
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(3, usersMatch_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, getClearBlobJsBytes());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.ExperimentIds}
     *
     * <pre>
     * The experiment ids, both in the clear and encrypted.
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdsOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExperimentIds_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExperimentIds_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        clearBlob_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        clearBlobJs_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        encryptedBlob_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000004);
        usersMatch_ = false;
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExperimentIds_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.clearBlob_ = clearBlob_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.clearBlobJs_ = clearBlobJs_;
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          encryptedBlob_ = java.util.Collections.unmodifiableList(encryptedBlob_);
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.encryptedBlob_ = encryptedBlob_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000004;
        }
        result.usersMatch_ = usersMatch_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds.getDefaultInstance()) return this;
        if (other.hasClearBlob()) {
          setClearBlob(other.getClearBlob());
        }
        if (other.hasClearBlobJs()) {
          bitField0_ |= 0x00000002;
          clearBlobJs_ = other.clearBlobJs_;
          onChanged();
        }
        if (!other.encryptedBlob_.isEmpty()) {
          if (encryptedBlob_.isEmpty()) {
            encryptedBlob_ = other.encryptedBlob_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureEncryptedBlobIsMutable();
            encryptedBlob_.addAll(other.encryptedBlob_);
          }
          onChanged();
        }
        if (other.hasUsersMatch()) {
          setUsersMatch(other.getUsersMatch());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIds) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional bytes clear_blob = 1;
      private com.google.protobuf.ByteString clearBlob_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>optional bytes clear_blob = 1;</code>
       *
       * <pre>
       * The client selected experiment ids in the clear (e.g. from Chrome).
       *  serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public boolean hasClearBlob() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional bytes clear_blob = 1;</code>
       *
       * <pre>
       * The client selected experiment ids in the clear (e.g. from Chrome).
       *  serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public com.google.protobuf.ByteString getClearBlob() {
        return clearBlob_;
      }
      /**
       * <code>optional bytes clear_blob = 1;</code>
       *
       * <pre>
       * The client selected experiment ids in the clear (e.g. from Chrome).
       *  serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public Builder setClearBlob(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        clearBlob_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bytes clear_blob = 1;</code>
       *
       * <pre>
       * The client selected experiment ids in the clear (e.g. from Chrome).
       *  serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public Builder clearClearBlob() {
        bitField0_ = (bitField0_ & ~0x00000001);
        clearBlob_ = getDefaultInstance().getClearBlob();
        onChanged();
        return this;
      }

      // optional string clear_blob_js = 4;
      private java.lang.Object clearBlobJs_ = "";
      /**
       * <code>optional string clear_blob_js = 4;</code>
       *
       * <pre>
       * A jspb version of clear_blob, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public boolean hasClearBlobJs() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string clear_blob_js = 4;</code>
       *
       * <pre>
       * A jspb version of clear_blob, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public java.lang.String getClearBlobJs() {
        java.lang.Object ref = clearBlobJs_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          clearBlobJs_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string clear_blob_js = 4;</code>
       *
       * <pre>
       * A jspb version of clear_blob, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getClearBlobJsBytes() {
        java.lang.Object ref = clearBlobJs_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          clearBlobJs_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string clear_blob_js = 4;</code>
       *
       * <pre>
       * A jspb version of clear_blob, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public Builder setClearBlobJs(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        clearBlobJs_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string clear_blob_js = 4;</code>
       *
       * <pre>
       * A jspb version of clear_blob, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public Builder clearClearBlobJs() {
        bitField0_ = (bitField0_ & ~0x00000002);
        clearBlobJs_ = getDefaultInstance().getClearBlobJs();
        onChanged();
        return this;
      }
      /**
       * <code>optional string clear_blob_js = 4;</code>
       *
       * <pre>
       * A jspb version of clear_blob, using array serialization format.
       *  More info on JSPB at go/jspb.
       * </pre>
       */
      public Builder setClearBlobJsBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        clearBlobJs_ = value;
        onChanged();
        return this;
      }

      // repeated bytes encrypted_blob = 2;
      private java.util.List<com.google.protobuf.ByteString> encryptedBlob_ = java.util.Collections.emptyList();
      private void ensureEncryptedBlobIsMutable() {
        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
          encryptedBlob_ = new java.util.ArrayList<com.google.protobuf.ByteString>(encryptedBlob_);
          bitField0_ |= 0x00000004;
         }
      }
      /**
       * <code>repeated bytes encrypted_blob = 2;</code>
       *
       * <pre>
       * encrypted serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public java.util.List<com.google.protobuf.ByteString>
          getEncryptedBlobList() {
        return java.util.Collections.unmodifiableList(encryptedBlob_);
      }
      /**
       * <code>repeated bytes encrypted_blob = 2;</code>
       *
       * <pre>
       * encrypted serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public int getEncryptedBlobCount() {
        return encryptedBlob_.size();
      }
      /**
       * <code>repeated bytes encrypted_blob = 2;</code>
       *
       * <pre>
       * encrypted serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public com.google.protobuf.ByteString getEncryptedBlob(int index) {
        return encryptedBlob_.get(index);
      }
      /**
       * <code>repeated bytes encrypted_blob = 2;</code>
       *
       * <pre>
       * encrypted serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public Builder setEncryptedBlob(
          int index, com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureEncryptedBlobIsMutable();
        encryptedBlob_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated bytes encrypted_blob = 2;</code>
       *
       * <pre>
       * encrypted serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public Builder addEncryptedBlob(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureEncryptedBlobIsMutable();
        encryptedBlob_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated bytes encrypted_blob = 2;</code>
       *
       * <pre>
       * encrypted serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public Builder addAllEncryptedBlob(
          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
        ensureEncryptedBlobIsMutable();
        super.addAll(values, encryptedBlob_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated bytes encrypted_blob = 2;</code>
       *
       * <pre>
       * encrypted serialized experiments.heterodyne.DeviceExperimentIds
       * </pre>
       */
      public Builder clearEncryptedBlob() {
        encryptedBlob_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
        return this;
      }

      // optional bool users_match = 3;
      private boolean usersMatch_ ;
      /**
       * <code>optional bool users_match = 3;</code>
       *
       * <pre>
       * indicates whether the Phenotype committed user matches the upload account
       * </pre>
       */
      public boolean hasUsersMatch() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional bool users_match = 3;</code>
       *
       * <pre>
       * indicates whether the Phenotype committed user matches the upload account
       * </pre>
       */
      public boolean getUsersMatch() {
        return usersMatch_;
      }
      /**
       * <code>optional bool users_match = 3;</code>
       *
       * <pre>
       * indicates whether the Phenotype committed user matches the upload account
       * </pre>
       */
      public Builder setUsersMatch(boolean value) {
        bitField0_ |= 0x00000008;
        usersMatch_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool users_match = 3;</code>
       *
       * <pre>
       * indicates whether the Phenotype committed user matches the upload account
       * </pre>
       */
      public Builder clearUsersMatch() {
        bitField0_ = (bitField0_ & ~0x00000008);
        usersMatch_ = false;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.ExperimentIds)
    }

    static {
      defaultInstance = new ExperimentIds(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.ExperimentIds)
  }

  public interface AndroidClientInfoOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional int64 android_id = 1;
    /**
     * <code>optional int64 android_id = 1;</code>
     *
     * <pre>
     * "Gservices" android ID.  Considered PII.  Never logged in archival logs.
     * </pre>
     */
    boolean hasAndroidId();
    /**
     * <code>optional int64 android_id = 1;</code>
     *
     * <pre>
     * "Gservices" android ID.  Considered PII.  Never logged in archival logs.
     * </pre>
     */
    long getAndroidId();

    // optional string logging_id = 2;
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    boolean hasLoggingId();
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    java.lang.String getLoggingId();
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    com.google.protobuf.ByteString
        getLoggingIdBytes();

    // optional int64 device_id = 18;
    /**
     * <code>optional int64 device_id = 18;</code>
     *
     * <pre>
     * Device ID referenced by android.provider.Settings.Secure.ANDROID_ID.
     *  Considered PII. Never logged in archival logs.
     * </pre>
     */
    boolean hasDeviceId();
    /**
     * <code>optional int64 device_id = 18;</code>
     *
     * <pre>
     * Device ID referenced by android.provider.Settings.Secure.ANDROID_ID.
     *  Considered PII. Never logged in archival logs.
     * </pre>
     */
    long getDeviceId();

    // optional int32 sdk_version = 3;
    /**
     * <code>optional int32 sdk_version = 3;</code>
     *
     * <pre>
     * This comes from android.os.Build.VERSION.SDK_INT.
     * </pre>
     */
    boolean hasSdkVersion();
    /**
     * <code>optional int32 sdk_version = 3;</code>
     *
     * <pre>
     * This comes from android.os.Build.VERSION.SDK_INT.
     * </pre>
     */
    int getSdkVersion();

    // optional string model = 4;
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Textual description of the client platform.  e.g., "Nexus 4".
     *  This comes from android.os.Build.MODEL.
     * </pre>
     */
    boolean hasModel();
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Textual description of the client platform.  e.g., "Nexus 4".
     *  This comes from android.os.Build.MODEL.
     * </pre>
     */
    java.lang.String getModel();
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Textual description of the client platform.  e.g., "Nexus 4".
     *  This comes from android.os.Build.MODEL.
     * </pre>
     */
    com.google.protobuf.ByteString
        getModelBytes();

    // optional string product = 5;
    /**
     * <code>optional string product = 5;</code>
     *
     * <pre>
     * The name of the overall product. e.g., "occam".
     *  This comes from android.os.Build.Product.
     * </pre>
     */
    boolean hasProduct();
    /**
     * <code>optional string product = 5;</code>
     *
     * <pre>
     * The name of the overall product. e.g., "occam".
     *  This comes from android.os.Build.Product.
     * </pre>
     */
    java.lang.String getProduct();
    /**
     * <code>optional string product = 5;</code>
     *
     * <pre>
     * The name of the overall product. e.g., "occam".
     *  This comes from android.os.Build.Product.
     * </pre>
     */
    com.google.protobuf.ByteString
        getProductBytes();

    // optional string hardware = 8;
    /**
     * <code>optional string hardware = 8;</code>
     *
     * <pre>
     * The name of the hardware (from the kernel command line or /proc).
     *  This comes from android.os.Build.Hardware.  e.g., "mako".
     * </pre>
     */
    boolean hasHardware();
    /**
     * <code>optional string hardware = 8;</code>
     *
     * <pre>
     * The name of the hardware (from the kernel command line or /proc).
     *  This comes from android.os.Build.Hardware.  e.g., "mako".
     * </pre>
     */
    java.lang.String getHardware();
    /**
     * <code>optional string hardware = 8;</code>
     *
     * <pre>
     * The name of the hardware (from the kernel command line or /proc).
     *  This comes from android.os.Build.Hardware.  e.g., "mako".
     * </pre>
     */
    com.google.protobuf.ByteString
        getHardwareBytes();

    // optional string device = 9;
    /**
     * <code>optional string device = 9;</code>
     *
     * <pre>
     * The name of the industrial design.  e.g., "mako".
     *  This comes from android.os.Build.Device.
     * </pre>
     */
    boolean hasDevice();
    /**
     * <code>optional string device = 9;</code>
     *
     * <pre>
     * The name of the industrial design.  e.g., "mako".
     *  This comes from android.os.Build.Device.
     * </pre>
     */
    java.lang.String getDevice();
    /**
     * <code>optional string device = 9;</code>
     *
     * <pre>
     * The name of the industrial design.  e.g., "mako".
     *  This comes from android.os.Build.Device.
     * </pre>
     */
    com.google.protobuf.ByteString
        getDeviceBytes();

    // optional string os_build = 6;
    /**
     * <code>optional string os_build = 6;</code>
     *
     * <pre>
     * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
     * </pre>
     */
    boolean hasOsBuild();
    /**
     * <code>optional string os_build = 6;</code>
     *
     * <pre>
     * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
     * </pre>
     */
    java.lang.String getOsBuild();
    /**
     * <code>optional string os_build = 6;</code>
     *
     * <pre>
     * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
     * </pre>
     */
    com.google.protobuf.ByteString
        getOsBuildBytes();

    // optional string application_build = 7;
    /**
     * <code>optional string application_build = 7;</code>
     *
     * <pre>
     * The client application version. The java int version in the android package
     *  converted to string.
     * </pre>
     */
    boolean hasApplicationBuild();
    /**
     * <code>optional string application_build = 7;</code>
     *
     * <pre>
     * The client application version. The java int version in the android package
     *  converted to string.
     * </pre>
     */
    java.lang.String getApplicationBuild();
    /**
     * <code>optional string application_build = 7;</code>
     *
     * <pre>
     * The client application version. The java int version in the android package
     *  converted to string.
     * </pre>
     */
    com.google.protobuf.ByteString
        getApplicationBuildBytes();

    // optional string mcc_mnc = 10;
    /**
     * <code>optional string mcc_mnc = 10;</code>
     *
     * <pre>
     * The mobile country code / mobile network code (MCC/MNC).
     *  e.g., 310004 for Verizon USA.
     * </pre>
     */
    boolean hasMccMnc();
    /**
     * <code>optional string mcc_mnc = 10;</code>
     *
     * <pre>
     * The mobile country code / mobile network code (MCC/MNC).
     *  e.g., 310004 for Verizon USA.
     * </pre>
     */
    java.lang.String getMccMnc();
    /**
     * <code>optional string mcc_mnc = 10;</code>
     *
     * <pre>
     * The mobile country code / mobile network code (MCC/MNC).
     *  e.g., 310004 for Verizon USA.
     * </pre>
     */
    com.google.protobuf.ByteString
        getMccMncBytes();

    // optional string locale = 11;
    /**
     * <code>optional string locale = 11;</code>
     *
     * <pre>
     * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
     * </pre>
     */
    boolean hasLocale();
    /**
     * <code>optional string locale = 11;</code>
     *
     * <pre>
     * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
     * </pre>
     */
    java.lang.String getLocale();
    /**
     * <code>optional string locale = 11;</code>
     *
     * <pre>
     * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
     * </pre>
     */
    com.google.protobuf.ByteString
        getLocaleBytes();

    // optional string country = 12;
    /**
     * <code>optional string country = 12;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    boolean hasCountry();
    /**
     * <code>optional string country = 12;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    java.lang.String getCountry();
    /**
     * <code>optional string country = 12;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    com.google.protobuf.ByteString
        getCountryBytes();

    // optional string manufacturer = 13;
    /**
     * <code>optional string manufacturer = 13;</code>
     *
     * <pre>
     * The manufacturer of the hardware.
     *  This comes from android.os.Build.MANUFACTURER
     * </pre>
     */
    boolean hasManufacturer();
    /**
     * <code>optional string manufacturer = 13;</code>
     *
     * <pre>
     * The manufacturer of the hardware.
     *  This comes from android.os.Build.MANUFACTURER
     * </pre>
     */
    java.lang.String getManufacturer();
    /**
     * <code>optional string manufacturer = 13;</code>
     *
     * <pre>
     * The manufacturer of the hardware.
     *  This comes from android.os.Build.MANUFACTURER
     * </pre>
     */
    com.google.protobuf.ByteString
        getManufacturerBytes();

    // optional string brand = 14;
    /**
     * <code>optional string brand = 14;</code>
     *
     * <pre>
     * The brand the software is customized for, if any.  Often a carrier name.
     *  e.g. "google"
     *  from http://developer.android.com/reference/android/os/Build.html#BRAND
     * </pre>
     */
    boolean hasBrand();
    /**
     * <code>optional string brand = 14;</code>
     *
     * <pre>
     * The brand the software is customized for, if any.  Often a carrier name.
     *  e.g. "google"
     *  from http://developer.android.com/reference/android/os/Build.html#BRAND
     * </pre>
     */
    java.lang.String getBrand();
    /**
     * <code>optional string brand = 14;</code>
     *
     * <pre>
     * The brand the software is customized for, if any.  Often a carrier name.
     *  e.g. "google"
     *  from http://developer.android.com/reference/android/os/Build.html#BRAND
     * </pre>
     */
    com.google.protobuf.ByteString
        getBrandBytes();

    // optional string board = 15;
    /**
     * <code>optional string board = 15;</code>
     *
     * <pre>
     * The name of the underlying board
     *  e.g. "tuna"
     *  from http://developer.android.com/reference/android/os/Build.html#BOARD
     * </pre>
     */
    boolean hasBoard();
    /**
     * <code>optional string board = 15;</code>
     *
     * <pre>
     * The name of the underlying board
     *  e.g. "tuna"
     *  from http://developer.android.com/reference/android/os/Build.html#BOARD
     * </pre>
     */
    java.lang.String getBoard();
    /**
     * <code>optional string board = 15;</code>
     *
     * <pre>
     * The name of the underlying board
     *  e.g. "tuna"
     *  from http://developer.android.com/reference/android/os/Build.html#BOARD
     * </pre>
     */
    com.google.protobuf.ByteString
        getBoardBytes();

    // optional string radio_version = 16;
    /**
     * <code>optional string radio_version = 16;</code>
     *
     * <pre>
     * Radio version as reported by device, if available at reporting time
     *  e.g. "I9250XXLJ1"
     *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
     * </pre>
     */
    boolean hasRadioVersion();
    /**
     * <code>optional string radio_version = 16;</code>
     *
     * <pre>
     * Radio version as reported by device, if available at reporting time
     *  e.g. "I9250XXLJ1"
     *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
     * </pre>
     */
    java.lang.String getRadioVersion();
    /**
     * <code>optional string radio_version = 16;</code>
     *
     * <pre>
     * Radio version as reported by device, if available at reporting time
     *  e.g. "I9250XXLJ1"
     *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
     * </pre>
     */
    com.google.protobuf.ByteString
        getRadioVersionBytes();

    // optional string fingerprint = 17;
    /**
     * <code>optional string fingerprint = 17;</code>
     *
     * <pre>
     * Device model/build fingerprint.
     *  This comes from android.os.Build.FINGERPRINT.
     * </pre>
     */
    boolean hasFingerprint();
    /**
     * <code>optional string fingerprint = 17;</code>
     *
     * <pre>
     * Device model/build fingerprint.
     *  This comes from android.os.Build.FINGERPRINT.
     * </pre>
     */
    java.lang.String getFingerprint();
    /**
     * <code>optional string fingerprint = 17;</code>
     *
     * <pre>
     * Device model/build fingerprint.
     *  This comes from android.os.Build.FINGERPRINT.
     * </pre>
     */
    com.google.protobuf.ByteString
        getFingerprintBytes();

    // optional int32 gms_core_version_code = 19;
    /**
     * <code>optional int32 gms_core_version_code = 19;</code>
     *
     * <pre>
     * android.content.pm.PackageInfo.versionCode of com.google.android.gms.
     *  e.g., 6031030
     * </pre>
     */
    boolean hasGmsCoreVersionCode();
    /**
     * <code>optional int32 gms_core_version_code = 19;</code>
     *
     * <pre>
     * android.content.pm.PackageInfo.versionCode of com.google.android.gms.
     *  e.g., 6031030
     * </pre>
     */
    int getGmsCoreVersionCode();

    // optional bool is_sidewinder_device = 20;
    /**
     * <code>optional bool is_sidewinder_device = 20;</code>
     *
     * <pre>
     * Whether the device is a Sidewinder device. See go/sidewinder-summary.
     * </pre>
     */
    boolean hasIsSidewinderDevice();
    /**
     * <code>optional bool is_sidewinder_device = 20;</code>
     *
     * <pre>
     * Whether the device is a Sidewinder device. See go/sidewinder-summary.
     * </pre>
     */
    boolean getIsSidewinderDevice();

    // optional bytes chimera_config_info = 21;
    /**
     * <code>optional bytes chimera_config_info = 21;</code>
     *
     * <pre>
     * The Chimera module config info describing the module sets on the device
     *  when the event is logged in the client.
     *  This is a proto of ChimeraConfigInfo residing in
     *  google3/logs/proto/wireless/android/play/playlog/chimera_modules.proto.
     * </pre>
     */
    boolean hasChimeraConfigInfo();
    /**
     * <code>optional bytes chimera_config_info = 21;</code>
     *
     * <pre>
     * The Chimera module config info describing the module sets on the device
     *  when the event is logged in the client.
     *  This is a proto of ChimeraConfigInfo residing in
     *  google3/logs/proto/wireless/android/play/playlog/chimera_modules.proto.
     * </pre>
     */
    com.google.protobuf.ByteString getChimeraConfigInfo();

    // optional bool using_log_source_int = 22;
    /**
     * <code>optional bool using_log_source_int = 22;</code>
     *
     * <pre>
     * Indicates if the device is passing in the LogRequest.LogSource integer
     *  value instead of passing in a string for log_source_name.
     *  This field is not set by the client, but by the server after parsing the
     *  request.
     * </pre>
     */
    boolean hasUsingLogSourceInt();
    /**
     * <code>optional bool using_log_source_int = 22;</code>
     *
     * <pre>
     * Indicates if the device is passing in the LogRequest.LogSource integer
     *  value instead of passing in a string for log_source_name.
     *  This field is not set by the client, but by the server after parsing the
     *  request.
     * </pre>
     */
    boolean getUsingLogSourceInt();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.AndroidClientInfo}
   *
   * <pre>
   * Attributes specific to Android clients.
   *
   *  Next tag: 23
   * </pre>
   */
  public static final class AndroidClientInfo extends
      com.google.protobuf.GeneratedMessage
      implements AndroidClientInfoOrBuilder {
    // Use AndroidClientInfo.newBuilder() to construct.
    private AndroidClientInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private AndroidClientInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final AndroidClientInfo defaultInstance;
    public static AndroidClientInfo getDefaultInstance() {
      return defaultInstance;
    }

    public AndroidClientInfo getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private AndroidClientInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              bitField0_ |= 0x00000001;
              androidId_ = input.readInt64();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              loggingId_ = input.readBytes();
              break;
            }
            case 24: {
              bitField0_ |= 0x00000008;
              sdkVersion_ = input.readInt32();
              break;
            }
            case 34: {
              bitField0_ |= 0x00000010;
              model_ = input.readBytes();
              break;
            }
            case 42: {
              bitField0_ |= 0x00000020;
              product_ = input.readBytes();
              break;
            }
            case 50: {
              bitField0_ |= 0x00000100;
              osBuild_ = input.readBytes();
              break;
            }
            case 58: {
              bitField0_ |= 0x00000200;
              applicationBuild_ = input.readBytes();
              break;
            }
            case 66: {
              bitField0_ |= 0x00000040;
              hardware_ = input.readBytes();
              break;
            }
            case 74: {
              bitField0_ |= 0x00000080;
              device_ = input.readBytes();
              break;
            }
            case 82: {
              bitField0_ |= 0x00000400;
              mccMnc_ = input.readBytes();
              break;
            }
            case 90: {
              bitField0_ |= 0x00000800;
              locale_ = input.readBytes();
              break;
            }
            case 98: {
              bitField0_ |= 0x00001000;
              country_ = input.readBytes();
              break;
            }
            case 106: {
              bitField0_ |= 0x00002000;
              manufacturer_ = input.readBytes();
              break;
            }
            case 114: {
              bitField0_ |= 0x00004000;
              brand_ = input.readBytes();
              break;
            }
            case 122: {
              bitField0_ |= 0x00008000;
              board_ = input.readBytes();
              break;
            }
            case 130: {
              bitField0_ |= 0x00010000;
              radioVersion_ = input.readBytes();
              break;
            }
            case 138: {
              bitField0_ |= 0x00020000;
              fingerprint_ = input.readBytes();
              break;
            }
            case 144: {
              bitField0_ |= 0x00000004;
              deviceId_ = input.readInt64();
              break;
            }
            case 152: {
              bitField0_ |= 0x00040000;
              gmsCoreVersionCode_ = input.readInt32();
              break;
            }
            case 160: {
              bitField0_ |= 0x00080000;
              isSidewinderDevice_ = input.readBool();
              break;
            }
            case 170: {
              bitField0_ |= 0x00100000;
              chimeraConfigInfo_ = input.readBytes();
              break;
            }
            case 176: {
              bitField0_ |= 0x00200000;
              usingLogSourceInt_ = input.readBool();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_AndroidClientInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_AndroidClientInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.Builder.class);
    }

    public static com.google.protobuf.Parser<AndroidClientInfo> PARSER =
        new com.google.protobuf.AbstractParser<AndroidClientInfo>() {
      public AndroidClientInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new AndroidClientInfo(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<AndroidClientInfo> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // optional int64 android_id = 1;
    public static final int ANDROID_ID_FIELD_NUMBER = 1;
    private long androidId_;
    /**
     * <code>optional int64 android_id = 1;</code>
     *
     * <pre>
     * "Gservices" android ID.  Considered PII.  Never logged in archival logs.
     * </pre>
     */
    public boolean hasAndroidId() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional int64 android_id = 1;</code>
     *
     * <pre>
     * "Gservices" android ID.  Considered PII.  Never logged in archival logs.
     * </pre>
     */
    public long getAndroidId() {
      return androidId_;
    }

    // optional string logging_id = 2;
    public static final int LOGGING_ID_FIELD_NUMBER = 2;
    private java.lang.Object loggingId_;
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public boolean hasLoggingId() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public java.lang.String getLoggingId() {
      java.lang.Object ref = loggingId_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          loggingId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getLoggingIdBytes() {
      java.lang.Object ref = loggingId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        loggingId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional int64 device_id = 18;
    public static final int DEVICE_ID_FIELD_NUMBER = 18;
    private long deviceId_;
    /**
     * <code>optional int64 device_id = 18;</code>
     *
     * <pre>
     * Device ID referenced by android.provider.Settings.Secure.ANDROID_ID.
     *  Considered PII. Never logged in archival logs.
     * </pre>
     */
    public boolean hasDeviceId() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional int64 device_id = 18;</code>
     *
     * <pre>
     * Device ID referenced by android.provider.Settings.Secure.ANDROID_ID.
     *  Considered PII. Never logged in archival logs.
     * </pre>
     */
    public long getDeviceId() {
      return deviceId_;
    }

    // optional int32 sdk_version = 3;
    public static final int SDK_VERSION_FIELD_NUMBER = 3;
    private int sdkVersion_;
    /**
     * <code>optional int32 sdk_version = 3;</code>
     *
     * <pre>
     * This comes from android.os.Build.VERSION.SDK_INT.
     * </pre>
     */
    public boolean hasSdkVersion() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional int32 sdk_version = 3;</code>
     *
     * <pre>
     * This comes from android.os.Build.VERSION.SDK_INT.
     * </pre>
     */
    public int getSdkVersion() {
      return sdkVersion_;
    }

    // optional string model = 4;
    public static final int MODEL_FIELD_NUMBER = 4;
    private java.lang.Object model_;
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Textual description of the client platform.  e.g., "Nexus 4".
     *  This comes from android.os.Build.MODEL.
     * </pre>
     */
    public boolean hasModel() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Textual description of the client platform.  e.g., "Nexus 4".
     *  This comes from android.os.Build.MODEL.
     * </pre>
     */
    public java.lang.String getModel() {
      java.lang.Object ref = model_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          model_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Textual description of the client platform.  e.g., "Nexus 4".
     *  This comes from android.os.Build.MODEL.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getModelBytes() {
      java.lang.Object ref = model_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        model_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string product = 5;
    public static final int PRODUCT_FIELD_NUMBER = 5;
    private java.lang.Object product_;
    /**
     * <code>optional string product = 5;</code>
     *
     * <pre>
     * The name of the overall product. e.g., "occam".
     *  This comes from android.os.Build.Product.
     * </pre>
     */
    public boolean hasProduct() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * <code>optional string product = 5;</code>
     *
     * <pre>
     * The name of the overall product. e.g., "occam".
     *  This comes from android.os.Build.Product.
     * </pre>
     */
    public java.lang.String getProduct() {
      java.lang.Object ref = product_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          product_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string product = 5;</code>
     *
     * <pre>
     * The name of the overall product. e.g., "occam".
     *  This comes from android.os.Build.Product.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getProductBytes() {
      java.lang.Object ref = product_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        product_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string hardware = 8;
    public static final int HARDWARE_FIELD_NUMBER = 8;
    private java.lang.Object hardware_;
    /**
     * <code>optional string hardware = 8;</code>
     *
     * <pre>
     * The name of the hardware (from the kernel command line or /proc).
     *  This comes from android.os.Build.Hardware.  e.g., "mako".
     * </pre>
     */
    public boolean hasHardware() {
      return ((bitField0_ & 0x00000040) == 0x00000040);
    }
    /**
     * <code>optional string hardware = 8;</code>
     *
     * <pre>
     * The name of the hardware (from the kernel command line or /proc).
     *  This comes from android.os.Build.Hardware.  e.g., "mako".
     * </pre>
     */
    public java.lang.String getHardware() {
      java.lang.Object ref = hardware_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          hardware_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string hardware = 8;</code>
     *
     * <pre>
     * The name of the hardware (from the kernel command line or /proc).
     *  This comes from android.os.Build.Hardware.  e.g., "mako".
     * </pre>
     */
    public com.google.protobuf.ByteString
        getHardwareBytes() {
      java.lang.Object ref = hardware_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        hardware_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string device = 9;
    public static final int DEVICE_FIELD_NUMBER = 9;
    private java.lang.Object device_;
    /**
     * <code>optional string device = 9;</code>
     *
     * <pre>
     * The name of the industrial design.  e.g., "mako".
     *  This comes from android.os.Build.Device.
     * </pre>
     */
    public boolean hasDevice() {
      return ((bitField0_ & 0x00000080) == 0x00000080);
    }
    /**
     * <code>optional string device = 9;</code>
     *
     * <pre>
     * The name of the industrial design.  e.g., "mako".
     *  This comes from android.os.Build.Device.
     * </pre>
     */
    public java.lang.String getDevice() {
      java.lang.Object ref = device_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          device_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string device = 9;</code>
     *
     * <pre>
     * The name of the industrial design.  e.g., "mako".
     *  This comes from android.os.Build.Device.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getDeviceBytes() {
      java.lang.Object ref = device_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        device_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string os_build = 6;
    public static final int OS_BUILD_FIELD_NUMBER = 6;
    private java.lang.Object osBuild_;
    /**
     * <code>optional string os_build = 6;</code>
     *
     * <pre>
     * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
     * </pre>
     */
    public boolean hasOsBuild() {
      return ((bitField0_ & 0x00000100) == 0x00000100);
    }
    /**
     * <code>optional string os_build = 6;</code>
     *
     * <pre>
     * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
     * </pre>
     */
    public java.lang.String getOsBuild() {
      java.lang.Object ref = osBuild_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          osBuild_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string os_build = 6;</code>
     *
     * <pre>
     * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
     * </pre>
     */
    public com.google.protobuf.ByteString
        getOsBuildBytes() {
      java.lang.Object ref = osBuild_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        osBuild_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string application_build = 7;
    public static final int APPLICATION_BUILD_FIELD_NUMBER = 7;
    private java.lang.Object applicationBuild_;
    /**
     * <code>optional string application_build = 7;</code>
     *
     * <pre>
     * The client application version. The java int version in the android package
     *  converted to string.
     * </pre>
     */
    public boolean hasApplicationBuild() {
      return ((bitField0_ & 0x00000200) == 0x00000200);
    }
    /**
     * <code>optional string application_build = 7;</code>
     *
     * <pre>
     * The client application version. The java int version in the android package
     *  converted to string.
     * </pre>
     */
    public java.lang.String getApplicationBuild() {
      java.lang.Object ref = applicationBuild_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          applicationBuild_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string application_build = 7;</code>
     *
     * <pre>
     * The client application version. The java int version in the android package
     *  converted to string.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getApplicationBuildBytes() {
      java.lang.Object ref = applicationBuild_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        applicationBuild_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string mcc_mnc = 10;
    public static final int MCC_MNC_FIELD_NUMBER = 10;
    private java.lang.Object mccMnc_;
    /**
     * <code>optional string mcc_mnc = 10;</code>
     *
     * <pre>
     * The mobile country code / mobile network code (MCC/MNC).
     *  e.g., 310004 for Verizon USA.
     * </pre>
     */
    public boolean hasMccMnc() {
      return ((bitField0_ & 0x00000400) == 0x00000400);
    }
    /**
     * <code>optional string mcc_mnc = 10;</code>
     *
     * <pre>
     * The mobile country code / mobile network code (MCC/MNC).
     *  e.g., 310004 for Verizon USA.
     * </pre>
     */
    public java.lang.String getMccMnc() {
      java.lang.Object ref = mccMnc_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          mccMnc_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string mcc_mnc = 10;</code>
     *
     * <pre>
     * The mobile country code / mobile network code (MCC/MNC).
     *  e.g., 310004 for Verizon USA.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getMccMncBytes() {
      java.lang.Object ref = mccMnc_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        mccMnc_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string locale = 11;
    public static final int LOCALE_FIELD_NUMBER = 11;
    private java.lang.Object locale_;
    /**
     * <code>optional string locale = 11;</code>
     *
     * <pre>
     * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
     * </pre>
     */
    public boolean hasLocale() {
      return ((bitField0_ & 0x00000800) == 0x00000800);
    }
    /**
     * <code>optional string locale = 11;</code>
     *
     * <pre>
     * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
     * </pre>
     */
    public java.lang.String getLocale() {
      java.lang.Object ref = locale_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          locale_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string locale = 11;</code>
     *
     * <pre>
     * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
     * </pre>
     */
    public com.google.protobuf.ByteString
        getLocaleBytes() {
      java.lang.Object ref = locale_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        locale_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string country = 12;
    public static final int COUNTRY_FIELD_NUMBER = 12;
    private java.lang.Object country_;
    /**
     * <code>optional string country = 12;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    public boolean hasCountry() {
      return ((bitField0_ & 0x00001000) == 0x00001000);
    }
    /**
     * <code>optional string country = 12;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    public java.lang.String getCountry() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          country_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string country = 12;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    public com.google.protobuf.ByteString
        getCountryBytes() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        country_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string manufacturer = 13;
    public static final int MANUFACTURER_FIELD_NUMBER = 13;
    private java.lang.Object manufacturer_;
    /**
     * <code>optional string manufacturer = 13;</code>
     *
     * <pre>
     * The manufacturer of the hardware.
     *  This comes from android.os.Build.MANUFACTURER
     * </pre>
     */
    public boolean hasManufacturer() {
      return ((bitField0_ & 0x00002000) == 0x00002000);
    }
    /**
     * <code>optional string manufacturer = 13;</code>
     *
     * <pre>
     * The manufacturer of the hardware.
     *  This comes from android.os.Build.MANUFACTURER
     * </pre>
     */
    public java.lang.String getManufacturer() {
      java.lang.Object ref = manufacturer_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          manufacturer_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string manufacturer = 13;</code>
     *
     * <pre>
     * The manufacturer of the hardware.
     *  This comes from android.os.Build.MANUFACTURER
     * </pre>
     */
    public com.google.protobuf.ByteString
        getManufacturerBytes() {
      java.lang.Object ref = manufacturer_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        manufacturer_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string brand = 14;
    public static final int BRAND_FIELD_NUMBER = 14;
    private java.lang.Object brand_;
    /**
     * <code>optional string brand = 14;</code>
     *
     * <pre>
     * The brand the software is customized for, if any.  Often a carrier name.
     *  e.g. "google"
     *  from http://developer.android.com/reference/android/os/Build.html#BRAND
     * </pre>
     */
    public boolean hasBrand() {
      return ((bitField0_ & 0x00004000) == 0x00004000);
    }
    /**
     * <code>optional string brand = 14;</code>
     *
     * <pre>
     * The brand the software is customized for, if any.  Often a carrier name.
     *  e.g. "google"
     *  from http://developer.android.com/reference/android/os/Build.html#BRAND
     * </pre>
     */
    public java.lang.String getBrand() {
      java.lang.Object ref = brand_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          brand_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string brand = 14;</code>
     *
     * <pre>
     * The brand the software is customized for, if any.  Often a carrier name.
     *  e.g. "google"
     *  from http://developer.android.com/reference/android/os/Build.html#BRAND
     * </pre>
     */
    public com.google.protobuf.ByteString
        getBrandBytes() {
      java.lang.Object ref = brand_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        brand_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string board = 15;
    public static final int BOARD_FIELD_NUMBER = 15;
    private java.lang.Object board_;
    /**
     * <code>optional string board = 15;</code>
     *
     * <pre>
     * The name of the underlying board
     *  e.g. "tuna"
     *  from http://developer.android.com/reference/android/os/Build.html#BOARD
     * </pre>
     */
    public boolean hasBoard() {
      return ((bitField0_ & 0x00008000) == 0x00008000);
    }
    /**
     * <code>optional string board = 15;</code>
     *
     * <pre>
     * The name of the underlying board
     *  e.g. "tuna"
     *  from http://developer.android.com/reference/android/os/Build.html#BOARD
     * </pre>
     */
    public java.lang.String getBoard() {
      java.lang.Object ref = board_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          board_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string board = 15;</code>
     *
     * <pre>
     * The name of the underlying board
     *  e.g. "tuna"
     *  from http://developer.android.com/reference/android/os/Build.html#BOARD
     * </pre>
     */
    public com.google.protobuf.ByteString
        getBoardBytes() {
      java.lang.Object ref = board_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        board_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string radio_version = 16;
    public static final int RADIO_VERSION_FIELD_NUMBER = 16;
    private java.lang.Object radioVersion_;
    /**
     * <code>optional string radio_version = 16;</code>
     *
     * <pre>
     * Radio version as reported by device, if available at reporting time
     *  e.g. "I9250XXLJ1"
     *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
     * </pre>
     */
    public boolean hasRadioVersion() {
      return ((bitField0_ & 0x00010000) == 0x00010000);
    }
    /**
     * <code>optional string radio_version = 16;</code>
     *
     * <pre>
     * Radio version as reported by device, if available at reporting time
     *  e.g. "I9250XXLJ1"
     *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
     * </pre>
     */
    public java.lang.String getRadioVersion() {
      java.lang.Object ref = radioVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          radioVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string radio_version = 16;</code>
     *
     * <pre>
     * Radio version as reported by device, if available at reporting time
     *  e.g. "I9250XXLJ1"
     *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
     * </pre>
     */
    public com.google.protobuf.ByteString
        getRadioVersionBytes() {
      java.lang.Object ref = radioVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        radioVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string fingerprint = 17;
    public static final int FINGERPRINT_FIELD_NUMBER = 17;
    private java.lang.Object fingerprint_;
    /**
     * <code>optional string fingerprint = 17;</code>
     *
     * <pre>
     * Device model/build fingerprint.
     *  This comes from android.os.Build.FINGERPRINT.
     * </pre>
     */
    public boolean hasFingerprint() {
      return ((bitField0_ & 0x00020000) == 0x00020000);
    }
    /**
     * <code>optional string fingerprint = 17;</code>
     *
     * <pre>
     * Device model/build fingerprint.
     *  This comes from android.os.Build.FINGERPRINT.
     * </pre>
     */
    public java.lang.String getFingerprint() {
      java.lang.Object ref = fingerprint_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          fingerprint_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string fingerprint = 17;</code>
     *
     * <pre>
     * Device model/build fingerprint.
     *  This comes from android.os.Build.FINGERPRINT.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getFingerprintBytes() {
      java.lang.Object ref = fingerprint_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        fingerprint_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional int32 gms_core_version_code = 19;
    public static final int GMS_CORE_VERSION_CODE_FIELD_NUMBER = 19;
    private int gmsCoreVersionCode_;
    /**
     * <code>optional int32 gms_core_version_code = 19;</code>
     *
     * <pre>
     * android.content.pm.PackageInfo.versionCode of com.google.android.gms.
     *  e.g., 6031030
     * </pre>
     */
    public boolean hasGmsCoreVersionCode() {
      return ((bitField0_ & 0x00040000) == 0x00040000);
    }
    /**
     * <code>optional int32 gms_core_version_code = 19;</code>
     *
     * <pre>
     * android.content.pm.PackageInfo.versionCode of com.google.android.gms.
     *  e.g., 6031030
     * </pre>
     */
    public int getGmsCoreVersionCode() {
      return gmsCoreVersionCode_;
    }

    // optional bool is_sidewinder_device = 20;
    public static final int IS_SIDEWINDER_DEVICE_FIELD_NUMBER = 20;
    private boolean isSidewinderDevice_;
    /**
     * <code>optional bool is_sidewinder_device = 20;</code>
     *
     * <pre>
     * Whether the device is a Sidewinder device. See go/sidewinder-summary.
     * </pre>
     */
    public boolean hasIsSidewinderDevice() {
      return ((bitField0_ & 0x00080000) == 0x00080000);
    }
    /**
     * <code>optional bool is_sidewinder_device = 20;</code>
     *
     * <pre>
     * Whether the device is a Sidewinder device. See go/sidewinder-summary.
     * </pre>
     */
    public boolean getIsSidewinderDevice() {
      return isSidewinderDevice_;
    }

    // optional bytes chimera_config_info = 21;
    public static final int CHIMERA_CONFIG_INFO_FIELD_NUMBER = 21;
    private com.google.protobuf.ByteString chimeraConfigInfo_;
    /**
     * <code>optional bytes chimera_config_info = 21;</code>
     *
     * <pre>
     * The Chimera module config info describing the module sets on the device
     *  when the event is logged in the client.
     *  This is a proto of ChimeraConfigInfo residing in
     *  google3/logs/proto/wireless/android/play/playlog/chimera_modules.proto.
     * </pre>
     */
    public boolean hasChimeraConfigInfo() {
      return ((bitField0_ & 0x00100000) == 0x00100000);
    }
    /**
     * <code>optional bytes chimera_config_info = 21;</code>
     *
     * <pre>
     * The Chimera module config info describing the module sets on the device
     *  when the event is logged in the client.
     *  This is a proto of ChimeraConfigInfo residing in
     *  google3/logs/proto/wireless/android/play/playlog/chimera_modules.proto.
     * </pre>
     */
    public com.google.protobuf.ByteString getChimeraConfigInfo() {
      return chimeraConfigInfo_;
    }

    // optional bool using_log_source_int = 22;
    public static final int USING_LOG_SOURCE_INT_FIELD_NUMBER = 22;
    private boolean usingLogSourceInt_;
    /**
     * <code>optional bool using_log_source_int = 22;</code>
     *
     * <pre>
     * Indicates if the device is passing in the LogRequest.LogSource integer
     *  value instead of passing in a string for log_source_name.
     *  This field is not set by the client, but by the server after parsing the
     *  request.
     * </pre>
     */
    public boolean hasUsingLogSourceInt() {
      return ((bitField0_ & 0x00200000) == 0x00200000);
    }
    /**
     * <code>optional bool using_log_source_int = 22;</code>
     *
     * <pre>
     * Indicates if the device is passing in the LogRequest.LogSource integer
     *  value instead of passing in a string for log_source_name.
     *  This field is not set by the client, but by the server after parsing the
     *  request.
     * </pre>
     */
    public boolean getUsingLogSourceInt() {
      return usingLogSourceInt_;
    }

    private void initFields() {
      androidId_ = 0L;
      loggingId_ = "";
      deviceId_ = 0L;
      sdkVersion_ = 0;
      model_ = "";
      product_ = "";
      hardware_ = "";
      device_ = "";
      osBuild_ = "";
      applicationBuild_ = "";
      mccMnc_ = "";
      locale_ = "";
      country_ = "";
      manufacturer_ = "";
      brand_ = "";
      board_ = "";
      radioVersion_ = "";
      fingerprint_ = "";
      gmsCoreVersionCode_ = 0;
      isSidewinderDevice_ = false;
      chimeraConfigInfo_ = com.google.protobuf.ByteString.EMPTY;
      usingLogSourceInt_ = false;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt64(1, androidId_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, getLoggingIdBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeInt32(3, sdkVersion_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeBytes(4, getModelBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeBytes(5, getProductBytes());
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        output.writeBytes(6, getOsBuildBytes());
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        output.writeBytes(7, getApplicationBuildBytes());
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        output.writeBytes(8, getHardwareBytes());
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        output.writeBytes(9, getDeviceBytes());
      }
      if (((bitField0_ & 0x00000400) == 0x00000400)) {
        output.writeBytes(10, getMccMncBytes());
      }
      if (((bitField0_ & 0x00000800) == 0x00000800)) {
        output.writeBytes(11, getLocaleBytes());
      }
      if (((bitField0_ & 0x00001000) == 0x00001000)) {
        output.writeBytes(12, getCountryBytes());
      }
      if (((bitField0_ & 0x00002000) == 0x00002000)) {
        output.writeBytes(13, getManufacturerBytes());
      }
      if (((bitField0_ & 0x00004000) == 0x00004000)) {
        output.writeBytes(14, getBrandBytes());
      }
      if (((bitField0_ & 0x00008000) == 0x00008000)) {
        output.writeBytes(15, getBoardBytes());
      }
      if (((bitField0_ & 0x00010000) == 0x00010000)) {
        output.writeBytes(16, getRadioVersionBytes());
      }
      if (((bitField0_ & 0x00020000) == 0x00020000)) {
        output.writeBytes(17, getFingerprintBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeInt64(18, deviceId_);
      }
      if (((bitField0_ & 0x00040000) == 0x00040000)) {
        output.writeInt32(19, gmsCoreVersionCode_);
      }
      if (((bitField0_ & 0x00080000) == 0x00080000)) {
        output.writeBool(20, isSidewinderDevice_);
      }
      if (((bitField0_ & 0x00100000) == 0x00100000)) {
        output.writeBytes(21, chimeraConfigInfo_);
      }
      if (((bitField0_ & 0x00200000) == 0x00200000)) {
        output.writeBool(22, usingLogSourceInt_);
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(1, androidId_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, getLoggingIdBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(3, sdkVersion_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, getModelBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(5, getProductBytes());
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(6, getOsBuildBytes());
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(7, getApplicationBuildBytes());
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(8, getHardwareBytes());
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(9, getDeviceBytes());
      }
      if (((bitField0_ & 0x00000400) == 0x00000400)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(10, getMccMncBytes());
      }
      if (((bitField0_ & 0x00000800) == 0x00000800)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(11, getLocaleBytes());
      }
      if (((bitField0_ & 0x00001000) == 0x00001000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(12, getCountryBytes());
      }
      if (((bitField0_ & 0x00002000) == 0x00002000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(13, getManufacturerBytes());
      }
      if (((bitField0_ & 0x00004000) == 0x00004000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(14, getBrandBytes());
      }
      if (((bitField0_ & 0x00008000) == 0x00008000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(15, getBoardBytes());
      }
      if (((bitField0_ & 0x00010000) == 0x00010000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(16, getRadioVersionBytes());
      }
      if (((bitField0_ & 0x00020000) == 0x00020000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(17, getFingerprintBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(18, deviceId_);
      }
      if (((bitField0_ & 0x00040000) == 0x00040000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(19, gmsCoreVersionCode_);
      }
      if (((bitField0_ & 0x00080000) == 0x00080000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(20, isSidewinderDevice_);
      }
      if (((bitField0_ & 0x00100000) == 0x00100000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(21, chimeraConfigInfo_);
      }
      if (((bitField0_ & 0x00200000) == 0x00200000)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(22, usingLogSourceInt_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.AndroidClientInfo}
     *
     * <pre>
     * Attributes specific to Android clients.
     *
     *  Next tag: 23
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_AndroidClientInfo_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_AndroidClientInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        androidId_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000001);
        loggingId_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        deviceId_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000004);
        sdkVersion_ = 0;
        bitField0_ = (bitField0_ & ~0x00000008);
        model_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        product_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        hardware_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        device_ = "";
        bitField0_ = (bitField0_ & ~0x00000080);
        osBuild_ = "";
        bitField0_ = (bitField0_ & ~0x00000100);
        applicationBuild_ = "";
        bitField0_ = (bitField0_ & ~0x00000200);
        mccMnc_ = "";
        bitField0_ = (bitField0_ & ~0x00000400);
        locale_ = "";
        bitField0_ = (bitField0_ & ~0x00000800);
        country_ = "";
        bitField0_ = (bitField0_ & ~0x00001000);
        manufacturer_ = "";
        bitField0_ = (bitField0_ & ~0x00002000);
        brand_ = "";
        bitField0_ = (bitField0_ & ~0x00004000);
        board_ = "";
        bitField0_ = (bitField0_ & ~0x00008000);
        radioVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00010000);
        fingerprint_ = "";
        bitField0_ = (bitField0_ & ~0x00020000);
        gmsCoreVersionCode_ = 0;
        bitField0_ = (bitField0_ & ~0x00040000);
        isSidewinderDevice_ = false;
        bitField0_ = (bitField0_ & ~0x00080000);
        chimeraConfigInfo_ = com.google.protobuf.ByteString.EMPTY;
        bitField0_ = (bitField0_ & ~0x00100000);
        usingLogSourceInt_ = false;
        bitField0_ = (bitField0_ & ~0x00200000);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_AndroidClientInfo_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.androidId_ = androidId_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.loggingId_ = loggingId_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.deviceId_ = deviceId_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.sdkVersion_ = sdkVersion_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.model_ = model_;
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        result.product_ = product_;
        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
          to_bitField0_ |= 0x00000040;
        }
        result.hardware_ = hardware_;
        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
          to_bitField0_ |= 0x00000080;
        }
        result.device_ = device_;
        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
          to_bitField0_ |= 0x00000100;
        }
        result.osBuild_ = osBuild_;
        if (((from_bitField0_ & 0x00000200) == 0x00000200)) {
          to_bitField0_ |= 0x00000200;
        }
        result.applicationBuild_ = applicationBuild_;
        if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
          to_bitField0_ |= 0x00000400;
        }
        result.mccMnc_ = mccMnc_;
        if (((from_bitField0_ & 0x00000800) == 0x00000800)) {
          to_bitField0_ |= 0x00000800;
        }
        result.locale_ = locale_;
        if (((from_bitField0_ & 0x00001000) == 0x00001000)) {
          to_bitField0_ |= 0x00001000;
        }
        result.country_ = country_;
        if (((from_bitField0_ & 0x00002000) == 0x00002000)) {
          to_bitField0_ |= 0x00002000;
        }
        result.manufacturer_ = manufacturer_;
        if (((from_bitField0_ & 0x00004000) == 0x00004000)) {
          to_bitField0_ |= 0x00004000;
        }
        result.brand_ = brand_;
        if (((from_bitField0_ & 0x00008000) == 0x00008000)) {
          to_bitField0_ |= 0x00008000;
        }
        result.board_ = board_;
        if (((from_bitField0_ & 0x00010000) == 0x00010000)) {
          to_bitField0_ |= 0x00010000;
        }
        result.radioVersion_ = radioVersion_;
        if (((from_bitField0_ & 0x00020000) == 0x00020000)) {
          to_bitField0_ |= 0x00020000;
        }
        result.fingerprint_ = fingerprint_;
        if (((from_bitField0_ & 0x00040000) == 0x00040000)) {
          to_bitField0_ |= 0x00040000;
        }
        result.gmsCoreVersionCode_ = gmsCoreVersionCode_;
        if (((from_bitField0_ & 0x00080000) == 0x00080000)) {
          to_bitField0_ |= 0x00080000;
        }
        result.isSidewinderDevice_ = isSidewinderDevice_;
        if (((from_bitField0_ & 0x00100000) == 0x00100000)) {
          to_bitField0_ |= 0x00100000;
        }
        result.chimeraConfigInfo_ = chimeraConfigInfo_;
        if (((from_bitField0_ & 0x00200000) == 0x00200000)) {
          to_bitField0_ |= 0x00200000;
        }
        result.usingLogSourceInt_ = usingLogSourceInt_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.getDefaultInstance()) return this;
        if (other.hasAndroidId()) {
          setAndroidId(other.getAndroidId());
        }
        if (other.hasLoggingId()) {
          bitField0_ |= 0x00000002;
          loggingId_ = other.loggingId_;
          onChanged();
        }
        if (other.hasDeviceId()) {
          setDeviceId(other.getDeviceId());
        }
        if (other.hasSdkVersion()) {
          setSdkVersion(other.getSdkVersion());
        }
        if (other.hasModel()) {
          bitField0_ |= 0x00000010;
          model_ = other.model_;
          onChanged();
        }
        if (other.hasProduct()) {
          bitField0_ |= 0x00000020;
          product_ = other.product_;
          onChanged();
        }
        if (other.hasHardware()) {
          bitField0_ |= 0x00000040;
          hardware_ = other.hardware_;
          onChanged();
        }
        if (other.hasDevice()) {
          bitField0_ |= 0x00000080;
          device_ = other.device_;
          onChanged();
        }
        if (other.hasOsBuild()) {
          bitField0_ |= 0x00000100;
          osBuild_ = other.osBuild_;
          onChanged();
        }
        if (other.hasApplicationBuild()) {
          bitField0_ |= 0x00000200;
          applicationBuild_ = other.applicationBuild_;
          onChanged();
        }
        if (other.hasMccMnc()) {
          bitField0_ |= 0x00000400;
          mccMnc_ = other.mccMnc_;
          onChanged();
        }
        if (other.hasLocale()) {
          bitField0_ |= 0x00000800;
          locale_ = other.locale_;
          onChanged();
        }
        if (other.hasCountry()) {
          bitField0_ |= 0x00001000;
          country_ = other.country_;
          onChanged();
        }
        if (other.hasManufacturer()) {
          bitField0_ |= 0x00002000;
          manufacturer_ = other.manufacturer_;
          onChanged();
        }
        if (other.hasBrand()) {
          bitField0_ |= 0x00004000;
          brand_ = other.brand_;
          onChanged();
        }
        if (other.hasBoard()) {
          bitField0_ |= 0x00008000;
          board_ = other.board_;
          onChanged();
        }
        if (other.hasRadioVersion()) {
          bitField0_ |= 0x00010000;
          radioVersion_ = other.radioVersion_;
          onChanged();
        }
        if (other.hasFingerprint()) {
          bitField0_ |= 0x00020000;
          fingerprint_ = other.fingerprint_;
          onChanged();
        }
        if (other.hasGmsCoreVersionCode()) {
          setGmsCoreVersionCode(other.getGmsCoreVersionCode());
        }
        if (other.hasIsSidewinderDevice()) {
          setIsSidewinderDevice(other.getIsSidewinderDevice());
        }
        if (other.hasChimeraConfigInfo()) {
          setChimeraConfigInfo(other.getChimeraConfigInfo());
        }
        if (other.hasUsingLogSourceInt()) {
          setUsingLogSourceInt(other.getUsingLogSourceInt());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional int64 android_id = 1;
      private long androidId_ ;
      /**
       * <code>optional int64 android_id = 1;</code>
       *
       * <pre>
       * "Gservices" android ID.  Considered PII.  Never logged in archival logs.
       * </pre>
       */
      public boolean hasAndroidId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional int64 android_id = 1;</code>
       *
       * <pre>
       * "Gservices" android ID.  Considered PII.  Never logged in archival logs.
       * </pre>
       */
      public long getAndroidId() {
        return androidId_;
      }
      /**
       * <code>optional int64 android_id = 1;</code>
       *
       * <pre>
       * "Gservices" android ID.  Considered PII.  Never logged in archival logs.
       * </pre>
       */
      public Builder setAndroidId(long value) {
        bitField0_ |= 0x00000001;
        androidId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 android_id = 1;</code>
       *
       * <pre>
       * "Gservices" android ID.  Considered PII.  Never logged in archival logs.
       * </pre>
       */
      public Builder clearAndroidId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        androidId_ = 0L;
        onChanged();
        return this;
      }

      // optional string logging_id = 2;
      private java.lang.Object loggingId_ = "";
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public boolean hasLoggingId() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public java.lang.String getLoggingId() {
        java.lang.Object ref = loggingId_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          loggingId_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getLoggingIdBytes() {
        java.lang.Object ref = loggingId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          loggingId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder setLoggingId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        loggingId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder clearLoggingId() {
        bitField0_ = (bitField0_ & ~0x00000002);
        loggingId_ = getDefaultInstance().getLoggingId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder setLoggingIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        loggingId_ = value;
        onChanged();
        return this;
      }

      // optional int64 device_id = 18;
      private long deviceId_ ;
      /**
       * <code>optional int64 device_id = 18;</code>
       *
       * <pre>
       * Device ID referenced by android.provider.Settings.Secure.ANDROID_ID.
       *  Considered PII. Never logged in archival logs.
       * </pre>
       */
      public boolean hasDeviceId() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional int64 device_id = 18;</code>
       *
       * <pre>
       * Device ID referenced by android.provider.Settings.Secure.ANDROID_ID.
       *  Considered PII. Never logged in archival logs.
       * </pre>
       */
      public long getDeviceId() {
        return deviceId_;
      }
      /**
       * <code>optional int64 device_id = 18;</code>
       *
       * <pre>
       * Device ID referenced by android.provider.Settings.Secure.ANDROID_ID.
       *  Considered PII. Never logged in archival logs.
       * </pre>
       */
      public Builder setDeviceId(long value) {
        bitField0_ |= 0x00000004;
        deviceId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 device_id = 18;</code>
       *
       * <pre>
       * Device ID referenced by android.provider.Settings.Secure.ANDROID_ID.
       *  Considered PII. Never logged in archival logs.
       * </pre>
       */
      public Builder clearDeviceId() {
        bitField0_ = (bitField0_ & ~0x00000004);
        deviceId_ = 0L;
        onChanged();
        return this;
      }

      // optional int32 sdk_version = 3;
      private int sdkVersion_ ;
      /**
       * <code>optional int32 sdk_version = 3;</code>
       *
       * <pre>
       * This comes from android.os.Build.VERSION.SDK_INT.
       * </pre>
       */
      public boolean hasSdkVersion() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional int32 sdk_version = 3;</code>
       *
       * <pre>
       * This comes from android.os.Build.VERSION.SDK_INT.
       * </pre>
       */
      public int getSdkVersion() {
        return sdkVersion_;
      }
      /**
       * <code>optional int32 sdk_version = 3;</code>
       *
       * <pre>
       * This comes from android.os.Build.VERSION.SDK_INT.
       * </pre>
       */
      public Builder setSdkVersion(int value) {
        bitField0_ |= 0x00000008;
        sdkVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 sdk_version = 3;</code>
       *
       * <pre>
       * This comes from android.os.Build.VERSION.SDK_INT.
       * </pre>
       */
      public Builder clearSdkVersion() {
        bitField0_ = (bitField0_ & ~0x00000008);
        sdkVersion_ = 0;
        onChanged();
        return this;
      }

      // optional string model = 4;
      private java.lang.Object model_ = "";
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Textual description of the client platform.  e.g., "Nexus 4".
       *  This comes from android.os.Build.MODEL.
       * </pre>
       */
      public boolean hasModel() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Textual description of the client platform.  e.g., "Nexus 4".
       *  This comes from android.os.Build.MODEL.
       * </pre>
       */
      public java.lang.String getModel() {
        java.lang.Object ref = model_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          model_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Textual description of the client platform.  e.g., "Nexus 4".
       *  This comes from android.os.Build.MODEL.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getModelBytes() {
        java.lang.Object ref = model_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          model_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Textual description of the client platform.  e.g., "Nexus 4".
       *  This comes from android.os.Build.MODEL.
       * </pre>
       */
      public Builder setModel(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        model_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Textual description of the client platform.  e.g., "Nexus 4".
       *  This comes from android.os.Build.MODEL.
       * </pre>
       */
      public Builder clearModel() {
        bitField0_ = (bitField0_ & ~0x00000010);
        model_ = getDefaultInstance().getModel();
        onChanged();
        return this;
      }
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Textual description of the client platform.  e.g., "Nexus 4".
       *  This comes from android.os.Build.MODEL.
       * </pre>
       */
      public Builder setModelBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        model_ = value;
        onChanged();
        return this;
      }

      // optional string product = 5;
      private java.lang.Object product_ = "";
      /**
       * <code>optional string product = 5;</code>
       *
       * <pre>
       * The name of the overall product. e.g., "occam".
       *  This comes from android.os.Build.Product.
       * </pre>
       */
      public boolean hasProduct() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * <code>optional string product = 5;</code>
       *
       * <pre>
       * The name of the overall product. e.g., "occam".
       *  This comes from android.os.Build.Product.
       * </pre>
       */
      public java.lang.String getProduct() {
        java.lang.Object ref = product_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          product_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string product = 5;</code>
       *
       * <pre>
       * The name of the overall product. e.g., "occam".
       *  This comes from android.os.Build.Product.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getProductBytes() {
        java.lang.Object ref = product_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          product_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string product = 5;</code>
       *
       * <pre>
       * The name of the overall product. e.g., "occam".
       *  This comes from android.os.Build.Product.
       * </pre>
       */
      public Builder setProduct(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        product_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string product = 5;</code>
       *
       * <pre>
       * The name of the overall product. e.g., "occam".
       *  This comes from android.os.Build.Product.
       * </pre>
       */
      public Builder clearProduct() {
        bitField0_ = (bitField0_ & ~0x00000020);
        product_ = getDefaultInstance().getProduct();
        onChanged();
        return this;
      }
      /**
       * <code>optional string product = 5;</code>
       *
       * <pre>
       * The name of the overall product. e.g., "occam".
       *  This comes from android.os.Build.Product.
       * </pre>
       */
      public Builder setProductBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        product_ = value;
        onChanged();
        return this;
      }

      // optional string hardware = 8;
      private java.lang.Object hardware_ = "";
      /**
       * <code>optional string hardware = 8;</code>
       *
       * <pre>
       * The name of the hardware (from the kernel command line or /proc).
       *  This comes from android.os.Build.Hardware.  e.g., "mako".
       * </pre>
       */
      public boolean hasHardware() {
        return ((bitField0_ & 0x00000040) == 0x00000040);
      }
      /**
       * <code>optional string hardware = 8;</code>
       *
       * <pre>
       * The name of the hardware (from the kernel command line or /proc).
       *  This comes from android.os.Build.Hardware.  e.g., "mako".
       * </pre>
       */
      public java.lang.String getHardware() {
        java.lang.Object ref = hardware_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          hardware_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string hardware = 8;</code>
       *
       * <pre>
       * The name of the hardware (from the kernel command line or /proc).
       *  This comes from android.os.Build.Hardware.  e.g., "mako".
       * </pre>
       */
      public com.google.protobuf.ByteString
          getHardwareBytes() {
        java.lang.Object ref = hardware_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          hardware_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string hardware = 8;</code>
       *
       * <pre>
       * The name of the hardware (from the kernel command line or /proc).
       *  This comes from android.os.Build.Hardware.  e.g., "mako".
       * </pre>
       */
      public Builder setHardware(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        hardware_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string hardware = 8;</code>
       *
       * <pre>
       * The name of the hardware (from the kernel command line or /proc).
       *  This comes from android.os.Build.Hardware.  e.g., "mako".
       * </pre>
       */
      public Builder clearHardware() {
        bitField0_ = (bitField0_ & ~0x00000040);
        hardware_ = getDefaultInstance().getHardware();
        onChanged();
        return this;
      }
      /**
       * <code>optional string hardware = 8;</code>
       *
       * <pre>
       * The name of the hardware (from the kernel command line or /proc).
       *  This comes from android.os.Build.Hardware.  e.g., "mako".
       * </pre>
       */
      public Builder setHardwareBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        hardware_ = value;
        onChanged();
        return this;
      }

      // optional string device = 9;
      private java.lang.Object device_ = "";
      /**
       * <code>optional string device = 9;</code>
       *
       * <pre>
       * The name of the industrial design.  e.g., "mako".
       *  This comes from android.os.Build.Device.
       * </pre>
       */
      public boolean hasDevice() {
        return ((bitField0_ & 0x00000080) == 0x00000080);
      }
      /**
       * <code>optional string device = 9;</code>
       *
       * <pre>
       * The name of the industrial design.  e.g., "mako".
       *  This comes from android.os.Build.Device.
       * </pre>
       */
      public java.lang.String getDevice() {
        java.lang.Object ref = device_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          device_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string device = 9;</code>
       *
       * <pre>
       * The name of the industrial design.  e.g., "mako".
       *  This comes from android.os.Build.Device.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getDeviceBytes() {
        java.lang.Object ref = device_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          device_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string device = 9;</code>
       *
       * <pre>
       * The name of the industrial design.  e.g., "mako".
       *  This comes from android.os.Build.Device.
       * </pre>
       */
      public Builder setDevice(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        device_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string device = 9;</code>
       *
       * <pre>
       * The name of the industrial design.  e.g., "mako".
       *  This comes from android.os.Build.Device.
       * </pre>
       */
      public Builder clearDevice() {
        bitField0_ = (bitField0_ & ~0x00000080);
        device_ = getDefaultInstance().getDevice();
        onChanged();
        return this;
      }
      /**
       * <code>optional string device = 9;</code>
       *
       * <pre>
       * The name of the industrial design.  e.g., "mako".
       *  This comes from android.os.Build.Device.
       * </pre>
       */
      public Builder setDeviceBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        device_ = value;
        onChanged();
        return this;
      }

      // optional string os_build = 6;
      private java.lang.Object osBuild_ = "";
      /**
       * <code>optional string os_build = 6;</code>
       *
       * <pre>
       * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
       * </pre>
       */
      public boolean hasOsBuild() {
        return ((bitField0_ & 0x00000100) == 0x00000100);
      }
      /**
       * <code>optional string os_build = 6;</code>
       *
       * <pre>
       * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
       * </pre>
       */
      public java.lang.String getOsBuild() {
        java.lang.Object ref = osBuild_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          osBuild_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string os_build = 6;</code>
       *
       * <pre>
       * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
       * </pre>
       */
      public com.google.protobuf.ByteString
          getOsBuildBytes() {
        java.lang.Object ref = osBuild_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          osBuild_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string os_build = 6;</code>
       *
       * <pre>
       * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
       * </pre>
       */
      public Builder setOsBuild(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        osBuild_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_build = 6;</code>
       *
       * <pre>
       * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
       * </pre>
       */
      public Builder clearOsBuild() {
        bitField0_ = (bitField0_ & ~0x00000100);
        osBuild_ = getDefaultInstance().getOsBuild();
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_build = 6;</code>
       *
       * <pre>
       * This comes from android.os.Build.ID.  e.g., something like "JRN54F".
       * </pre>
       */
      public Builder setOsBuildBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        osBuild_ = value;
        onChanged();
        return this;
      }

      // optional string application_build = 7;
      private java.lang.Object applicationBuild_ = "";
      /**
       * <code>optional string application_build = 7;</code>
       *
       * <pre>
       * The client application version. The java int version in the android package
       *  converted to string.
       * </pre>
       */
      public boolean hasApplicationBuild() {
        return ((bitField0_ & 0x00000200) == 0x00000200);
      }
      /**
       * <code>optional string application_build = 7;</code>
       *
       * <pre>
       * The client application version. The java int version in the android package
       *  converted to string.
       * </pre>
       */
      public java.lang.String getApplicationBuild() {
        java.lang.Object ref = applicationBuild_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          applicationBuild_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string application_build = 7;</code>
       *
       * <pre>
       * The client application version. The java int version in the android package
       *  converted to string.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getApplicationBuildBytes() {
        java.lang.Object ref = applicationBuild_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          applicationBuild_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string application_build = 7;</code>
       *
       * <pre>
       * The client application version. The java int version in the android package
       *  converted to string.
       * </pre>
       */
      public Builder setApplicationBuild(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
        applicationBuild_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string application_build = 7;</code>
       *
       * <pre>
       * The client application version. The java int version in the android package
       *  converted to string.
       * </pre>
       */
      public Builder clearApplicationBuild() {
        bitField0_ = (bitField0_ & ~0x00000200);
        applicationBuild_ = getDefaultInstance().getApplicationBuild();
        onChanged();
        return this;
      }
      /**
       * <code>optional string application_build = 7;</code>
       *
       * <pre>
       * The client application version. The java int version in the android package
       *  converted to string.
       * </pre>
       */
      public Builder setApplicationBuildBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
        applicationBuild_ = value;
        onChanged();
        return this;
      }

      // optional string mcc_mnc = 10;
      private java.lang.Object mccMnc_ = "";
      /**
       * <code>optional string mcc_mnc = 10;</code>
       *
       * <pre>
       * The mobile country code / mobile network code (MCC/MNC).
       *  e.g., 310004 for Verizon USA.
       * </pre>
       */
      public boolean hasMccMnc() {
        return ((bitField0_ & 0x00000400) == 0x00000400);
      }
      /**
       * <code>optional string mcc_mnc = 10;</code>
       *
       * <pre>
       * The mobile country code / mobile network code (MCC/MNC).
       *  e.g., 310004 for Verizon USA.
       * </pre>
       */
      public java.lang.String getMccMnc() {
        java.lang.Object ref = mccMnc_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          mccMnc_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string mcc_mnc = 10;</code>
       *
       * <pre>
       * The mobile country code / mobile network code (MCC/MNC).
       *  e.g., 310004 for Verizon USA.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getMccMncBytes() {
        java.lang.Object ref = mccMnc_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          mccMnc_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string mcc_mnc = 10;</code>
       *
       * <pre>
       * The mobile country code / mobile network code (MCC/MNC).
       *  e.g., 310004 for Verizon USA.
       * </pre>
       */
      public Builder setMccMnc(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        mccMnc_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string mcc_mnc = 10;</code>
       *
       * <pre>
       * The mobile country code / mobile network code (MCC/MNC).
       *  e.g., 310004 for Verizon USA.
       * </pre>
       */
      public Builder clearMccMnc() {
        bitField0_ = (bitField0_ & ~0x00000400);
        mccMnc_ = getDefaultInstance().getMccMnc();
        onChanged();
        return this;
      }
      /**
       * <code>optional string mcc_mnc = 10;</code>
       *
       * <pre>
       * The mobile country code / mobile network code (MCC/MNC).
       *  e.g., 310004 for Verizon USA.
       * </pre>
       */
      public Builder setMccMncBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
        mccMnc_ = value;
        onChanged();
        return this;
      }

      // optional string locale = 11;
      private java.lang.Object locale_ = "";
      /**
       * <code>optional string locale = 11;</code>
       *
       * <pre>
       * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
       * </pre>
       */
      public boolean hasLocale() {
        return ((bitField0_ & 0x00000800) == 0x00000800);
      }
      /**
       * <code>optional string locale = 11;</code>
       *
       * <pre>
       * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
       * </pre>
       */
      public java.lang.String getLocale() {
        java.lang.Object ref = locale_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          locale_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string locale = 11;</code>
       *
       * <pre>
       * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
       * </pre>
       */
      public com.google.protobuf.ByteString
          getLocaleBytes() {
        java.lang.Object ref = locale_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          locale_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string locale = 11;</code>
       *
       * <pre>
       * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
       * </pre>
       */
      public Builder setLocale(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
        locale_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string locale = 11;</code>
       *
       * <pre>
       * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
       * </pre>
       */
      public Builder clearLocale() {
        bitField0_ = (bitField0_ & ~0x00000800);
        locale_ = getDefaultInstance().getLocale();
        onChanged();
        return this;
      }
      /**
       * <code>optional string locale = 11;</code>
       *
       * <pre>
       * The chosen locale from the client. e.g., "en_US", "ko_KR", "en_GB".
       * </pre>
       */
      public Builder setLocaleBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
        locale_ = value;
        onChanged();
        return this;
      }

      // optional string country = 12;
      private java.lang.Object country_ = "";
      /**
       * <code>optional string country = 12;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public boolean hasCountry() {
        return ((bitField0_ & 0x00001000) == 0x00001000);
      }
      /**
       * <code>optional string country = 12;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public java.lang.String getCountry() {
        java.lang.Object ref = country_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          country_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string country = 12;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public com.google.protobuf.ByteString
          getCountryBytes() {
        java.lang.Object ref = country_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          country_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string country = 12;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public Builder setCountry(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00001000;
        country_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 12;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public Builder clearCountry() {
        bitField0_ = (bitField0_ & ~0x00001000);
        country_ = getDefaultInstance().getCountry();
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 12;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public Builder setCountryBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00001000;
        country_ = value;
        onChanged();
        return this;
      }

      // optional string manufacturer = 13;
      private java.lang.Object manufacturer_ = "";
      /**
       * <code>optional string manufacturer = 13;</code>
       *
       * <pre>
       * The manufacturer of the hardware.
       *  This comes from android.os.Build.MANUFACTURER
       * </pre>
       */
      public boolean hasManufacturer() {
        return ((bitField0_ & 0x00002000) == 0x00002000);
      }
      /**
       * <code>optional string manufacturer = 13;</code>
       *
       * <pre>
       * The manufacturer of the hardware.
       *  This comes from android.os.Build.MANUFACTURER
       * </pre>
       */
      public java.lang.String getManufacturer() {
        java.lang.Object ref = manufacturer_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          manufacturer_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string manufacturer = 13;</code>
       *
       * <pre>
       * The manufacturer of the hardware.
       *  This comes from android.os.Build.MANUFACTURER
       * </pre>
       */
      public com.google.protobuf.ByteString
          getManufacturerBytes() {
        java.lang.Object ref = manufacturer_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          manufacturer_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string manufacturer = 13;</code>
       *
       * <pre>
       * The manufacturer of the hardware.
       *  This comes from android.os.Build.MANUFACTURER
       * </pre>
       */
      public Builder setManufacturer(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
        manufacturer_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string manufacturer = 13;</code>
       *
       * <pre>
       * The manufacturer of the hardware.
       *  This comes from android.os.Build.MANUFACTURER
       * </pre>
       */
      public Builder clearManufacturer() {
        bitField0_ = (bitField0_ & ~0x00002000);
        manufacturer_ = getDefaultInstance().getManufacturer();
        onChanged();
        return this;
      }
      /**
       * <code>optional string manufacturer = 13;</code>
       *
       * <pre>
       * The manufacturer of the hardware.
       *  This comes from android.os.Build.MANUFACTURER
       * </pre>
       */
      public Builder setManufacturerBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
        manufacturer_ = value;
        onChanged();
        return this;
      }

      // optional string brand = 14;
      private java.lang.Object brand_ = "";
      /**
       * <code>optional string brand = 14;</code>
       *
       * <pre>
       * The brand the software is customized for, if any.  Often a carrier name.
       *  e.g. "google"
       *  from http://developer.android.com/reference/android/os/Build.html#BRAND
       * </pre>
       */
      public boolean hasBrand() {
        return ((bitField0_ & 0x00004000) == 0x00004000);
      }
      /**
       * <code>optional string brand = 14;</code>
       *
       * <pre>
       * The brand the software is customized for, if any.  Often a carrier name.
       *  e.g. "google"
       *  from http://developer.android.com/reference/android/os/Build.html#BRAND
       * </pre>
       */
      public java.lang.String getBrand() {
        java.lang.Object ref = brand_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          brand_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string brand = 14;</code>
       *
       * <pre>
       * The brand the software is customized for, if any.  Often a carrier name.
       *  e.g. "google"
       *  from http://developer.android.com/reference/android/os/Build.html#BRAND
       * </pre>
       */
      public com.google.protobuf.ByteString
          getBrandBytes() {
        java.lang.Object ref = brand_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          brand_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string brand = 14;</code>
       *
       * <pre>
       * The brand the software is customized for, if any.  Often a carrier name.
       *  e.g. "google"
       *  from http://developer.android.com/reference/android/os/Build.html#BRAND
       * </pre>
       */
      public Builder setBrand(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
        brand_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string brand = 14;</code>
       *
       * <pre>
       * The brand the software is customized for, if any.  Often a carrier name.
       *  e.g. "google"
       *  from http://developer.android.com/reference/android/os/Build.html#BRAND
       * </pre>
       */
      public Builder clearBrand() {
        bitField0_ = (bitField0_ & ~0x00004000);
        brand_ = getDefaultInstance().getBrand();
        onChanged();
        return this;
      }
      /**
       * <code>optional string brand = 14;</code>
       *
       * <pre>
       * The brand the software is customized for, if any.  Often a carrier name.
       *  e.g. "google"
       *  from http://developer.android.com/reference/android/os/Build.html#BRAND
       * </pre>
       */
      public Builder setBrandBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
        brand_ = value;
        onChanged();
        return this;
      }

      // optional string board = 15;
      private java.lang.Object board_ = "";
      /**
       * <code>optional string board = 15;</code>
       *
       * <pre>
       * The name of the underlying board
       *  e.g. "tuna"
       *  from http://developer.android.com/reference/android/os/Build.html#BOARD
       * </pre>
       */
      public boolean hasBoard() {
        return ((bitField0_ & 0x00008000) == 0x00008000);
      }
      /**
       * <code>optional string board = 15;</code>
       *
       * <pre>
       * The name of the underlying board
       *  e.g. "tuna"
       *  from http://developer.android.com/reference/android/os/Build.html#BOARD
       * </pre>
       */
      public java.lang.String getBoard() {
        java.lang.Object ref = board_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          board_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string board = 15;</code>
       *
       * <pre>
       * The name of the underlying board
       *  e.g. "tuna"
       *  from http://developer.android.com/reference/android/os/Build.html#BOARD
       * </pre>
       */
      public com.google.protobuf.ByteString
          getBoardBytes() {
        java.lang.Object ref = board_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          board_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string board = 15;</code>
       *
       * <pre>
       * The name of the underlying board
       *  e.g. "tuna"
       *  from http://developer.android.com/reference/android/os/Build.html#BOARD
       * </pre>
       */
      public Builder setBoard(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
        board_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string board = 15;</code>
       *
       * <pre>
       * The name of the underlying board
       *  e.g. "tuna"
       *  from http://developer.android.com/reference/android/os/Build.html#BOARD
       * </pre>
       */
      public Builder clearBoard() {
        bitField0_ = (bitField0_ & ~0x00008000);
        board_ = getDefaultInstance().getBoard();
        onChanged();
        return this;
      }
      /**
       * <code>optional string board = 15;</code>
       *
       * <pre>
       * The name of the underlying board
       *  e.g. "tuna"
       *  from http://developer.android.com/reference/android/os/Build.html#BOARD
       * </pre>
       */
      public Builder setBoardBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
        board_ = value;
        onChanged();
        return this;
      }

      // optional string radio_version = 16;
      private java.lang.Object radioVersion_ = "";
      /**
       * <code>optional string radio_version = 16;</code>
       *
       * <pre>
       * Radio version as reported by device, if available at reporting time
       *  e.g. "I9250XXLJ1"
       *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
       * </pre>
       */
      public boolean hasRadioVersion() {
        return ((bitField0_ & 0x00010000) == 0x00010000);
      }
      /**
       * <code>optional string radio_version = 16;</code>
       *
       * <pre>
       * Radio version as reported by device, if available at reporting time
       *  e.g. "I9250XXLJ1"
       *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
       * </pre>
       */
      public java.lang.String getRadioVersion() {
        java.lang.Object ref = radioVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          radioVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string radio_version = 16;</code>
       *
       * <pre>
       * Radio version as reported by device, if available at reporting time
       *  e.g. "I9250XXLJ1"
       *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
       * </pre>
       */
      public com.google.protobuf.ByteString
          getRadioVersionBytes() {
        java.lang.Object ref = radioVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          radioVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string radio_version = 16;</code>
       *
       * <pre>
       * Radio version as reported by device, if available at reporting time
       *  e.g. "I9250XXLJ1"
       *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
       * </pre>
       */
      public Builder setRadioVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00010000;
        radioVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string radio_version = 16;</code>
       *
       * <pre>
       * Radio version as reported by device, if available at reporting time
       *  e.g. "I9250XXLJ1"
       *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
       * </pre>
       */
      public Builder clearRadioVersion() {
        bitField0_ = (bitField0_ & ~0x00010000);
        radioVersion_ = getDefaultInstance().getRadioVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string radio_version = 16;</code>
       *
       * <pre>
       * Radio version as reported by device, if available at reporting time
       *  e.g. "I9250XXLJ1"
       *  from http://developer.android.com/reference/android/os/Build.html#getRadioVersion()
       * </pre>
       */
      public Builder setRadioVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00010000;
        radioVersion_ = value;
        onChanged();
        return this;
      }

      // optional string fingerprint = 17;
      private java.lang.Object fingerprint_ = "";
      /**
       * <code>optional string fingerprint = 17;</code>
       *
       * <pre>
       * Device model/build fingerprint.
       *  This comes from android.os.Build.FINGERPRINT.
       * </pre>
       */
      public boolean hasFingerprint() {
        return ((bitField0_ & 0x00020000) == 0x00020000);
      }
      /**
       * <code>optional string fingerprint = 17;</code>
       *
       * <pre>
       * Device model/build fingerprint.
       *  This comes from android.os.Build.FINGERPRINT.
       * </pre>
       */
      public java.lang.String getFingerprint() {
        java.lang.Object ref = fingerprint_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          fingerprint_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string fingerprint = 17;</code>
       *
       * <pre>
       * Device model/build fingerprint.
       *  This comes from android.os.Build.FINGERPRINT.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getFingerprintBytes() {
        java.lang.Object ref = fingerprint_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          fingerprint_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string fingerprint = 17;</code>
       *
       * <pre>
       * Device model/build fingerprint.
       *  This comes from android.os.Build.FINGERPRINT.
       * </pre>
       */
      public Builder setFingerprint(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00020000;
        fingerprint_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string fingerprint = 17;</code>
       *
       * <pre>
       * Device model/build fingerprint.
       *  This comes from android.os.Build.FINGERPRINT.
       * </pre>
       */
      public Builder clearFingerprint() {
        bitField0_ = (bitField0_ & ~0x00020000);
        fingerprint_ = getDefaultInstance().getFingerprint();
        onChanged();
        return this;
      }
      /**
       * <code>optional string fingerprint = 17;</code>
       *
       * <pre>
       * Device model/build fingerprint.
       *  This comes from android.os.Build.FINGERPRINT.
       * </pre>
       */
      public Builder setFingerprintBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00020000;
        fingerprint_ = value;
        onChanged();
        return this;
      }

      // optional int32 gms_core_version_code = 19;
      private int gmsCoreVersionCode_ ;
      /**
       * <code>optional int32 gms_core_version_code = 19;</code>
       *
       * <pre>
       * android.content.pm.PackageInfo.versionCode of com.google.android.gms.
       *  e.g., 6031030
       * </pre>
       */
      public boolean hasGmsCoreVersionCode() {
        return ((bitField0_ & 0x00040000) == 0x00040000);
      }
      /**
       * <code>optional int32 gms_core_version_code = 19;</code>
       *
       * <pre>
       * android.content.pm.PackageInfo.versionCode of com.google.android.gms.
       *  e.g., 6031030
       * </pre>
       */
      public int getGmsCoreVersionCode() {
        return gmsCoreVersionCode_;
      }
      /**
       * <code>optional int32 gms_core_version_code = 19;</code>
       *
       * <pre>
       * android.content.pm.PackageInfo.versionCode of com.google.android.gms.
       *  e.g., 6031030
       * </pre>
       */
      public Builder setGmsCoreVersionCode(int value) {
        bitField0_ |= 0x00040000;
        gmsCoreVersionCode_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 gms_core_version_code = 19;</code>
       *
       * <pre>
       * android.content.pm.PackageInfo.versionCode of com.google.android.gms.
       *  e.g., 6031030
       * </pre>
       */
      public Builder clearGmsCoreVersionCode() {
        bitField0_ = (bitField0_ & ~0x00040000);
        gmsCoreVersionCode_ = 0;
        onChanged();
        return this;
      }

      // optional bool is_sidewinder_device = 20;
      private boolean isSidewinderDevice_ ;
      /**
       * <code>optional bool is_sidewinder_device = 20;</code>
       *
       * <pre>
       * Whether the device is a Sidewinder device. See go/sidewinder-summary.
       * </pre>
       */
      public boolean hasIsSidewinderDevice() {
        return ((bitField0_ & 0x00080000) == 0x00080000);
      }
      /**
       * <code>optional bool is_sidewinder_device = 20;</code>
       *
       * <pre>
       * Whether the device is a Sidewinder device. See go/sidewinder-summary.
       * </pre>
       */
      public boolean getIsSidewinderDevice() {
        return isSidewinderDevice_;
      }
      /**
       * <code>optional bool is_sidewinder_device = 20;</code>
       *
       * <pre>
       * Whether the device is a Sidewinder device. See go/sidewinder-summary.
       * </pre>
       */
      public Builder setIsSidewinderDevice(boolean value) {
        bitField0_ |= 0x00080000;
        isSidewinderDevice_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool is_sidewinder_device = 20;</code>
       *
       * <pre>
       * Whether the device is a Sidewinder device. See go/sidewinder-summary.
       * </pre>
       */
      public Builder clearIsSidewinderDevice() {
        bitField0_ = (bitField0_ & ~0x00080000);
        isSidewinderDevice_ = false;
        onChanged();
        return this;
      }

      // optional bytes chimera_config_info = 21;
      private com.google.protobuf.ByteString chimeraConfigInfo_ = com.google.protobuf.ByteString.EMPTY;
      /**
       * <code>optional bytes chimera_config_info = 21;</code>
       *
       * <pre>
       * The Chimera module config info describing the module sets on the device
       *  when the event is logged in the client.
       *  This is a proto of ChimeraConfigInfo residing in
       *  google3/logs/proto/wireless/android/play/playlog/chimera_modules.proto.
       * </pre>
       */
      public boolean hasChimeraConfigInfo() {
        return ((bitField0_ & 0x00100000) == 0x00100000);
      }
      /**
       * <code>optional bytes chimera_config_info = 21;</code>
       *
       * <pre>
       * The Chimera module config info describing the module sets on the device
       *  when the event is logged in the client.
       *  This is a proto of ChimeraConfigInfo residing in
       *  google3/logs/proto/wireless/android/play/playlog/chimera_modules.proto.
       * </pre>
       */
      public com.google.protobuf.ByteString getChimeraConfigInfo() {
        return chimeraConfigInfo_;
      }
      /**
       * <code>optional bytes chimera_config_info = 21;</code>
       *
       * <pre>
       * The Chimera module config info describing the module sets on the device
       *  when the event is logged in the client.
       *  This is a proto of ChimeraConfigInfo residing in
       *  google3/logs/proto/wireless/android/play/playlog/chimera_modules.proto.
       * </pre>
       */
      public Builder setChimeraConfigInfo(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00100000;
        chimeraConfigInfo_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bytes chimera_config_info = 21;</code>
       *
       * <pre>
       * The Chimera module config info describing the module sets on the device
       *  when the event is logged in the client.
       *  This is a proto of ChimeraConfigInfo residing in
       *  google3/logs/proto/wireless/android/play/playlog/chimera_modules.proto.
       * </pre>
       */
      public Builder clearChimeraConfigInfo() {
        bitField0_ = (bitField0_ & ~0x00100000);
        chimeraConfigInfo_ = getDefaultInstance().getChimeraConfigInfo();
        onChanged();
        return this;
      }

      // optional bool using_log_source_int = 22;
      private boolean usingLogSourceInt_ ;
      /**
       * <code>optional bool using_log_source_int = 22;</code>
       *
       * <pre>
       * Indicates if the device is passing in the LogRequest.LogSource integer
       *  value instead of passing in a string for log_source_name.
       *  This field is not set by the client, but by the server after parsing the
       *  request.
       * </pre>
       */
      public boolean hasUsingLogSourceInt() {
        return ((bitField0_ & 0x00200000) == 0x00200000);
      }
      /**
       * <code>optional bool using_log_source_int = 22;</code>
       *
       * <pre>
       * Indicates if the device is passing in the LogRequest.LogSource integer
       *  value instead of passing in a string for log_source_name.
       *  This field is not set by the client, but by the server after parsing the
       *  request.
       * </pre>
       */
      public boolean getUsingLogSourceInt() {
        return usingLogSourceInt_;
      }
      /**
       * <code>optional bool using_log_source_int = 22;</code>
       *
       * <pre>
       * Indicates if the device is passing in the LogRequest.LogSource integer
       *  value instead of passing in a string for log_source_name.
       *  This field is not set by the client, but by the server after parsing the
       *  request.
       * </pre>
       */
      public Builder setUsingLogSourceInt(boolean value) {
        bitField0_ |= 0x00200000;
        usingLogSourceInt_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool using_log_source_int = 22;</code>
       *
       * <pre>
       * Indicates if the device is passing in the LogRequest.LogSource integer
       *  value instead of passing in a string for log_source_name.
       *  This field is not set by the client, but by the server after parsing the
       *  request.
       * </pre>
       */
      public Builder clearUsingLogSourceInt() {
        bitField0_ = (bitField0_ & ~0x00200000);
        usingLogSourceInt_ = false;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.AndroidClientInfo)
    }

    static {
      defaultInstance = new AndroidClientInfo(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.AndroidClientInfo)
  }

  public interface BrowserInfoOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional string locale = 1;
    /**
     * <code>optional string locale = 1;</code>
     *
     * <pre>
     * Locale of the browser. Usually the same as the Accept-Language header but
     *  can be overridden by the hl query-string parameter.
     * </pre>
     */
    boolean hasLocale();
    /**
     * <code>optional string locale = 1;</code>
     *
     * <pre>
     * Locale of the browser. Usually the same as the Accept-Language header but
     *  can be overridden by the hl query-string parameter.
     * </pre>
     */
    java.lang.String getLocale();
    /**
     * <code>optional string locale = 1;</code>
     *
     * <pre>
     * Locale of the browser. Usually the same as the Accept-Language header but
     *  can be overridden by the hl query-string parameter.
     * </pre>
     */
    com.google.protobuf.ByteString
        getLocaleBytes();

    // optional string browser = 2;
    /**
     * <code>optional string browser = 2;</code>
     *
     * <pre>
     * Name of the browser. This comes from analytics.browserInfo.NAME.
     * </pre>
     */
    boolean hasBrowser();
    /**
     * <code>optional string browser = 2;</code>
     *
     * <pre>
     * Name of the browser. This comes from analytics.browserInfo.NAME.
     * </pre>
     */
    java.lang.String getBrowser();
    /**
     * <code>optional string browser = 2;</code>
     *
     * <pre>
     * Name of the browser. This comes from analytics.browserInfo.NAME.
     * </pre>
     */
    com.google.protobuf.ByteString
        getBrowserBytes();

    // optional string browser_version = 3;
    /**
     * <code>optional string browser_version = 3;</code>
     *
     * <pre>
     * Version of the browser. This comes from goog.userAgent.product.VERSION.
     * </pre>
     */
    boolean hasBrowserVersion();
    /**
     * <code>optional string browser_version = 3;</code>
     *
     * <pre>
     * Version of the browser. This comes from goog.userAgent.product.VERSION.
     * </pre>
     */
    java.lang.String getBrowserVersion();
    /**
     * <code>optional string browser_version = 3;</code>
     *
     * <pre>
     * Version of the browser. This comes from goog.userAgent.product.VERSION.
     * </pre>
     */
    com.google.protobuf.ByteString
        getBrowserVersionBytes();

    // optional string flash_version = 4;
    /**
     * <code>optional string flash_version = 4;</code>
     *
     * <pre>
     * Version of flash the browser is using.
     *  This comes from goog.userAgent.flash.VERSION. Should not be included if
     *  goog.userAgent.flash.HAS_FLASH is false.
     * </pre>
     */
    boolean hasFlashVersion();
    /**
     * <code>optional string flash_version = 4;</code>
     *
     * <pre>
     * Version of flash the browser is using.
     *  This comes from goog.userAgent.flash.VERSION. Should not be included if
     *  goog.userAgent.flash.HAS_FLASH is false.
     * </pre>
     */
    java.lang.String getFlashVersion();
    /**
     * <code>optional string flash_version = 4;</code>
     *
     * <pre>
     * Version of flash the browser is using.
     *  This comes from goog.userAgent.flash.VERSION. Should not be included if
     *  goog.userAgent.flash.HAS_FLASH is false.
     * </pre>
     */
    com.google.protobuf.ByteString
        getFlashVersionBytes();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.BrowserInfo}
   *
   * <pre>
   * Attributes specific to web/mobile browsers.
   *
   *  Next tag: 5
   * </pre>
   */
  public static final class BrowserInfo extends
      com.google.protobuf.GeneratedMessage
      implements BrowserInfoOrBuilder {
    // Use BrowserInfo.newBuilder() to construct.
    private BrowserInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private BrowserInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final BrowserInfo defaultInstance;
    public static BrowserInfo getDefaultInstance() {
      return defaultInstance;
    }

    public BrowserInfo getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private BrowserInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              bitField0_ |= 0x00000001;
              locale_ = input.readBytes();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              browser_ = input.readBytes();
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              browserVersion_ = input.readBytes();
              break;
            }
            case 34: {
              bitField0_ |= 0x00000008;
              flashVersion_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_BrowserInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_BrowserInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.Builder.class);
    }

    public static com.google.protobuf.Parser<BrowserInfo> PARSER =
        new com.google.protobuf.AbstractParser<BrowserInfo>() {
      public BrowserInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new BrowserInfo(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<BrowserInfo> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // optional string locale = 1;
    public static final int LOCALE_FIELD_NUMBER = 1;
    private java.lang.Object locale_;
    /**
     * <code>optional string locale = 1;</code>
     *
     * <pre>
     * Locale of the browser. Usually the same as the Accept-Language header but
     *  can be overridden by the hl query-string parameter.
     * </pre>
     */
    public boolean hasLocale() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional string locale = 1;</code>
     *
     * <pre>
     * Locale of the browser. Usually the same as the Accept-Language header but
     *  can be overridden by the hl query-string parameter.
     * </pre>
     */
    public java.lang.String getLocale() {
      java.lang.Object ref = locale_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          locale_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string locale = 1;</code>
     *
     * <pre>
     * Locale of the browser. Usually the same as the Accept-Language header but
     *  can be overridden by the hl query-string parameter.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getLocaleBytes() {
      java.lang.Object ref = locale_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        locale_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string browser = 2;
    public static final int BROWSER_FIELD_NUMBER = 2;
    private java.lang.Object browser_;
    /**
     * <code>optional string browser = 2;</code>
     *
     * <pre>
     * Name of the browser. This comes from analytics.browserInfo.NAME.
     * </pre>
     */
    public boolean hasBrowser() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string browser = 2;</code>
     *
     * <pre>
     * Name of the browser. This comes from analytics.browserInfo.NAME.
     * </pre>
     */
    public java.lang.String getBrowser() {
      java.lang.Object ref = browser_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          browser_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string browser = 2;</code>
     *
     * <pre>
     * Name of the browser. This comes from analytics.browserInfo.NAME.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getBrowserBytes() {
      java.lang.Object ref = browser_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        browser_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string browser_version = 3;
    public static final int BROWSER_VERSION_FIELD_NUMBER = 3;
    private java.lang.Object browserVersion_;
    /**
     * <code>optional string browser_version = 3;</code>
     *
     * <pre>
     * Version of the browser. This comes from goog.userAgent.product.VERSION.
     * </pre>
     */
    public boolean hasBrowserVersion() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional string browser_version = 3;</code>
     *
     * <pre>
     * Version of the browser. This comes from goog.userAgent.product.VERSION.
     * </pre>
     */
    public java.lang.String getBrowserVersion() {
      java.lang.Object ref = browserVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          browserVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string browser_version = 3;</code>
     *
     * <pre>
     * Version of the browser. This comes from goog.userAgent.product.VERSION.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getBrowserVersionBytes() {
      java.lang.Object ref = browserVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        browserVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string flash_version = 4;
    public static final int FLASH_VERSION_FIELD_NUMBER = 4;
    private java.lang.Object flashVersion_;
    /**
     * <code>optional string flash_version = 4;</code>
     *
     * <pre>
     * Version of flash the browser is using.
     *  This comes from goog.userAgent.flash.VERSION. Should not be included if
     *  goog.userAgent.flash.HAS_FLASH is false.
     * </pre>
     */
    public boolean hasFlashVersion() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional string flash_version = 4;</code>
     *
     * <pre>
     * Version of flash the browser is using.
     *  This comes from goog.userAgent.flash.VERSION. Should not be included if
     *  goog.userAgent.flash.HAS_FLASH is false.
     * </pre>
     */
    public java.lang.String getFlashVersion() {
      java.lang.Object ref = flashVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          flashVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string flash_version = 4;</code>
     *
     * <pre>
     * Version of flash the browser is using.
     *  This comes from goog.userAgent.flash.VERSION. Should not be included if
     *  goog.userAgent.flash.HAS_FLASH is false.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getFlashVersionBytes() {
      java.lang.Object ref = flashVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        flashVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private void initFields() {
      locale_ = "";
      browser_ = "";
      browserVersion_ = "";
      flashVersion_ = "";
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBytes(1, getLocaleBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, getBrowserBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, getBrowserVersionBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBytes(4, getFlashVersionBytes());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(1, getLocaleBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, getBrowserBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, getBrowserVersionBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, getFlashVersionBytes());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.BrowserInfo}
     *
     * <pre>
     * Attributes specific to web/mobile browsers.
     *
     *  Next tag: 5
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_BrowserInfo_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_BrowserInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        locale_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        browser_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        browserVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        flashVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_BrowserInfo_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.locale_ = locale_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.browser_ = browser_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.browserVersion_ = browserVersion_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.flashVersion_ = flashVersion_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.getDefaultInstance()) return this;
        if (other.hasLocale()) {
          bitField0_ |= 0x00000001;
          locale_ = other.locale_;
          onChanged();
        }
        if (other.hasBrowser()) {
          bitField0_ |= 0x00000002;
          browser_ = other.browser_;
          onChanged();
        }
        if (other.hasBrowserVersion()) {
          bitField0_ |= 0x00000004;
          browserVersion_ = other.browserVersion_;
          onChanged();
        }
        if (other.hasFlashVersion()) {
          bitField0_ |= 0x00000008;
          flashVersion_ = other.flashVersion_;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional string locale = 1;
      private java.lang.Object locale_ = "";
      /**
       * <code>optional string locale = 1;</code>
       *
       * <pre>
       * Locale of the browser. Usually the same as the Accept-Language header but
       *  can be overridden by the hl query-string parameter.
       * </pre>
       */
      public boolean hasLocale() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional string locale = 1;</code>
       *
       * <pre>
       * Locale of the browser. Usually the same as the Accept-Language header but
       *  can be overridden by the hl query-string parameter.
       * </pre>
       */
      public java.lang.String getLocale() {
        java.lang.Object ref = locale_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          locale_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string locale = 1;</code>
       *
       * <pre>
       * Locale of the browser. Usually the same as the Accept-Language header but
       *  can be overridden by the hl query-string parameter.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getLocaleBytes() {
        java.lang.Object ref = locale_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          locale_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string locale = 1;</code>
       *
       * <pre>
       * Locale of the browser. Usually the same as the Accept-Language header but
       *  can be overridden by the hl query-string parameter.
       * </pre>
       */
      public Builder setLocale(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        locale_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string locale = 1;</code>
       *
       * <pre>
       * Locale of the browser. Usually the same as the Accept-Language header but
       *  can be overridden by the hl query-string parameter.
       * </pre>
       */
      public Builder clearLocale() {
        bitField0_ = (bitField0_ & ~0x00000001);
        locale_ = getDefaultInstance().getLocale();
        onChanged();
        return this;
      }
      /**
       * <code>optional string locale = 1;</code>
       *
       * <pre>
       * Locale of the browser. Usually the same as the Accept-Language header but
       *  can be overridden by the hl query-string parameter.
       * </pre>
       */
      public Builder setLocaleBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        locale_ = value;
        onChanged();
        return this;
      }

      // optional string browser = 2;
      private java.lang.Object browser_ = "";
      /**
       * <code>optional string browser = 2;</code>
       *
       * <pre>
       * Name of the browser. This comes from analytics.browserInfo.NAME.
       * </pre>
       */
      public boolean hasBrowser() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string browser = 2;</code>
       *
       * <pre>
       * Name of the browser. This comes from analytics.browserInfo.NAME.
       * </pre>
       */
      public java.lang.String getBrowser() {
        java.lang.Object ref = browser_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          browser_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string browser = 2;</code>
       *
       * <pre>
       * Name of the browser. This comes from analytics.browserInfo.NAME.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getBrowserBytes() {
        java.lang.Object ref = browser_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          browser_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string browser = 2;</code>
       *
       * <pre>
       * Name of the browser. This comes from analytics.browserInfo.NAME.
       * </pre>
       */
      public Builder setBrowser(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        browser_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string browser = 2;</code>
       *
       * <pre>
       * Name of the browser. This comes from analytics.browserInfo.NAME.
       * </pre>
       */
      public Builder clearBrowser() {
        bitField0_ = (bitField0_ & ~0x00000002);
        browser_ = getDefaultInstance().getBrowser();
        onChanged();
        return this;
      }
      /**
       * <code>optional string browser = 2;</code>
       *
       * <pre>
       * Name of the browser. This comes from analytics.browserInfo.NAME.
       * </pre>
       */
      public Builder setBrowserBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        browser_ = value;
        onChanged();
        return this;
      }

      // optional string browser_version = 3;
      private java.lang.Object browserVersion_ = "";
      /**
       * <code>optional string browser_version = 3;</code>
       *
       * <pre>
       * Version of the browser. This comes from goog.userAgent.product.VERSION.
       * </pre>
       */
      public boolean hasBrowserVersion() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional string browser_version = 3;</code>
       *
       * <pre>
       * Version of the browser. This comes from goog.userAgent.product.VERSION.
       * </pre>
       */
      public java.lang.String getBrowserVersion() {
        java.lang.Object ref = browserVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          browserVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string browser_version = 3;</code>
       *
       * <pre>
       * Version of the browser. This comes from goog.userAgent.product.VERSION.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getBrowserVersionBytes() {
        java.lang.Object ref = browserVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          browserVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string browser_version = 3;</code>
       *
       * <pre>
       * Version of the browser. This comes from goog.userAgent.product.VERSION.
       * </pre>
       */
      public Builder setBrowserVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        browserVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string browser_version = 3;</code>
       *
       * <pre>
       * Version of the browser. This comes from goog.userAgent.product.VERSION.
       * </pre>
       */
      public Builder clearBrowserVersion() {
        bitField0_ = (bitField0_ & ~0x00000004);
        browserVersion_ = getDefaultInstance().getBrowserVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string browser_version = 3;</code>
       *
       * <pre>
       * Version of the browser. This comes from goog.userAgent.product.VERSION.
       * </pre>
       */
      public Builder setBrowserVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        browserVersion_ = value;
        onChanged();
        return this;
      }

      // optional string flash_version = 4;
      private java.lang.Object flashVersion_ = "";
      /**
       * <code>optional string flash_version = 4;</code>
       *
       * <pre>
       * Version of flash the browser is using.
       *  This comes from goog.userAgent.flash.VERSION. Should not be included if
       *  goog.userAgent.flash.HAS_FLASH is false.
       * </pre>
       */
      public boolean hasFlashVersion() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional string flash_version = 4;</code>
       *
       * <pre>
       * Version of flash the browser is using.
       *  This comes from goog.userAgent.flash.VERSION. Should not be included if
       *  goog.userAgent.flash.HAS_FLASH is false.
       * </pre>
       */
      public java.lang.String getFlashVersion() {
        java.lang.Object ref = flashVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          flashVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string flash_version = 4;</code>
       *
       * <pre>
       * Version of flash the browser is using.
       *  This comes from goog.userAgent.flash.VERSION. Should not be included if
       *  goog.userAgent.flash.HAS_FLASH is false.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getFlashVersionBytes() {
        java.lang.Object ref = flashVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          flashVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string flash_version = 4;</code>
       *
       * <pre>
       * Version of flash the browser is using.
       *  This comes from goog.userAgent.flash.VERSION. Should not be included if
       *  goog.userAgent.flash.HAS_FLASH is false.
       * </pre>
       */
      public Builder setFlashVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        flashVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string flash_version = 4;</code>
       *
       * <pre>
       * Version of flash the browser is using.
       *  This comes from goog.userAgent.flash.VERSION. Should not be included if
       *  goog.userAgent.flash.HAS_FLASH is false.
       * </pre>
       */
      public Builder clearFlashVersion() {
        bitField0_ = (bitField0_ & ~0x00000008);
        flashVersion_ = getDefaultInstance().getFlashVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string flash_version = 4;</code>
       *
       * <pre>
       * Version of flash the browser is using.
       *  This comes from goog.userAgent.flash.VERSION. Should not be included if
       *  goog.userAgent.flash.HAS_FLASH is false.
       * </pre>
       */
      public Builder setFlashVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        flashVersion_ = value;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.BrowserInfo)
    }

    static {
      defaultInstance = new BrowserInfo(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.BrowserInfo)
  }

  public interface DesktopClientInfoOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional string client_id = 1;
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    boolean hasClientId();
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    java.lang.String getClientId();
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    com.google.protobuf.ByteString
        getClientIdBytes();

    // optional string logging_id = 2;
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    boolean hasLoggingId();
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    java.lang.String getLoggingId();
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    com.google.protobuf.ByteString
        getLoggingIdBytes();

    // optional string os = 3;
    /**
     * <code>optional string os = 3;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    boolean hasOs();
    /**
     * <code>optional string os = 3;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    java.lang.String getOs();
    /**
     * <code>optional string os = 3;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    com.google.protobuf.ByteString
        getOsBytes();

    // optional string os_major_version = 4;
    /**
     * <code>optional string os_major_version = 4;</code>
     *
     * <pre>
     * e.g., "10.7", "Vista", "Win7"
     * </pre>
     */
    boolean hasOsMajorVersion();
    /**
     * <code>optional string os_major_version = 4;</code>
     *
     * <pre>
     * e.g., "10.7", "Vista", "Win7"
     * </pre>
     */
    java.lang.String getOsMajorVersion();
    /**
     * <code>optional string os_major_version = 4;</code>
     *
     * <pre>
     * e.g., "10.7", "Vista", "Win7"
     * </pre>
     */
    com.google.protobuf.ByteString
        getOsMajorVersionBytes();

    // optional string os_full_version = 5;
    /**
     * <code>optional string os_full_version = 5;</code>
     *
     * <pre>
     * e.g., "10.7.3", "Win7 SP1"
     * </pre>
     */
    boolean hasOsFullVersion();
    /**
     * <code>optional string os_full_version = 5;</code>
     *
     * <pre>
     * e.g., "10.7.3", "Win7 SP1"
     * </pre>
     */
    java.lang.String getOsFullVersion();
    /**
     * <code>optional string os_full_version = 5;</code>
     *
     * <pre>
     * e.g., "10.7.3", "Win7 SP1"
     * </pre>
     */
    com.google.protobuf.ByteString
        getOsFullVersionBytes();

    // optional string application_build = 6;
    /**
     * <code>optional string application_build = 6;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    boolean hasApplicationBuild();
    /**
     * <code>optional string application_build = 6;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    java.lang.String getApplicationBuild();
    /**
     * <code>optional string application_build = 6;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    com.google.protobuf.ByteString
        getApplicationBuildBytes();

    // optional string country = 7;
    /**
     * <code>optional string country = 7;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    boolean hasCountry();
    /**
     * <code>optional string country = 7;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    java.lang.String getCountry();
    /**
     * <code>optional string country = 7;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    com.google.protobuf.ByteString
        getCountryBytes();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.DesktopClientInfo}
   *
   * <pre>
   * Attributes specific to desktop clients.
   *
   *  Next tag: 8
   * </pre>
   */
  public static final class DesktopClientInfo extends
      com.google.protobuf.GeneratedMessage
      implements DesktopClientInfoOrBuilder {
    // Use DesktopClientInfo.newBuilder() to construct.
    private DesktopClientInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private DesktopClientInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final DesktopClientInfo defaultInstance;
    public static DesktopClientInfo getDefaultInstance() {
      return defaultInstance;
    }

    public DesktopClientInfo getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private DesktopClientInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              bitField0_ |= 0x00000001;
              clientId_ = input.readBytes();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              loggingId_ = input.readBytes();
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              os_ = input.readBytes();
              break;
            }
            case 34: {
              bitField0_ |= 0x00000008;
              osMajorVersion_ = input.readBytes();
              break;
            }
            case 42: {
              bitField0_ |= 0x00000010;
              osFullVersion_ = input.readBytes();
              break;
            }
            case 50: {
              bitField0_ |= 0x00000020;
              applicationBuild_ = input.readBytes();
              break;
            }
            case 58: {
              bitField0_ |= 0x00000040;
              country_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_DesktopClientInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_DesktopClientInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.Builder.class);
    }

    public static com.google.protobuf.Parser<DesktopClientInfo> PARSER =
        new com.google.protobuf.AbstractParser<DesktopClientInfo>() {
      public DesktopClientInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new DesktopClientInfo(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<DesktopClientInfo> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // optional string client_id = 1;
    public static final int CLIENT_ID_FIELD_NUMBER = 1;
    private java.lang.Object clientId_;
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    public boolean hasClientId() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    public java.lang.String getClientId() {
      java.lang.Object ref = clientId_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          clientId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getClientIdBytes() {
      java.lang.Object ref = clientId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        clientId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string logging_id = 2;
    public static final int LOGGING_ID_FIELD_NUMBER = 2;
    private java.lang.Object loggingId_;
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public boolean hasLoggingId() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public java.lang.String getLoggingId() {
      java.lang.Object ref = loggingId_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          loggingId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getLoggingIdBytes() {
      java.lang.Object ref = loggingId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        loggingId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string os = 3;
    public static final int OS_FIELD_NUMBER = 3;
    private java.lang.Object os_;
    /**
     * <code>optional string os = 3;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    public boolean hasOs() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional string os = 3;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    public java.lang.String getOs() {
      java.lang.Object ref = os_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          os_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string os = 3;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    public com.google.protobuf.ByteString
        getOsBytes() {
      java.lang.Object ref = os_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        os_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string os_major_version = 4;
    public static final int OS_MAJOR_VERSION_FIELD_NUMBER = 4;
    private java.lang.Object osMajorVersion_;
    /**
     * <code>optional string os_major_version = 4;</code>
     *
     * <pre>
     * e.g., "10.7", "Vista", "Win7"
     * </pre>
     */
    public boolean hasOsMajorVersion() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional string os_major_version = 4;</code>
     *
     * <pre>
     * e.g., "10.7", "Vista", "Win7"
     * </pre>
     */
    public java.lang.String getOsMajorVersion() {
      java.lang.Object ref = osMajorVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          osMajorVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string os_major_version = 4;</code>
     *
     * <pre>
     * e.g., "10.7", "Vista", "Win7"
     * </pre>
     */
    public com.google.protobuf.ByteString
        getOsMajorVersionBytes() {
      java.lang.Object ref = osMajorVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        osMajorVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string os_full_version = 5;
    public static final int OS_FULL_VERSION_FIELD_NUMBER = 5;
    private java.lang.Object osFullVersion_;
    /**
     * <code>optional string os_full_version = 5;</code>
     *
     * <pre>
     * e.g., "10.7.3", "Win7 SP1"
     * </pre>
     */
    public boolean hasOsFullVersion() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional string os_full_version = 5;</code>
     *
     * <pre>
     * e.g., "10.7.3", "Win7 SP1"
     * </pre>
     */
    public java.lang.String getOsFullVersion() {
      java.lang.Object ref = osFullVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          osFullVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string os_full_version = 5;</code>
     *
     * <pre>
     * e.g., "10.7.3", "Win7 SP1"
     * </pre>
     */
    public com.google.protobuf.ByteString
        getOsFullVersionBytes() {
      java.lang.Object ref = osFullVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        osFullVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string application_build = 6;
    public static final int APPLICATION_BUILD_FIELD_NUMBER = 6;
    private java.lang.Object applicationBuild_;
    /**
     * <code>optional string application_build = 6;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    public boolean hasApplicationBuild() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * <code>optional string application_build = 6;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    public java.lang.String getApplicationBuild() {
      java.lang.Object ref = applicationBuild_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          applicationBuild_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string application_build = 6;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getApplicationBuildBytes() {
      java.lang.Object ref = applicationBuild_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        applicationBuild_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string country = 7;
    public static final int COUNTRY_FIELD_NUMBER = 7;
    private java.lang.Object country_;
    /**
     * <code>optional string country = 7;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    public boolean hasCountry() {
      return ((bitField0_ & 0x00000040) == 0x00000040);
    }
    /**
     * <code>optional string country = 7;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    public java.lang.String getCountry() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          country_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string country = 7;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    public com.google.protobuf.ByteString
        getCountryBytes() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        country_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private void initFields() {
      clientId_ = "";
      loggingId_ = "";
      os_ = "";
      osMajorVersion_ = "";
      osFullVersion_ = "";
      applicationBuild_ = "";
      country_ = "";
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBytes(1, getClientIdBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, getLoggingIdBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, getOsBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBytes(4, getOsMajorVersionBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeBytes(5, getOsFullVersionBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeBytes(6, getApplicationBuildBytes());
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        output.writeBytes(7, getCountryBytes());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(1, getClientIdBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, getLoggingIdBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, getOsBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, getOsMajorVersionBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(5, getOsFullVersionBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(6, getApplicationBuildBytes());
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(7, getCountryBytes());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.DesktopClientInfo}
     *
     * <pre>
     * Attributes specific to desktop clients.
     *
     *  Next tag: 8
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_DesktopClientInfo_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_DesktopClientInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        clientId_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        loggingId_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        os_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        osMajorVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        osFullVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        applicationBuild_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        country_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_DesktopClientInfo_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.clientId_ = clientId_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.loggingId_ = loggingId_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.os_ = os_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.osMajorVersion_ = osMajorVersion_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.osFullVersion_ = osFullVersion_;
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        result.applicationBuild_ = applicationBuild_;
        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
          to_bitField0_ |= 0x00000040;
        }
        result.country_ = country_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.getDefaultInstance()) return this;
        if (other.hasClientId()) {
          bitField0_ |= 0x00000001;
          clientId_ = other.clientId_;
          onChanged();
        }
        if (other.hasLoggingId()) {
          bitField0_ |= 0x00000002;
          loggingId_ = other.loggingId_;
          onChanged();
        }
        if (other.hasOs()) {
          bitField0_ |= 0x00000004;
          os_ = other.os_;
          onChanged();
        }
        if (other.hasOsMajorVersion()) {
          bitField0_ |= 0x00000008;
          osMajorVersion_ = other.osMajorVersion_;
          onChanged();
        }
        if (other.hasOsFullVersion()) {
          bitField0_ |= 0x00000010;
          osFullVersion_ = other.osFullVersion_;
          onChanged();
        }
        if (other.hasApplicationBuild()) {
          bitField0_ |= 0x00000020;
          applicationBuild_ = other.applicationBuild_;
          onChanged();
        }
        if (other.hasCountry()) {
          bitField0_ |= 0x00000040;
          country_ = other.country_;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional string client_id = 1;
      private java.lang.Object clientId_ = "";
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public boolean hasClientId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public java.lang.String getClientId() {
        java.lang.Object ref = clientId_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          clientId_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getClientIdBytes() {
        java.lang.Object ref = clientId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          clientId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public Builder setClientId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        clientId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public Builder clearClientId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        clientId_ = getDefaultInstance().getClientId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public Builder setClientIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        clientId_ = value;
        onChanged();
        return this;
      }

      // optional string logging_id = 2;
      private java.lang.Object loggingId_ = "";
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public boolean hasLoggingId() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public java.lang.String getLoggingId() {
        java.lang.Object ref = loggingId_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          loggingId_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getLoggingIdBytes() {
        java.lang.Object ref = loggingId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          loggingId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder setLoggingId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        loggingId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder clearLoggingId() {
        bitField0_ = (bitField0_ & ~0x00000002);
        loggingId_ = getDefaultInstance().getLoggingId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder setLoggingIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        loggingId_ = value;
        onChanged();
        return this;
      }

      // optional string os = 3;
      private java.lang.Object os_ = "";
      /**
       * <code>optional string os = 3;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public boolean hasOs() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional string os = 3;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public java.lang.String getOs() {
        java.lang.Object ref = os_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          os_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string os = 3;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public com.google.protobuf.ByteString
          getOsBytes() {
        java.lang.Object ref = os_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          os_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string os = 3;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public Builder setOs(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        os_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string os = 3;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public Builder clearOs() {
        bitField0_ = (bitField0_ & ~0x00000004);
        os_ = getDefaultInstance().getOs();
        onChanged();
        return this;
      }
      /**
       * <code>optional string os = 3;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public Builder setOsBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        os_ = value;
        onChanged();
        return this;
      }

      // optional string os_major_version = 4;
      private java.lang.Object osMajorVersion_ = "";
      /**
       * <code>optional string os_major_version = 4;</code>
       *
       * <pre>
       * e.g., "10.7", "Vista", "Win7"
       * </pre>
       */
      public boolean hasOsMajorVersion() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional string os_major_version = 4;</code>
       *
       * <pre>
       * e.g., "10.7", "Vista", "Win7"
       * </pre>
       */
      public java.lang.String getOsMajorVersion() {
        java.lang.Object ref = osMajorVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          osMajorVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string os_major_version = 4;</code>
       *
       * <pre>
       * e.g., "10.7", "Vista", "Win7"
       * </pre>
       */
      public com.google.protobuf.ByteString
          getOsMajorVersionBytes() {
        java.lang.Object ref = osMajorVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          osMajorVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string os_major_version = 4;</code>
       *
       * <pre>
       * e.g., "10.7", "Vista", "Win7"
       * </pre>
       */
      public Builder setOsMajorVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        osMajorVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_major_version = 4;</code>
       *
       * <pre>
       * e.g., "10.7", "Vista", "Win7"
       * </pre>
       */
      public Builder clearOsMajorVersion() {
        bitField0_ = (bitField0_ & ~0x00000008);
        osMajorVersion_ = getDefaultInstance().getOsMajorVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_major_version = 4;</code>
       *
       * <pre>
       * e.g., "10.7", "Vista", "Win7"
       * </pre>
       */
      public Builder setOsMajorVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        osMajorVersion_ = value;
        onChanged();
        return this;
      }

      // optional string os_full_version = 5;
      private java.lang.Object osFullVersion_ = "";
      /**
       * <code>optional string os_full_version = 5;</code>
       *
       * <pre>
       * e.g., "10.7.3", "Win7 SP1"
       * </pre>
       */
      public boolean hasOsFullVersion() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional string os_full_version = 5;</code>
       *
       * <pre>
       * e.g., "10.7.3", "Win7 SP1"
       * </pre>
       */
      public java.lang.String getOsFullVersion() {
        java.lang.Object ref = osFullVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          osFullVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string os_full_version = 5;</code>
       *
       * <pre>
       * e.g., "10.7.3", "Win7 SP1"
       * </pre>
       */
      public com.google.protobuf.ByteString
          getOsFullVersionBytes() {
        java.lang.Object ref = osFullVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          osFullVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string os_full_version = 5;</code>
       *
       * <pre>
       * e.g., "10.7.3", "Win7 SP1"
       * </pre>
       */
      public Builder setOsFullVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        osFullVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_full_version = 5;</code>
       *
       * <pre>
       * e.g., "10.7.3", "Win7 SP1"
       * </pre>
       */
      public Builder clearOsFullVersion() {
        bitField0_ = (bitField0_ & ~0x00000010);
        osFullVersion_ = getDefaultInstance().getOsFullVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_full_version = 5;</code>
       *
       * <pre>
       * e.g., "10.7.3", "Win7 SP1"
       * </pre>
       */
      public Builder setOsFullVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        osFullVersion_ = value;
        onChanged();
        return this;
      }

      // optional string application_build = 6;
      private java.lang.Object applicationBuild_ = "";
      /**
       * <code>optional string application_build = 6;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public boolean hasApplicationBuild() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * <code>optional string application_build = 6;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public java.lang.String getApplicationBuild() {
        java.lang.Object ref = applicationBuild_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          applicationBuild_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string application_build = 6;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getApplicationBuildBytes() {
        java.lang.Object ref = applicationBuild_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          applicationBuild_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string application_build = 6;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public Builder setApplicationBuild(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        applicationBuild_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string application_build = 6;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public Builder clearApplicationBuild() {
        bitField0_ = (bitField0_ & ~0x00000020);
        applicationBuild_ = getDefaultInstance().getApplicationBuild();
        onChanged();
        return this;
      }
      /**
       * <code>optional string application_build = 6;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public Builder setApplicationBuildBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        applicationBuild_ = value;
        onChanged();
        return this;
      }

      // optional string country = 7;
      private java.lang.Object country_ = "";
      /**
       * <code>optional string country = 7;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public boolean hasCountry() {
        return ((bitField0_ & 0x00000040) == 0x00000040);
      }
      /**
       * <code>optional string country = 7;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public java.lang.String getCountry() {
        java.lang.Object ref = country_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          country_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string country = 7;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public com.google.protobuf.ByteString
          getCountryBytes() {
        java.lang.Object ref = country_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          country_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string country = 7;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public Builder setCountry(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        country_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 7;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public Builder clearCountry() {
        bitField0_ = (bitField0_ & ~0x00000040);
        country_ = getDefaultInstance().getCountry();
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 7;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public Builder setCountryBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        country_ = value;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.DesktopClientInfo)
    }

    static {
      defaultInstance = new DesktopClientInfo(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.DesktopClientInfo)
  }

  public interface IosClientInfoOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional string client_id = 1;
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    boolean hasClientId();
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    java.lang.String getClientId();
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    com.google.protobuf.ByteString
        getClientIdBytes();

    // optional string logging_id = 2;
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    boolean hasLoggingId();
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    java.lang.String getLoggingId();
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    com.google.protobuf.ByteString
        getLoggingIdBytes();

    // optional string os_major_version = 3;
    /**
     * <code>optional string os_major_version = 3;</code>
     *
     * <pre>
     * The major OS version of an iOS client.
     * </pre>
     */
    boolean hasOsMajorVersion();
    /**
     * <code>optional string os_major_version = 3;</code>
     *
     * <pre>
     * The major OS version of an iOS client.
     * </pre>
     */
    java.lang.String getOsMajorVersion();
    /**
     * <code>optional string os_major_version = 3;</code>
     *
     * <pre>
     * The major OS version of an iOS client.
     * </pre>
     */
    com.google.protobuf.ByteString
        getOsMajorVersionBytes();

    // optional string os_full_version = 4;
    /**
     * <code>optional string os_full_version = 4;</code>
     *
     * <pre>
     * The minor OS version of an iOS client.
     * </pre>
     */
    boolean hasOsFullVersion();
    /**
     * <code>optional string os_full_version = 4;</code>
     *
     * <pre>
     * The minor OS version of an iOS client.
     * </pre>
     */
    java.lang.String getOsFullVersion();
    /**
     * <code>optional string os_full_version = 4;</code>
     *
     * <pre>
     * The minor OS version of an iOS client.
     * </pre>
     */
    com.google.protobuf.ByteString
        getOsFullVersionBytes();

    // optional string application_build = 5;
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    boolean hasApplicationBuild();
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    java.lang.String getApplicationBuild();
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    com.google.protobuf.ByteString
        getApplicationBuildBytes();

    // optional string country = 6;
    /**
     * <code>optional string country = 6;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  This is typically populated based on the value of:
     *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
     * </pre>
     */
    boolean hasCountry();
    /**
     * <code>optional string country = 6;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  This is typically populated based on the value of:
     *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
     * </pre>
     */
    java.lang.String getCountry();
    /**
     * <code>optional string country = 6;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  This is typically populated based on the value of:
     *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
     * </pre>
     */
    com.google.protobuf.ByteString
        getCountryBytes();

    // optional string model = 7;
    /**
     * <code>optional string model = 7;</code>
     *
     * <pre>
     * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
     *  for iPhone 5s.
     * </pre>
     */
    boolean hasModel();
    /**
     * <code>optional string model = 7;</code>
     *
     * <pre>
     * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
     *  for iPhone 5s.
     * </pre>
     */
    java.lang.String getModel();
    /**
     * <code>optional string model = 7;</code>
     *
     * <pre>
     * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
     *  for iPhone 5s.
     * </pre>
     */
    com.google.protobuf.ByteString
        getModelBytes();

    // optional string language_code = 8;
    /**
     * <code>optional string language_code = 8;</code>
     *
     * <pre>
     * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
     *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
     *  "[language designator]" or "[language designator]-[region designator]"
     *  format based off of what localization is available and displayed to user.
     * </pre>
     */
    boolean hasLanguageCode();
    /**
     * <code>optional string language_code = 8;</code>
     *
     * <pre>
     * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
     *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
     *  "[language designator]" or "[language designator]-[region designator]"
     *  format based off of what localization is available and displayed to user.
     * </pre>
     */
    java.lang.String getLanguageCode();
    /**
     * <code>optional string language_code = 8;</code>
     *
     * <pre>
     * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
     *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
     *  "[language designator]" or "[language designator]-[region designator]"
     *  format based off of what localization is available and displayed to user.
     * </pre>
     */
    com.google.protobuf.ByteString
        getLanguageCodeBytes();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.IosClientInfo}
   *
   * <pre>
   * Attributes specific to iOS clients.
   *
   *  NOTE(vjalan): Fields of this proto are made available as conditions for iOS
   *  client-side experimentation in Heterodyne. Fields which contain PII should be
   *  annotated with experiments.heterodyne.ignore_for_application_properties to
   *  ensure that they cannot be used as conditions.
   *
   *  Next tag: 9
   * </pre>
   */
  public static final class IosClientInfo extends
      com.google.protobuf.GeneratedMessage
      implements IosClientInfoOrBuilder {
    // Use IosClientInfo.newBuilder() to construct.
    private IosClientInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private IosClientInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final IosClientInfo defaultInstance;
    public static IosClientInfo getDefaultInstance() {
      return defaultInstance;
    }

    public IosClientInfo getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private IosClientInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              bitField0_ |= 0x00000001;
              clientId_ = input.readBytes();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              loggingId_ = input.readBytes();
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              osMajorVersion_ = input.readBytes();
              break;
            }
            case 34: {
              bitField0_ |= 0x00000008;
              osFullVersion_ = input.readBytes();
              break;
            }
            case 42: {
              bitField0_ |= 0x00000010;
              applicationBuild_ = input.readBytes();
              break;
            }
            case 50: {
              bitField0_ |= 0x00000020;
              country_ = input.readBytes();
              break;
            }
            case 58: {
              bitField0_ |= 0x00000040;
              model_ = input.readBytes();
              break;
            }
            case 66: {
              bitField0_ |= 0x00000080;
              languageCode_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_IosClientInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_IosClientInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.Builder.class);
    }

    public static com.google.protobuf.Parser<IosClientInfo> PARSER =
        new com.google.protobuf.AbstractParser<IosClientInfo>() {
      public IosClientInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new IosClientInfo(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<IosClientInfo> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // optional string client_id = 1;
    public static final int CLIENT_ID_FIELD_NUMBER = 1;
    private java.lang.Object clientId_;
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    public boolean hasClientId() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    public java.lang.String getClientId() {
      java.lang.Object ref = clientId_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          clientId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getClientIdBytes() {
      java.lang.Object ref = clientId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        clientId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string logging_id = 2;
    public static final int LOGGING_ID_FIELD_NUMBER = 2;
    private java.lang.Object loggingId_;
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public boolean hasLoggingId() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public java.lang.String getLoggingId() {
      java.lang.Object ref = loggingId_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          loggingId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string logging_id = 2;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getLoggingIdBytes() {
      java.lang.Object ref = loggingId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        loggingId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string os_major_version = 3;
    public static final int OS_MAJOR_VERSION_FIELD_NUMBER = 3;
    private java.lang.Object osMajorVersion_;
    /**
     * <code>optional string os_major_version = 3;</code>
     *
     * <pre>
     * The major OS version of an iOS client.
     * </pre>
     */
    public boolean hasOsMajorVersion() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional string os_major_version = 3;</code>
     *
     * <pre>
     * The major OS version of an iOS client.
     * </pre>
     */
    public java.lang.String getOsMajorVersion() {
      java.lang.Object ref = osMajorVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          osMajorVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string os_major_version = 3;</code>
     *
     * <pre>
     * The major OS version of an iOS client.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getOsMajorVersionBytes() {
      java.lang.Object ref = osMajorVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        osMajorVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string os_full_version = 4;
    public static final int OS_FULL_VERSION_FIELD_NUMBER = 4;
    private java.lang.Object osFullVersion_;
    /**
     * <code>optional string os_full_version = 4;</code>
     *
     * <pre>
     * The minor OS version of an iOS client.
     * </pre>
     */
    public boolean hasOsFullVersion() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional string os_full_version = 4;</code>
     *
     * <pre>
     * The minor OS version of an iOS client.
     * </pre>
     */
    public java.lang.String getOsFullVersion() {
      java.lang.Object ref = osFullVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          osFullVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string os_full_version = 4;</code>
     *
     * <pre>
     * The minor OS version of an iOS client.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getOsFullVersionBytes() {
      java.lang.Object ref = osFullVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        osFullVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string application_build = 5;
    public static final int APPLICATION_BUILD_FIELD_NUMBER = 5;
    private java.lang.Object applicationBuild_;
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    public boolean hasApplicationBuild() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    public java.lang.String getApplicationBuild() {
      java.lang.Object ref = applicationBuild_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          applicationBuild_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * The client application version.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getApplicationBuildBytes() {
      java.lang.Object ref = applicationBuild_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        applicationBuild_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string country = 6;
    public static final int COUNTRY_FIELD_NUMBER = 6;
    private java.lang.Object country_;
    /**
     * <code>optional string country = 6;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  This is typically populated based on the value of:
     *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
     * </pre>
     */
    public boolean hasCountry() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * <code>optional string country = 6;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  This is typically populated based on the value of:
     *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
     * </pre>
     */
    public java.lang.String getCountry() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          country_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string country = 6;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  This is typically populated based on the value of:
     *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
     * </pre>
     */
    public com.google.protobuf.ByteString
        getCountryBytes() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        country_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string model = 7;
    public static final int MODEL_FIELD_NUMBER = 7;
    private java.lang.Object model_;
    /**
     * <code>optional string model = 7;</code>
     *
     * <pre>
     * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
     *  for iPhone 5s.
     * </pre>
     */
    public boolean hasModel() {
      return ((bitField0_ & 0x00000040) == 0x00000040);
    }
    /**
     * <code>optional string model = 7;</code>
     *
     * <pre>
     * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
     *  for iPhone 5s.
     * </pre>
     */
    public java.lang.String getModel() {
      java.lang.Object ref = model_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          model_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string model = 7;</code>
     *
     * <pre>
     * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
     *  for iPhone 5s.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getModelBytes() {
      java.lang.Object ref = model_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        model_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string language_code = 8;
    public static final int LANGUAGE_CODE_FIELD_NUMBER = 8;
    private java.lang.Object languageCode_;
    /**
     * <code>optional string language_code = 8;</code>
     *
     * <pre>
     * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
     *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
     *  "[language designator]" or "[language designator]-[region designator]"
     *  format based off of what localization is available and displayed to user.
     * </pre>
     */
    public boolean hasLanguageCode() {
      return ((bitField0_ & 0x00000080) == 0x00000080);
    }
    /**
     * <code>optional string language_code = 8;</code>
     *
     * <pre>
     * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
     *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
     *  "[language designator]" or "[language designator]-[region designator]"
     *  format based off of what localization is available and displayed to user.
     * </pre>
     */
    public java.lang.String getLanguageCode() {
      java.lang.Object ref = languageCode_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          languageCode_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string language_code = 8;</code>
     *
     * <pre>
     * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
     *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
     *  "[language designator]" or "[language designator]-[region designator]"
     *  format based off of what localization is available and displayed to user.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getLanguageCodeBytes() {
      java.lang.Object ref = languageCode_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        languageCode_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private void initFields() {
      clientId_ = "";
      loggingId_ = "";
      osMajorVersion_ = "";
      osFullVersion_ = "";
      applicationBuild_ = "";
      country_ = "";
      model_ = "";
      languageCode_ = "";
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBytes(1, getClientIdBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, getLoggingIdBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, getOsMajorVersionBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBytes(4, getOsFullVersionBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeBytes(5, getApplicationBuildBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeBytes(6, getCountryBytes());
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        output.writeBytes(7, getModelBytes());
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        output.writeBytes(8, getLanguageCodeBytes());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(1, getClientIdBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, getLoggingIdBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, getOsMajorVersionBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, getOsFullVersionBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(5, getApplicationBuildBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(6, getCountryBytes());
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(7, getModelBytes());
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(8, getLanguageCodeBytes());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.IosClientInfo}
     *
     * <pre>
     * Attributes specific to iOS clients.
     *
     *  NOTE(vjalan): Fields of this proto are made available as conditions for iOS
     *  client-side experimentation in Heterodyne. Fields which contain PII should be
     *  annotated with experiments.heterodyne.ignore_for_application_properties to
     *  ensure that they cannot be used as conditions.
     *
     *  Next tag: 9
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_IosClientInfo_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_IosClientInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        clientId_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        loggingId_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        osMajorVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        osFullVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        applicationBuild_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        country_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        model_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        languageCode_ = "";
        bitField0_ = (bitField0_ & ~0x00000080);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_IosClientInfo_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.clientId_ = clientId_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.loggingId_ = loggingId_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.osMajorVersion_ = osMajorVersion_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.osFullVersion_ = osFullVersion_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.applicationBuild_ = applicationBuild_;
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        result.country_ = country_;
        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
          to_bitField0_ |= 0x00000040;
        }
        result.model_ = model_;
        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
          to_bitField0_ |= 0x00000080;
        }
        result.languageCode_ = languageCode_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.getDefaultInstance()) return this;
        if (other.hasClientId()) {
          bitField0_ |= 0x00000001;
          clientId_ = other.clientId_;
          onChanged();
        }
        if (other.hasLoggingId()) {
          bitField0_ |= 0x00000002;
          loggingId_ = other.loggingId_;
          onChanged();
        }
        if (other.hasOsMajorVersion()) {
          bitField0_ |= 0x00000004;
          osMajorVersion_ = other.osMajorVersion_;
          onChanged();
        }
        if (other.hasOsFullVersion()) {
          bitField0_ |= 0x00000008;
          osFullVersion_ = other.osFullVersion_;
          onChanged();
        }
        if (other.hasApplicationBuild()) {
          bitField0_ |= 0x00000010;
          applicationBuild_ = other.applicationBuild_;
          onChanged();
        }
        if (other.hasCountry()) {
          bitField0_ |= 0x00000020;
          country_ = other.country_;
          onChanged();
        }
        if (other.hasModel()) {
          bitField0_ |= 0x00000040;
          model_ = other.model_;
          onChanged();
        }
        if (other.hasLanguageCode()) {
          bitField0_ |= 0x00000080;
          languageCode_ = other.languageCode_;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional string client_id = 1;
      private java.lang.Object clientId_ = "";
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public boolean hasClientId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public java.lang.String getClientId() {
        java.lang.Object ref = clientId_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          clientId_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getClientIdBytes() {
        java.lang.Object ref = clientId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          clientId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public Builder setClientId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        clientId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public Builder clearClientId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        clientId_ = getDefaultInstance().getClientId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII.
       * </pre>
       */
      public Builder setClientIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        clientId_ = value;
        onChanged();
        return this;
      }

      // optional string logging_id = 2;
      private java.lang.Object loggingId_ = "";
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public boolean hasLoggingId() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public java.lang.String getLoggingId() {
        java.lang.Object ref = loggingId_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          loggingId_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getLoggingIdBytes() {
        java.lang.Object ref = loggingId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          loggingId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder setLoggingId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        loggingId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder clearLoggingId() {
        bitField0_ = (bitField0_ & ~0x00000002);
        loggingId_ = getDefaultInstance().getLoggingId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string logging_id = 2;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder setLoggingIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        loggingId_ = value;
        onChanged();
        return this;
      }

      // optional string os_major_version = 3;
      private java.lang.Object osMajorVersion_ = "";
      /**
       * <code>optional string os_major_version = 3;</code>
       *
       * <pre>
       * The major OS version of an iOS client.
       * </pre>
       */
      public boolean hasOsMajorVersion() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional string os_major_version = 3;</code>
       *
       * <pre>
       * The major OS version of an iOS client.
       * </pre>
       */
      public java.lang.String getOsMajorVersion() {
        java.lang.Object ref = osMajorVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          osMajorVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string os_major_version = 3;</code>
       *
       * <pre>
       * The major OS version of an iOS client.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getOsMajorVersionBytes() {
        java.lang.Object ref = osMajorVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          osMajorVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string os_major_version = 3;</code>
       *
       * <pre>
       * The major OS version of an iOS client.
       * </pre>
       */
      public Builder setOsMajorVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        osMajorVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_major_version = 3;</code>
       *
       * <pre>
       * The major OS version of an iOS client.
       * </pre>
       */
      public Builder clearOsMajorVersion() {
        bitField0_ = (bitField0_ & ~0x00000004);
        osMajorVersion_ = getDefaultInstance().getOsMajorVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_major_version = 3;</code>
       *
       * <pre>
       * The major OS version of an iOS client.
       * </pre>
       */
      public Builder setOsMajorVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        osMajorVersion_ = value;
        onChanged();
        return this;
      }

      // optional string os_full_version = 4;
      private java.lang.Object osFullVersion_ = "";
      /**
       * <code>optional string os_full_version = 4;</code>
       *
       * <pre>
       * The minor OS version of an iOS client.
       * </pre>
       */
      public boolean hasOsFullVersion() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional string os_full_version = 4;</code>
       *
       * <pre>
       * The minor OS version of an iOS client.
       * </pre>
       */
      public java.lang.String getOsFullVersion() {
        java.lang.Object ref = osFullVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          osFullVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string os_full_version = 4;</code>
       *
       * <pre>
       * The minor OS version of an iOS client.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getOsFullVersionBytes() {
        java.lang.Object ref = osFullVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          osFullVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string os_full_version = 4;</code>
       *
       * <pre>
       * The minor OS version of an iOS client.
       * </pre>
       */
      public Builder setOsFullVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        osFullVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_full_version = 4;</code>
       *
       * <pre>
       * The minor OS version of an iOS client.
       * </pre>
       */
      public Builder clearOsFullVersion() {
        bitField0_ = (bitField0_ & ~0x00000008);
        osFullVersion_ = getDefaultInstance().getOsFullVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_full_version = 4;</code>
       *
       * <pre>
       * The minor OS version of an iOS client.
       * </pre>
       */
      public Builder setOsFullVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        osFullVersion_ = value;
        onChanged();
        return this;
      }

      // optional string application_build = 5;
      private java.lang.Object applicationBuild_ = "";
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public boolean hasApplicationBuild() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public java.lang.String getApplicationBuild() {
        java.lang.Object ref = applicationBuild_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          applicationBuild_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getApplicationBuildBytes() {
        java.lang.Object ref = applicationBuild_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          applicationBuild_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public Builder setApplicationBuild(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        applicationBuild_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public Builder clearApplicationBuild() {
        bitField0_ = (bitField0_ & ~0x00000010);
        applicationBuild_ = getDefaultInstance().getApplicationBuild();
        onChanged();
        return this;
      }
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * The client application version.
       * </pre>
       */
      public Builder setApplicationBuildBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        applicationBuild_ = value;
        onChanged();
        return this;
      }

      // optional string country = 6;
      private java.lang.Object country_ = "";
      /**
       * <code>optional string country = 6;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  This is typically populated based on the value of:
       *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
       * </pre>
       */
      public boolean hasCountry() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * <code>optional string country = 6;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  This is typically populated based on the value of:
       *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
       * </pre>
       */
      public java.lang.String getCountry() {
        java.lang.Object ref = country_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          country_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string country = 6;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  This is typically populated based on the value of:
       *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
       * </pre>
       */
      public com.google.protobuf.ByteString
          getCountryBytes() {
        java.lang.Object ref = country_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          country_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string country = 6;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  This is typically populated based on the value of:
       *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
       * </pre>
       */
      public Builder setCountry(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        country_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 6;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  This is typically populated based on the value of:
       *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
       * </pre>
       */
      public Builder clearCountry() {
        bitField0_ = (bitField0_ & ~0x00000020);
        country_ = getDefaultInstance().getCountry();
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 6;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  This is typically populated based on the value of:
       *    [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]
       * </pre>
       */
      public Builder setCountryBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        country_ = value;
        onChanged();
        return this;
      }

      // optional string model = 7;
      private java.lang.Object model_ = "";
      /**
       * <code>optional string model = 7;</code>
       *
       * <pre>
       * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
       *  for iPhone 5s.
       * </pre>
       */
      public boolean hasModel() {
        return ((bitField0_ & 0x00000040) == 0x00000040);
      }
      /**
       * <code>optional string model = 7;</code>
       *
       * <pre>
       * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
       *  for iPhone 5s.
       * </pre>
       */
      public java.lang.String getModel() {
        java.lang.Object ref = model_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          model_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string model = 7;</code>
       *
       * <pre>
       * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
       *  for iPhone 5s.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getModelBytes() {
        java.lang.Object ref = model_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          model_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string model = 7;</code>
       *
       * <pre>
       * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
       *  for iPhone 5s.
       * </pre>
       */
      public Builder setModel(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        model_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string model = 7;</code>
       *
       * <pre>
       * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
       *  for iPhone 5s.
       * </pre>
       */
      public Builder clearModel() {
        bitField0_ = (bitField0_ & ~0x00000040);
        model_ = getDefaultInstance().getModel();
        onChanged();
        return this;
      }
      /**
       * <code>optional string model = 7;</code>
       *
       * <pre>
       * The unix name (uname) for the model from an iOS client. e.g., "iPhone6,1"
       *  for iPhone 5s.
       * </pre>
       */
      public Builder setModelBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        model_ = value;
        onChanged();
        return this;
      }

      // optional string language_code = 8;
      private java.lang.Object languageCode_ = "";
      /**
       * <code>optional string language_code = 8;</code>
       *
       * <pre>
       * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
       *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
       *  "[language designator]" or "[language designator]-[region designator]"
       *  format based off of what localization is available and displayed to user.
       * </pre>
       */
      public boolean hasLanguageCode() {
        return ((bitField0_ & 0x00000080) == 0x00000080);
      }
      /**
       * <code>optional string language_code = 8;</code>
       *
       * <pre>
       * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
       *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
       *  "[language designator]" or "[language designator]-[region designator]"
       *  format based off of what localization is available and displayed to user.
       * </pre>
       */
      public java.lang.String getLanguageCode() {
        java.lang.Object ref = languageCode_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          languageCode_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string language_code = 8;</code>
       *
       * <pre>
       * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
       *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
       *  "[language designator]" or "[language designator]-[region designator]"
       *  format based off of what localization is available and displayed to user.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getLanguageCodeBytes() {
        java.lang.Object ref = languageCode_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          languageCode_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string language_code = 8;</code>
       *
       * <pre>
       * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
       *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
       *  "[language designator]" or "[language designator]-[region designator]"
       *  format based off of what localization is available and displayed to user.
       * </pre>
       */
      public Builder setLanguageCode(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        languageCode_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string language_code = 8;</code>
       *
       * <pre>
       * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
       *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
       *  "[language designator]" or "[language designator]-[region designator]"
       *  format based off of what localization is available and displayed to user.
       * </pre>
       */
      public Builder clearLanguageCode() {
        bitField0_ = (bitField0_ & ~0x00000080);
        languageCode_ = getDefaultInstance().getLanguageCode();
        onChanged();
        return this;
      }
      /**
       * <code>optional string language_code = 8;</code>
       *
       * <pre>
       * The current language displayed to user. e.g., "en", "fr", "en-AU", or "de"
       *  This comes from [[NSBundle mainBundle] preferredLocalizations]; and is:
       *  "[language designator]" or "[language designator]-[region designator]"
       *  format based off of what localization is available and displayed to user.
       * </pre>
       */
      public Builder setLanguageCodeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        languageCode_ = value;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.IosClientInfo)
    }

    static {
      defaultInstance = new IosClientInfo(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.IosClientInfo)
  }

  public interface PancettaClientInfoOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional string device_id = 1;
    /**
     * <code>optional string device_id = 1;</code>
     *
     * <pre>
     * Device ID that should be considered PII. This should only be filled by
     *  Pancetta's headless network access point which is manufactured and
     *  distributed by Google.
     * </pre>
     */
    boolean hasDeviceId();
    /**
     * <code>optional string device_id = 1;</code>
     *
     * <pre>
     * Device ID that should be considered PII. This should only be filled by
     *  Pancetta's headless network access point which is manufactured and
     *  distributed by Google.
     * </pre>
     */
    java.lang.String getDeviceId();
    /**
     * <code>optional string device_id = 1;</code>
     *
     * <pre>
     * Device ID that should be considered PII. This should only be filled by
     *  Pancetta's headless network access point which is manufactured and
     *  distributed by Google.
     * </pre>
     */
    com.google.protobuf.ByteString
        getDeviceIdBytes();

    // optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;
    /**
     * <code>optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;</code>
     *
     * <pre>
     * The OS that Chrome is running on.
     * </pre>
     */
    boolean hasOs();
    /**
     * <code>optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;</code>
     *
     * <pre>
     * The OS that Chrome is running on.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType getOs();

    // optional string app_id = 3;
    /**
     * <code>optional string app_id = 3;</code>
     *
     * <pre>
     * The Chrome app id.
     * </pre>
     */
    boolean hasAppId();
    /**
     * <code>optional string app_id = 3;</code>
     *
     * <pre>
     * The Chrome app id.
     * </pre>
     */
    java.lang.String getAppId();
    /**
     * <code>optional string app_id = 3;</code>
     *
     * <pre>
     * The Chrome app id.
     * </pre>
     */
    com.google.protobuf.ByteString
        getAppIdBytes();

    // optional string app_version = 4;
    /**
     * <code>optional string app_version = 4;</code>
     *
     * <pre>
     * The Chrome app version.
     * </pre>
     */
    boolean hasAppVersion();
    /**
     * <code>optional string app_version = 4;</code>
     *
     * <pre>
     * The Chrome app version.
     * </pre>
     */
    java.lang.String getAppVersion();
    /**
     * <code>optional string app_version = 4;</code>
     *
     * <pre>
     * The Chrome app version.
     * </pre>
     */
    com.google.protobuf.ByteString
        getAppVersionBytes();

    // optional string mcc_mnc = 5;
    /**
     * <code>optional string mcc_mnc = 5;</code>
     *
     * <pre>
     * Optional. Mobile Country Code and Mobile Network Code if possible.
     *  This is for the headless network access point.
     * </pre>
     */
    boolean hasMccMnc();
    /**
     * <code>optional string mcc_mnc = 5;</code>
     *
     * <pre>
     * Optional. Mobile Country Code and Mobile Network Code if possible.
     *  This is for the headless network access point.
     * </pre>
     */
    java.lang.String getMccMnc();
    /**
     * <code>optional string mcc_mnc = 5;</code>
     *
     * <pre>
     * Optional. Mobile Country Code and Mobile Network Code if possible.
     *  This is for the headless network access point.
     * </pre>
     */
    com.google.protobuf.ByteString
        getMccMncBytes();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.PancettaClientInfo}
   *
   * <pre>
   * Attributes specific to Pancetta Chrome app clients. Pancetta clients will be
   *  Chrome apps running on desktops or a headless network access point. The apps
   *  are used to upload data from wearables to Pancetta servers.
   *
   *  Next tag: 6
   * </pre>
   */
  public static final class PancettaClientInfo extends
      com.google.protobuf.GeneratedMessage
      implements PancettaClientInfoOrBuilder {
    // Use PancettaClientInfo.newBuilder() to construct.
    private PancettaClientInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private PancettaClientInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final PancettaClientInfo defaultInstance;
    public static PancettaClientInfo getDefaultInstance() {
      return defaultInstance;
    }

    public PancettaClientInfo getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private PancettaClientInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              bitField0_ |= 0x00000001;
              deviceId_ = input.readBytes();
              break;
            }
            case 16: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(2, rawValue);
              } else {
                bitField0_ |= 0x00000002;
                os_ = value;
              }
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              appId_ = input.readBytes();
              break;
            }
            case 34: {
              bitField0_ |= 0x00000008;
              appVersion_ = input.readBytes();
              break;
            }
            case 42: {
              bitField0_ |= 0x00000010;
              mccMnc_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_PancettaClientInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_PancettaClientInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.Builder.class);
    }

    public static com.google.protobuf.Parser<PancettaClientInfo> PARSER =
        new com.google.protobuf.AbstractParser<PancettaClientInfo>() {
      public PancettaClientInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new PancettaClientInfo(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<PancettaClientInfo> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.PancettaClientInfo.OsType}
     *
     * <pre>
     * Operating system.
     *  Next tag: 7
     * </pre>
     */
    public enum OsType
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>OS_TYPE_UNKNOWN = 0;</code>
       */
      OS_TYPE_UNKNOWN(0, 0),
      /**
       * <code>OS_TYPE_MAC = 1;</code>
       */
      OS_TYPE_MAC(1, 1),
      /**
       * <code>OS_TYPE_WINDOWS = 2;</code>
       */
      OS_TYPE_WINDOWS(2, 2),
      /**
       * <code>OS_TYPE_ANDROID = 3;</code>
       */
      OS_TYPE_ANDROID(3, 3),
      /**
       * <code>OS_TYPE_CROS = 4;</code>
       */
      OS_TYPE_CROS(4, 4),
      /**
       * <code>OS_TYPE_LINUX = 5;</code>
       */
      OS_TYPE_LINUX(5, 5),
      /**
       * <code>OS_TYPE_OPENBSD = 6;</code>
       */
      OS_TYPE_OPENBSD(6, 6),
      ;

      /**
       * <code>OS_TYPE_UNKNOWN = 0;</code>
       */
      public static final int OS_TYPE_UNKNOWN_VALUE = 0;
      /**
       * <code>OS_TYPE_MAC = 1;</code>
       */
      public static final int OS_TYPE_MAC_VALUE = 1;
      /**
       * <code>OS_TYPE_WINDOWS = 2;</code>
       */
      public static final int OS_TYPE_WINDOWS_VALUE = 2;
      /**
       * <code>OS_TYPE_ANDROID = 3;</code>
       */
      public static final int OS_TYPE_ANDROID_VALUE = 3;
      /**
       * <code>OS_TYPE_CROS = 4;</code>
       */
      public static final int OS_TYPE_CROS_VALUE = 4;
      /**
       * <code>OS_TYPE_LINUX = 5;</code>
       */
      public static final int OS_TYPE_LINUX_VALUE = 5;
      /**
       * <code>OS_TYPE_OPENBSD = 6;</code>
       */
      public static final int OS_TYPE_OPENBSD_VALUE = 6;


      public final int getNumber() { return value; }

      public static OsType valueOf(int value) {
        switch (value) {
          case 0: return OS_TYPE_UNKNOWN;
          case 1: return OS_TYPE_MAC;
          case 2: return OS_TYPE_WINDOWS;
          case 3: return OS_TYPE_ANDROID;
          case 4: return OS_TYPE_CROS;
          case 5: return OS_TYPE_LINUX;
          case 6: return OS_TYPE_OPENBSD;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<OsType>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<OsType>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<OsType>() {
              public OsType findValueByNumber(int number) {
                return OsType.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.getDescriptor().getEnumTypes().get(0);
      }

      private static final OsType[] VALUES = values();

      public static OsType valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private OsType(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.PancettaClientInfo.OsType)
    }

    private int bitField0_;
    // optional string device_id = 1;
    public static final int DEVICE_ID_FIELD_NUMBER = 1;
    private java.lang.Object deviceId_;
    /**
     * <code>optional string device_id = 1;</code>
     *
     * <pre>
     * Device ID that should be considered PII. This should only be filled by
     *  Pancetta's headless network access point which is manufactured and
     *  distributed by Google.
     * </pre>
     */
    public boolean hasDeviceId() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional string device_id = 1;</code>
     *
     * <pre>
     * Device ID that should be considered PII. This should only be filled by
     *  Pancetta's headless network access point which is manufactured and
     *  distributed by Google.
     * </pre>
     */
    public java.lang.String getDeviceId() {
      java.lang.Object ref = deviceId_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          deviceId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string device_id = 1;</code>
     *
     * <pre>
     * Device ID that should be considered PII. This should only be filled by
     *  Pancetta's headless network access point which is manufactured and
     *  distributed by Google.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getDeviceIdBytes() {
      java.lang.Object ref = deviceId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        deviceId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;
    public static final int OS_FIELD_NUMBER = 2;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType os_;
    /**
     * <code>optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;</code>
     *
     * <pre>
     * The OS that Chrome is running on.
     * </pre>
     */
    public boolean hasOs() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;</code>
     *
     * <pre>
     * The OS that Chrome is running on.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType getOs() {
      return os_;
    }

    // optional string app_id = 3;
    public static final int APP_ID_FIELD_NUMBER = 3;
    private java.lang.Object appId_;
    /**
     * <code>optional string app_id = 3;</code>
     *
     * <pre>
     * The Chrome app id.
     * </pre>
     */
    public boolean hasAppId() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional string app_id = 3;</code>
     *
     * <pre>
     * The Chrome app id.
     * </pre>
     */
    public java.lang.String getAppId() {
      java.lang.Object ref = appId_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          appId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string app_id = 3;</code>
     *
     * <pre>
     * The Chrome app id.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getAppIdBytes() {
      java.lang.Object ref = appId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        appId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string app_version = 4;
    public static final int APP_VERSION_FIELD_NUMBER = 4;
    private java.lang.Object appVersion_;
    /**
     * <code>optional string app_version = 4;</code>
     *
     * <pre>
     * The Chrome app version.
     * </pre>
     */
    public boolean hasAppVersion() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional string app_version = 4;</code>
     *
     * <pre>
     * The Chrome app version.
     * </pre>
     */
    public java.lang.String getAppVersion() {
      java.lang.Object ref = appVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          appVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string app_version = 4;</code>
     *
     * <pre>
     * The Chrome app version.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getAppVersionBytes() {
      java.lang.Object ref = appVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        appVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string mcc_mnc = 5;
    public static final int MCC_MNC_FIELD_NUMBER = 5;
    private java.lang.Object mccMnc_;
    /**
     * <code>optional string mcc_mnc = 5;</code>
     *
     * <pre>
     * Optional. Mobile Country Code and Mobile Network Code if possible.
     *  This is for the headless network access point.
     * </pre>
     */
    public boolean hasMccMnc() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional string mcc_mnc = 5;</code>
     *
     * <pre>
     * Optional. Mobile Country Code and Mobile Network Code if possible.
     *  This is for the headless network access point.
     * </pre>
     */
    public java.lang.String getMccMnc() {
      java.lang.Object ref = mccMnc_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          mccMnc_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string mcc_mnc = 5;</code>
     *
     * <pre>
     * Optional. Mobile Country Code and Mobile Network Code if possible.
     *  This is for the headless network access point.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getMccMncBytes() {
      java.lang.Object ref = mccMnc_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        mccMnc_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private void initFields() {
      deviceId_ = "";
      os_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType.OS_TYPE_UNKNOWN;
      appId_ = "";
      appVersion_ = "";
      mccMnc_ = "";
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBytes(1, getDeviceIdBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeEnum(2, os_.getNumber());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, getAppIdBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBytes(4, getAppVersionBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeBytes(5, getMccMncBytes());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(1, getDeviceIdBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(2, os_.getNumber());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, getAppIdBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, getAppVersionBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(5, getMccMncBytes());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.PancettaClientInfo}
     *
     * <pre>
     * Attributes specific to Pancetta Chrome app clients. Pancetta clients will be
     *  Chrome apps running on desktops or a headless network access point. The apps
     *  are used to upload data from wearables to Pancetta servers.
     *
     *  Next tag: 6
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_PancettaClientInfo_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_PancettaClientInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        deviceId_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        os_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType.OS_TYPE_UNKNOWN;
        bitField0_ = (bitField0_ & ~0x00000002);
        appId_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        appVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        mccMnc_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_PancettaClientInfo_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.deviceId_ = deviceId_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.os_ = os_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.appId_ = appId_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.appVersion_ = appVersion_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.mccMnc_ = mccMnc_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.getDefaultInstance()) return this;
        if (other.hasDeviceId()) {
          bitField0_ |= 0x00000001;
          deviceId_ = other.deviceId_;
          onChanged();
        }
        if (other.hasOs()) {
          setOs(other.getOs());
        }
        if (other.hasAppId()) {
          bitField0_ |= 0x00000004;
          appId_ = other.appId_;
          onChanged();
        }
        if (other.hasAppVersion()) {
          bitField0_ |= 0x00000008;
          appVersion_ = other.appVersion_;
          onChanged();
        }
        if (other.hasMccMnc()) {
          bitField0_ |= 0x00000010;
          mccMnc_ = other.mccMnc_;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional string device_id = 1;
      private java.lang.Object deviceId_ = "";
      /**
       * <code>optional string device_id = 1;</code>
       *
       * <pre>
       * Device ID that should be considered PII. This should only be filled by
       *  Pancetta's headless network access point which is manufactured and
       *  distributed by Google.
       * </pre>
       */
      public boolean hasDeviceId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional string device_id = 1;</code>
       *
       * <pre>
       * Device ID that should be considered PII. This should only be filled by
       *  Pancetta's headless network access point which is manufactured and
       *  distributed by Google.
       * </pre>
       */
      public java.lang.String getDeviceId() {
        java.lang.Object ref = deviceId_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          deviceId_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string device_id = 1;</code>
       *
       * <pre>
       * Device ID that should be considered PII. This should only be filled by
       *  Pancetta's headless network access point which is manufactured and
       *  distributed by Google.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getDeviceIdBytes() {
        java.lang.Object ref = deviceId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          deviceId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string device_id = 1;</code>
       *
       * <pre>
       * Device ID that should be considered PII. This should only be filled by
       *  Pancetta's headless network access point which is manufactured and
       *  distributed by Google.
       * </pre>
       */
      public Builder setDeviceId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        deviceId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string device_id = 1;</code>
       *
       * <pre>
       * Device ID that should be considered PII. This should only be filled by
       *  Pancetta's headless network access point which is manufactured and
       *  distributed by Google.
       * </pre>
       */
      public Builder clearDeviceId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        deviceId_ = getDefaultInstance().getDeviceId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string device_id = 1;</code>
       *
       * <pre>
       * Device ID that should be considered PII. This should only be filled by
       *  Pancetta's headless network access point which is manufactured and
       *  distributed by Google.
       * </pre>
       */
      public Builder setDeviceIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        deviceId_ = value;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType os_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType.OS_TYPE_UNKNOWN;
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;</code>
       *
       * <pre>
       * The OS that Chrome is running on.
       * </pre>
       */
      public boolean hasOs() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;</code>
       *
       * <pre>
       * The OS that Chrome is running on.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType getOs() {
        return os_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;</code>
       *
       * <pre>
       * The OS that Chrome is running on.
       * </pre>
       */
      public Builder setOs(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000002;
        os_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo.OsType os = 2;</code>
       *
       * <pre>
       * The OS that Chrome is running on.
       * </pre>
       */
      public Builder clearOs() {
        bitField0_ = (bitField0_ & ~0x00000002);
        os_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.OsType.OS_TYPE_UNKNOWN;
        onChanged();
        return this;
      }

      // optional string app_id = 3;
      private java.lang.Object appId_ = "";
      /**
       * <code>optional string app_id = 3;</code>
       *
       * <pre>
       * The Chrome app id.
       * </pre>
       */
      public boolean hasAppId() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional string app_id = 3;</code>
       *
       * <pre>
       * The Chrome app id.
       * </pre>
       */
      public java.lang.String getAppId() {
        java.lang.Object ref = appId_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          appId_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string app_id = 3;</code>
       *
       * <pre>
       * The Chrome app id.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getAppIdBytes() {
        java.lang.Object ref = appId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          appId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string app_id = 3;</code>
       *
       * <pre>
       * The Chrome app id.
       * </pre>
       */
      public Builder setAppId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        appId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string app_id = 3;</code>
       *
       * <pre>
       * The Chrome app id.
       * </pre>
       */
      public Builder clearAppId() {
        bitField0_ = (bitField0_ & ~0x00000004);
        appId_ = getDefaultInstance().getAppId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string app_id = 3;</code>
       *
       * <pre>
       * The Chrome app id.
       * </pre>
       */
      public Builder setAppIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        appId_ = value;
        onChanged();
        return this;
      }

      // optional string app_version = 4;
      private java.lang.Object appVersion_ = "";
      /**
       * <code>optional string app_version = 4;</code>
       *
       * <pre>
       * The Chrome app version.
       * </pre>
       */
      public boolean hasAppVersion() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional string app_version = 4;</code>
       *
       * <pre>
       * The Chrome app version.
       * </pre>
       */
      public java.lang.String getAppVersion() {
        java.lang.Object ref = appVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          appVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string app_version = 4;</code>
       *
       * <pre>
       * The Chrome app version.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getAppVersionBytes() {
        java.lang.Object ref = appVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          appVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string app_version = 4;</code>
       *
       * <pre>
       * The Chrome app version.
       * </pre>
       */
      public Builder setAppVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        appVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string app_version = 4;</code>
       *
       * <pre>
       * The Chrome app version.
       * </pre>
       */
      public Builder clearAppVersion() {
        bitField0_ = (bitField0_ & ~0x00000008);
        appVersion_ = getDefaultInstance().getAppVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string app_version = 4;</code>
       *
       * <pre>
       * The Chrome app version.
       * </pre>
       */
      public Builder setAppVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        appVersion_ = value;
        onChanged();
        return this;
      }

      // optional string mcc_mnc = 5;
      private java.lang.Object mccMnc_ = "";
      /**
       * <code>optional string mcc_mnc = 5;</code>
       *
       * <pre>
       * Optional. Mobile Country Code and Mobile Network Code if possible.
       *  This is for the headless network access point.
       * </pre>
       */
      public boolean hasMccMnc() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional string mcc_mnc = 5;</code>
       *
       * <pre>
       * Optional. Mobile Country Code and Mobile Network Code if possible.
       *  This is for the headless network access point.
       * </pre>
       */
      public java.lang.String getMccMnc() {
        java.lang.Object ref = mccMnc_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          mccMnc_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string mcc_mnc = 5;</code>
       *
       * <pre>
       * Optional. Mobile Country Code and Mobile Network Code if possible.
       *  This is for the headless network access point.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getMccMncBytes() {
        java.lang.Object ref = mccMnc_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          mccMnc_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string mcc_mnc = 5;</code>
       *
       * <pre>
       * Optional. Mobile Country Code and Mobile Network Code if possible.
       *  This is for the headless network access point.
       * </pre>
       */
      public Builder setMccMnc(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        mccMnc_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string mcc_mnc = 5;</code>
       *
       * <pre>
       * Optional. Mobile Country Code and Mobile Network Code if possible.
       *  This is for the headless network access point.
       * </pre>
       */
      public Builder clearMccMnc() {
        bitField0_ = (bitField0_ & ~0x00000010);
        mccMnc_ = getDefaultInstance().getMccMnc();
        onChanged();
        return this;
      }
      /**
       * <code>optional string mcc_mnc = 5;</code>
       *
       * <pre>
       * Optional. Mobile Country Code and Mobile Network Code if possible.
       *  This is for the headless network access point.
       * </pre>
       */
      public Builder setMccMncBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        mccMnc_ = value;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.PancettaClientInfo)
    }

    static {
      defaultInstance = new PancettaClientInfo(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.PancettaClientInfo)
  }

  public interface PlayCeClientInfoOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional string client_id = 1;
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII. This is the device serial number
     *  or another device identifier that, together with make and model, uniquely
     *  identifies the device.
     * </pre>
     */
    boolean hasClientId();
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII. This is the device serial number
     *  or another device identifier that, together with make and model, uniquely
     *  identifies the device.
     * </pre>
     */
    java.lang.String getClientId();
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII. This is the device serial number
     *  or another device identifier that, together with make and model, uniquely
     *  identifies the device.
     * </pre>
     */
    com.google.protobuf.ByteString
        getClientIdBytes();

    // optional string logging_id = 7;
    /**
     * <code>optional string logging_id = 7;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    boolean hasLoggingId();
    /**
     * <code>optional string logging_id = 7;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    java.lang.String getLoggingId();
    /**
     * <code>optional string logging_id = 7;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    com.google.protobuf.ByteString
        getLoggingIdBytes();

    // optional string make = 3;
    /**
     * <code>optional string make = 3;</code>
     *
     * <pre>
     * Device make. E.g.: samsung, lge, google, sony, microsoft.
     *  Case insensitive. RoKu==roku.
     * </pre>
     */
    boolean hasMake();
    /**
     * <code>optional string make = 3;</code>
     *
     * <pre>
     * Device make. E.g.: samsung, lge, google, sony, microsoft.
     *  Case insensitive. RoKu==roku.
     * </pre>
     */
    java.lang.String getMake();
    /**
     * <code>optional string make = 3;</code>
     *
     * <pre>
     * Device make. E.g.: samsung, lge, google, sony, microsoft.
     *  Case insensitive. RoKu==roku.
     * </pre>
     */
    com.google.protobuf.ByteString
        getMakeBytes();

    // optional string model = 4;
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
     * </pre>
     */
    boolean hasModel();
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
     * </pre>
     */
    java.lang.String getModel();
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
     * </pre>
     */
    com.google.protobuf.ByteString
        getModelBytes();

    // optional string application_build = 5;
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * App version/build. Each application defines it for itself.
     *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
     *  combination of BrightScript and C++ code compiled for mips
     *  from the git snapshot of the GPM app at the given time (20140708-171921).
     * </pre>
     */
    boolean hasApplicationBuild();
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * App version/build. Each application defines it for itself.
     *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
     *  combination of BrightScript and C++ code compiled for mips
     *  from the git snapshot of the GPM app at the given time (20140708-171921).
     * </pre>
     */
    java.lang.String getApplicationBuild();
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * App version/build. Each application defines it for itself.
     *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
     *  combination of BrightScript and C++ code compiled for mips
     *  from the git snapshot of the GPM app at the given time (20140708-171921).
     * </pre>
     */
    com.google.protobuf.ByteString
        getApplicationBuildBytes();

    // optional string platform_version = 6;
    /**
     * <code>optional string platform_version = 6;</code>
     *
     * <pre>
     * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
     *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
     *  5.5).
     * </pre>
     */
    boolean hasPlatformVersion();
    /**
     * <code>optional string platform_version = 6;</code>
     *
     * <pre>
     * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
     *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
     *  5.5).
     * </pre>
     */
    java.lang.String getPlatformVersion();
    /**
     * <code>optional string platform_version = 6;</code>
     *
     * <pre>
     * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
     *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
     *  5.5).
     * </pre>
     */
    com.google.protobuf.ByteString
        getPlatformVersionBytes();

    // optional string country = 8;
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    boolean hasCountry();
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    java.lang.String getCountry();
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    com.google.protobuf.ByteString
        getCountryBytes();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.PlayCeClientInfo}
   *
   * <pre>
   * Attributes specific to third-party CE devices.
   *   CE devices scope
   *  - Roku
   *  - Smart TV (Non Android-TV)
   *  - PlayStation 3/4
   *  - XBox 360/One
   *
   *  We do not specify types of devices since it is defined by the pair of
   *  device_make and device_model (e.g.: make=roku + model=2500X = streaming box,
   *  make=lge + model=42LN5700 = Smart TV, make=tivo + model=roamio = Set Top Box)
   *  Next tag: 9
   * </pre>
   */
  public static final class PlayCeClientInfo extends
      com.google.protobuf.GeneratedMessage
      implements PlayCeClientInfoOrBuilder {
    // Use PlayCeClientInfo.newBuilder() to construct.
    private PlayCeClientInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private PlayCeClientInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final PlayCeClientInfo defaultInstance;
    public static PlayCeClientInfo getDefaultInstance() {
      return defaultInstance;
    }

    public PlayCeClientInfo getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private PlayCeClientInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              bitField0_ |= 0x00000001;
              clientId_ = input.readBytes();
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              make_ = input.readBytes();
              break;
            }
            case 34: {
              bitField0_ |= 0x00000008;
              model_ = input.readBytes();
              break;
            }
            case 42: {
              bitField0_ |= 0x00000010;
              applicationBuild_ = input.readBytes();
              break;
            }
            case 50: {
              bitField0_ |= 0x00000020;
              platformVersion_ = input.readBytes();
              break;
            }
            case 58: {
              bitField0_ |= 0x00000002;
              loggingId_ = input.readBytes();
              break;
            }
            case 66: {
              bitField0_ |= 0x00000040;
              country_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_PlayCeClientInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_PlayCeClientInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.Builder.class);
    }

    public static com.google.protobuf.Parser<PlayCeClientInfo> PARSER =
        new com.google.protobuf.AbstractParser<PlayCeClientInfo>() {
      public PlayCeClientInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new PlayCeClientInfo(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<PlayCeClientInfo> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // optional string client_id = 1;
    public static final int CLIENT_ID_FIELD_NUMBER = 1;
    private java.lang.Object clientId_;
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII. This is the device serial number
     *  or another device identifier that, together with make and model, uniquely
     *  identifies the device.
     * </pre>
     */
    public boolean hasClientId() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII. This is the device serial number
     *  or another device identifier that, together with make and model, uniquely
     *  identifies the device.
     * </pre>
     */
    public java.lang.String getClientId() {
      java.lang.Object ref = clientId_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          clientId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string client_id = 1;</code>
     *
     * <pre>
     * Sticky ID that should be considered PII. This is the device serial number
     *  or another device identifier that, together with make and model, uniquely
     *  identifies the device.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getClientIdBytes() {
      java.lang.Object ref = clientId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        clientId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string logging_id = 7;
    public static final int LOGGING_ID_FIELD_NUMBER = 7;
    private java.lang.Object loggingId_;
    /**
     * <code>optional string logging_id = 7;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public boolean hasLoggingId() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string logging_id = 7;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public java.lang.String getLoggingId() {
      java.lang.Object ref = loggingId_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          loggingId_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string logging_id = 7;</code>
     *
     * <pre>
     * Pseudonymous, random id (sticky) per device.  May only be logged in temp
     *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getLoggingIdBytes() {
      java.lang.Object ref = loggingId_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        loggingId_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string make = 3;
    public static final int MAKE_FIELD_NUMBER = 3;
    private java.lang.Object make_;
    /**
     * <code>optional string make = 3;</code>
     *
     * <pre>
     * Device make. E.g.: samsung, lge, google, sony, microsoft.
     *  Case insensitive. RoKu==roku.
     * </pre>
     */
    public boolean hasMake() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional string make = 3;</code>
     *
     * <pre>
     * Device make. E.g.: samsung, lge, google, sony, microsoft.
     *  Case insensitive. RoKu==roku.
     * </pre>
     */
    public java.lang.String getMake() {
      java.lang.Object ref = make_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          make_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string make = 3;</code>
     *
     * <pre>
     * Device make. E.g.: samsung, lge, google, sony, microsoft.
     *  Case insensitive. RoKu==roku.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getMakeBytes() {
      java.lang.Object ref = make_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        make_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string model = 4;
    public static final int MODEL_FIELD_NUMBER = 4;
    private java.lang.Object model_;
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
     * </pre>
     */
    public boolean hasModel() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
     * </pre>
     */
    public java.lang.String getModel() {
      java.lang.Object ref = model_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          model_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string model = 4;</code>
     *
     * <pre>
     * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getModelBytes() {
      java.lang.Object ref = model_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        model_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string application_build = 5;
    public static final int APPLICATION_BUILD_FIELD_NUMBER = 5;
    private java.lang.Object applicationBuild_;
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * App version/build. Each application defines it for itself.
     *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
     *  combination of BrightScript and C++ code compiled for mips
     *  from the git snapshot of the GPM app at the given time (20140708-171921).
     * </pre>
     */
    public boolean hasApplicationBuild() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * App version/build. Each application defines it for itself.
     *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
     *  combination of BrightScript and C++ code compiled for mips
     *  from the git snapshot of the GPM app at the given time (20140708-171921).
     * </pre>
     */
    public java.lang.String getApplicationBuild() {
      java.lang.Object ref = applicationBuild_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          applicationBuild_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string application_build = 5;</code>
     *
     * <pre>
     * App version/build. Each application defines it for itself.
     *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
     *  combination of BrightScript and C++ code compiled for mips
     *  from the git snapshot of the GPM app at the given time (20140708-171921).
     * </pre>
     */
    public com.google.protobuf.ByteString
        getApplicationBuildBytes() {
      java.lang.Object ref = applicationBuild_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        applicationBuild_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string platform_version = 6;
    public static final int PLATFORM_VERSION_FIELD_NUMBER = 6;
    private java.lang.Object platformVersion_;
    /**
     * <code>optional string platform_version = 6;</code>
     *
     * <pre>
     * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
     *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
     *  5.5).
     * </pre>
     */
    public boolean hasPlatformVersion() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * <code>optional string platform_version = 6;</code>
     *
     * <pre>
     * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
     *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
     *  5.5).
     * </pre>
     */
    public java.lang.String getPlatformVersion() {
      java.lang.Object ref = platformVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          platformVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string platform_version = 6;</code>
     *
     * <pre>
     * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
     *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
     *  5.5).
     * </pre>
     */
    public com.google.protobuf.ByteString
        getPlatformVersionBytes() {
      java.lang.Object ref = platformVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        platformVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string country = 8;
    public static final int COUNTRY_FIELD_NUMBER = 8;
    private java.lang.Object country_;
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    public boolean hasCountry() {
      return ((bitField0_ & 0x00000040) == 0x00000040);
    }
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    public java.lang.String getCountry() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          country_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     *  Where this comes from is currently app-specific
     * </pre>
     */
    public com.google.protobuf.ByteString
        getCountryBytes() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        country_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private void initFields() {
      clientId_ = "";
      loggingId_ = "";
      make_ = "";
      model_ = "";
      applicationBuild_ = "";
      platformVersion_ = "";
      country_ = "";
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBytes(1, getClientIdBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, getMakeBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBytes(4, getModelBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeBytes(5, getApplicationBuildBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeBytes(6, getPlatformVersionBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(7, getLoggingIdBytes());
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        output.writeBytes(8, getCountryBytes());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(1, getClientIdBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, getMakeBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, getModelBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(5, getApplicationBuildBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(6, getPlatformVersionBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(7, getLoggingIdBytes());
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(8, getCountryBytes());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.PlayCeClientInfo}
     *
     * <pre>
     * Attributes specific to third-party CE devices.
     *   CE devices scope
     *  - Roku
     *  - Smart TV (Non Android-TV)
     *  - PlayStation 3/4
     *  - XBox 360/One
     *
     *  We do not specify types of devices since it is defined by the pair of
     *  device_make and device_model (e.g.: make=roku + model=2500X = streaming box,
     *  make=lge + model=42LN5700 = Smart TV, make=tivo + model=roamio = Set Top Box)
     *  Next tag: 9
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_PlayCeClientInfo_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_PlayCeClientInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        clientId_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        loggingId_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        make_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        model_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        applicationBuild_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        platformVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        country_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_PlayCeClientInfo_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.clientId_ = clientId_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.loggingId_ = loggingId_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.make_ = make_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.model_ = model_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.applicationBuild_ = applicationBuild_;
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        result.platformVersion_ = platformVersion_;
        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
          to_bitField0_ |= 0x00000040;
        }
        result.country_ = country_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.getDefaultInstance()) return this;
        if (other.hasClientId()) {
          bitField0_ |= 0x00000001;
          clientId_ = other.clientId_;
          onChanged();
        }
        if (other.hasLoggingId()) {
          bitField0_ |= 0x00000002;
          loggingId_ = other.loggingId_;
          onChanged();
        }
        if (other.hasMake()) {
          bitField0_ |= 0x00000004;
          make_ = other.make_;
          onChanged();
        }
        if (other.hasModel()) {
          bitField0_ |= 0x00000008;
          model_ = other.model_;
          onChanged();
        }
        if (other.hasApplicationBuild()) {
          bitField0_ |= 0x00000010;
          applicationBuild_ = other.applicationBuild_;
          onChanged();
        }
        if (other.hasPlatformVersion()) {
          bitField0_ |= 0x00000020;
          platformVersion_ = other.platformVersion_;
          onChanged();
        }
        if (other.hasCountry()) {
          bitField0_ |= 0x00000040;
          country_ = other.country_;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional string client_id = 1;
      private java.lang.Object clientId_ = "";
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII. This is the device serial number
       *  or another device identifier that, together with make and model, uniquely
       *  identifies the device.
       * </pre>
       */
      public boolean hasClientId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII. This is the device serial number
       *  or another device identifier that, together with make and model, uniquely
       *  identifies the device.
       * </pre>
       */
      public java.lang.String getClientId() {
        java.lang.Object ref = clientId_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          clientId_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII. This is the device serial number
       *  or another device identifier that, together with make and model, uniquely
       *  identifies the device.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getClientIdBytes() {
        java.lang.Object ref = clientId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          clientId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII. This is the device serial number
       *  or another device identifier that, together with make and model, uniquely
       *  identifies the device.
       * </pre>
       */
      public Builder setClientId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        clientId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII. This is the device serial number
       *  or another device identifier that, together with make and model, uniquely
       *  identifies the device.
       * </pre>
       */
      public Builder clearClientId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        clientId_ = getDefaultInstance().getClientId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string client_id = 1;</code>
       *
       * <pre>
       * Sticky ID that should be considered PII. This is the device serial number
       *  or another device identifier that, together with make and model, uniquely
       *  identifies the device.
       * </pre>
       */
      public Builder setClientIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        clientId_ = value;
        onChanged();
        return this;
      }

      // optional string logging_id = 7;
      private java.lang.Object loggingId_ = "";
      /**
       * <code>optional string logging_id = 7;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public boolean hasLoggingId() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string logging_id = 7;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public java.lang.String getLoggingId() {
        java.lang.Object ref = loggingId_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          loggingId_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string logging_id = 7;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getLoggingIdBytes() {
        java.lang.Object ref = loggingId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          loggingId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string logging_id = 7;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder setLoggingId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        loggingId_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string logging_id = 7;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder clearLoggingId() {
        bitField0_ = (bitField0_ & ~0x00000002);
        loggingId_ = getDefaultInstance().getLoggingId();
        onChanged();
        return this;
      }
      /**
       * <code>optional string logging_id = 7;</code>
       *
       * <pre>
       * Pseudonymous, random id (sticky) per device.  May only be logged in temp
       *  logs if GWSLogEntryProto.UserInfo.UserId is not set.
       * </pre>
       */
      public Builder setLoggingIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        loggingId_ = value;
        onChanged();
        return this;
      }

      // optional string make = 3;
      private java.lang.Object make_ = "";
      /**
       * <code>optional string make = 3;</code>
       *
       * <pre>
       * Device make. E.g.: samsung, lge, google, sony, microsoft.
       *  Case insensitive. RoKu==roku.
       * </pre>
       */
      public boolean hasMake() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional string make = 3;</code>
       *
       * <pre>
       * Device make. E.g.: samsung, lge, google, sony, microsoft.
       *  Case insensitive. RoKu==roku.
       * </pre>
       */
      public java.lang.String getMake() {
        java.lang.Object ref = make_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          make_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string make = 3;</code>
       *
       * <pre>
       * Device make. E.g.: samsung, lge, google, sony, microsoft.
       *  Case insensitive. RoKu==roku.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getMakeBytes() {
        java.lang.Object ref = make_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          make_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string make = 3;</code>
       *
       * <pre>
       * Device make. E.g.: samsung, lge, google, sony, microsoft.
       *  Case insensitive. RoKu==roku.
       * </pre>
       */
      public Builder setMake(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        make_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string make = 3;</code>
       *
       * <pre>
       * Device make. E.g.: samsung, lge, google, sony, microsoft.
       *  Case insensitive. RoKu==roku.
       * </pre>
       */
      public Builder clearMake() {
        bitField0_ = (bitField0_ & ~0x00000004);
        make_ = getDefaultInstance().getMake();
        onChanged();
        return this;
      }
      /**
       * <code>optional string make = 3;</code>
       *
       * <pre>
       * Device make. E.g.: samsung, lge, google, sony, microsoft.
       *  Case insensitive. RoKu==roku.
       * </pre>
       */
      public Builder setMakeBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        make_ = value;
        onChanged();
        return this;
      }

      // optional string model = 4;
      private java.lang.Object model_ = "";
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
       * </pre>
       */
      public boolean hasModel() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
       * </pre>
       */
      public java.lang.String getModel() {
        java.lang.Object ref = model_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          model_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getModelBytes() {
        java.lang.Object ref = model_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          model_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
       * </pre>
       */
      public Builder setModel(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        model_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
       * </pre>
       */
      public Builder clearModel() {
        bitField0_ = (bitField0_ & ~0x00000008);
        model_ = getDefaultInstance().getModel();
        onChanged();
        return this;
      }
      /**
       * <code>optional string model = 4;</code>
       *
       * <pre>
       * Device model. E.g.: 2500X. Case insensitive. 2500X==2500x.
       * </pre>
       */
      public Builder setModelBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        model_ = value;
        onChanged();
        return this;
      }

      // optional string application_build = 5;
      private java.lang.Object applicationBuild_ = "";
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * App version/build. Each application defines it for itself.
       *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
       *  combination of BrightScript and C++ code compiled for mips
       *  from the git snapshot of the GPM app at the given time (20140708-171921).
       * </pre>
       */
      public boolean hasApplicationBuild() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * App version/build. Each application defines it for itself.
       *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
       *  combination of BrightScript and C++ code compiled for mips
       *  from the git snapshot of the GPM app at the given time (20140708-171921).
       * </pre>
       */
      public java.lang.String getApplicationBuild() {
        java.lang.Object ref = applicationBuild_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          applicationBuild_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * App version/build. Each application defines it for itself.
       *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
       *  combination of BrightScript and C++ code compiled for mips
       *  from the git snapshot of the GPM app at the given time (20140708-171921).
       * </pre>
       */
      public com.google.protobuf.ByteString
          getApplicationBuildBytes() {
        java.lang.Object ref = applicationBuild_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          applicationBuild_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * App version/build. Each application defines it for itself.
       *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
       *  combination of BrightScript and C++ code compiled for mips
       *  from the git snapshot of the GPM app at the given time (20140708-171921).
       * </pre>
       */
      public Builder setApplicationBuild(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        applicationBuild_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * App version/build. Each application defines it for itself.
       *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
       *  combination of BrightScript and C++ code compiled for mips
       *  from the git snapshot of the GPM app at the given time (20140708-171921).
       * </pre>
       */
      public Builder clearApplicationBuild() {
        bitField0_ = (bitField0_ & ~0x00000010);
        applicationBuild_ = getDefaultInstance().getApplicationBuild();
        onChanged();
        return this;
      }
      /**
       * <code>optional string application_build = 5;</code>
       *
       * <pre>
       * App version/build. Each application defines it for itself.
       *  E.g.: GPM20140708-171921 on make=roku and model=2500X corresponds to a
       *  combination of BrightScript and C++ code compiled for mips
       *  from the git snapshot of the GPM app at the given time (20140708-171921).
       * </pre>
       */
      public Builder setApplicationBuildBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        applicationBuild_ = value;
        onChanged();
        return this;
      }

      // optional string platform_version = 6;
      private java.lang.Object platformVersion_ = "";
      /**
       * <code>optional string platform_version = 6;</code>
       *
       * <pre>
       * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
       *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
       *  5.5).
       * </pre>
       */
      public boolean hasPlatformVersion() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * <code>optional string platform_version = 6;</code>
       *
       * <pre>
       * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
       *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
       *  5.5).
       * </pre>
       */
      public java.lang.String getPlatformVersion() {
        java.lang.Object ref = platformVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          platformVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string platform_version = 6;</code>
       *
       * <pre>
       * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
       *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
       *  5.5).
       * </pre>
       */
      public com.google.protobuf.ByteString
          getPlatformVersionBytes() {
        java.lang.Object ref = platformVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          platformVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string platform_version = 6;</code>
       *
       * <pre>
       * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
       *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
       *  5.5).
       * </pre>
       */
      public Builder setPlatformVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        platformVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string platform_version = 6;</code>
       *
       * <pre>
       * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
       *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
       *  5.5).
       * </pre>
       */
      public Builder clearPlatformVersion() {
        bitField0_ = (bitField0_ & ~0x00000020);
        platformVersion_ = getDefaultInstance().getPlatformVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string platform_version = 6;</code>
       *
       * <pre>
       * Platform version. E.g.: 5.5. (Roku FW version for Play Movies launch). Can
       *  include letters (e.g.: 5.5.3254b for a beta build #3254 of the FW release
       *  5.5).
       * </pre>
       */
      public Builder setPlatformVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        platformVersion_ = value;
        onChanged();
        return this;
      }

      // optional string country = 8;
      private java.lang.Object country_ = "";
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public boolean hasCountry() {
        return ((bitField0_ & 0x00000040) == 0x00000040);
      }
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public java.lang.String getCountry() {
        java.lang.Object ref = country_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          country_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public com.google.protobuf.ByteString
          getCountryBytes() {
        java.lang.Object ref = country_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          country_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public Builder setCountry(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        country_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public Builder clearCountry() {
        bitField0_ = (bitField0_ & ~0x00000040);
        country_ = getDefaultInstance().getCountry();
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       *  Where this comes from is currently app-specific
       * </pre>
       */
      public Builder setCountryBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        country_ = value;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.PlayCeClientInfo)
    }

    static {
      defaultInstance = new PlayCeClientInfo(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.PlayCeClientInfo)
  }

  public interface VrClientInfoOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;
    /**
     * <code>optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;</code>
     *
     * <pre>
     * The VR client type for this client. One of the enum values defined above.
     * </pre>
     */
    boolean hasVrClientType();
    /**
     * <code>optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;</code>
     *
     * <pre>
     * The VR client type for this client. One of the enum values defined above.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType getVrClientType();

    // optional string sdk_version = 2;
    /**
     * <code>optional string sdk_version = 2;</code>
     *
     * <pre>
     * The VR client OS SDK version, in a format appropriate for the platform.
     * </pre>
     */
    boolean hasSdkVersion();
    /**
     * <code>optional string sdk_version = 2;</code>
     *
     * <pre>
     * The VR client OS SDK version, in a format appropriate for the platform.
     * </pre>
     */
    java.lang.String getSdkVersion();
    /**
     * <code>optional string sdk_version = 2;</code>
     *
     * <pre>
     * The VR client OS SDK version, in a format appropriate for the platform.
     * </pre>
     */
    com.google.protobuf.ByteString
        getSdkVersionBytes();

    // optional string fingerprint = 3;
    /**
     * <code>optional string fingerprint = 3;</code>
     *
     * <pre>
     * The VR device build fingerprint, in a format appropriate for the platform.
     * </pre>
     */
    boolean hasFingerprint();
    /**
     * <code>optional string fingerprint = 3;</code>
     *
     * <pre>
     * The VR device build fingerprint, in a format appropriate for the platform.
     * </pre>
     */
    java.lang.String getFingerprint();
    /**
     * <code>optional string fingerprint = 3;</code>
     *
     * <pre>
     * The VR device build fingerprint, in a format appropriate for the platform.
     * </pre>
     */
    com.google.protobuf.ByteString
        getFingerprintBytes();

    // optional string gvr_version = 4;
    /**
     * <code>optional string gvr_version = 4;</code>
     *
     * <pre>
     * Version of the Google VR Toolkit (aka GVR).
     * </pre>
     */
    boolean hasGvrVersion();
    /**
     * <code>optional string gvr_version = 4;</code>
     *
     * <pre>
     * Version of the Google VR Toolkit (aka GVR).
     * </pre>
     */
    java.lang.String getGvrVersion();
    /**
     * <code>optional string gvr_version = 4;</code>
     *
     * <pre>
     * Version of the Google VR Toolkit (aka GVR).
     * </pre>
     */
    com.google.protobuf.ByteString
        getGvrVersionBytes();

    // optional string manufacturer = 5;
    /**
     * <code>optional string manufacturer = 5;</code>
     *
     * <pre>
     * The manufacturer of the client, for example Samsung.
     * </pre>
     */
    boolean hasManufacturer();
    /**
     * <code>optional string manufacturer = 5;</code>
     *
     * <pre>
     * The manufacturer of the client, for example Samsung.
     * </pre>
     */
    java.lang.String getManufacturer();
    /**
     * <code>optional string manufacturer = 5;</code>
     *
     * <pre>
     * The manufacturer of the client, for example Samsung.
     * </pre>
     */
    com.google.protobuf.ByteString
        getManufacturerBytes();

    // optional string model = 6;
    /**
     * <code>optional string model = 6;</code>
     *
     * <pre>
     * The model of the client, for example Nexus 6.
     * </pre>
     */
    boolean hasModel();
    /**
     * <code>optional string model = 6;</code>
     *
     * <pre>
     * The model of the client, for example Nexus 6.
     * </pre>
     */
    java.lang.String getModel();
    /**
     * <code>optional string model = 6;</code>
     *
     * <pre>
     * The model of the client, for example Nexus 6.
     * </pre>
     */
    com.google.protobuf.ByteString
        getModelBytes();

    // optional string language = 7;
    /**
     * <code>optional string language = 7;</code>
     *
     * <pre>
     * The chosen language from the client. e.g., "en", "ko".  We originally
     *  logged locale, but after a privacy review switched to only log language.
     * </pre>
     */
    boolean hasLanguage();
    /**
     * <code>optional string language = 7;</code>
     *
     * <pre>
     * The chosen language from the client. e.g., "en", "ko".  We originally
     *  logged locale, but after a privacy review switched to only log language.
     * </pre>
     */
    java.lang.String getLanguage();
    /**
     * <code>optional string language = 7;</code>
     *
     * <pre>
     * The chosen language from the client. e.g., "en", "ko".  We originally
     *  logged locale, but after a privacy review switched to only log language.
     * </pre>
     */
    com.google.protobuf.ByteString
        getLanguageBytes();

    // optional string country = 8;
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    boolean hasCountry();
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    java.lang.String getCountry();
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    com.google.protobuf.ByteString
        getCountryBytes();

    // optional string unity_version = 9;
    /**
     * <code>optional string unity_version = 9;</code>
     *
     * <pre>
     * The version of the Unity runtime.
     * </pre>
     */
    boolean hasUnityVersion();
    /**
     * <code>optional string unity_version = 9;</code>
     *
     * <pre>
     * The version of the Unity runtime.
     * </pre>
     */
    java.lang.String getUnityVersion();
    /**
     * <code>optional string unity_version = 9;</code>
     *
     * <pre>
     * The version of the Unity runtime.
     * </pre>
     */
    com.google.protobuf.ByteString
        getUnityVersionBytes();

    // optional string unity_sdk_version = 10;
    /**
     * <code>optional string unity_sdk_version = 10;</code>
     *
     * <pre>
     * The version of Google's VR Unity SDK.
     * </pre>
     */
    boolean hasUnitySdkVersion();
    /**
     * <code>optional string unity_sdk_version = 10;</code>
     *
     * <pre>
     * The version of Google's VR Unity SDK.
     * </pre>
     */
    java.lang.String getUnitySdkVersion();
    /**
     * <code>optional string unity_sdk_version = 10;</code>
     *
     * <pre>
     * The version of Google's VR Unity SDK.
     * </pre>
     */
    com.google.protobuf.ByteString
        getUnitySdkVersionBytes();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.VrClientInfo}
   *
   * <pre>
   * Attributes specific to VR clients. These are applications built on top of
   *  the cross-platform Google Virtual Reality Toolkit (aka GVR). They run on a
   *  variety of platforms including Android Cardboard, IOS Cardboard, Oculus, etc
   *
   *  This may be an Android phone for Cardboard, or may be a full VR headset.
   *
   *  Next tag: 11
   * </pre>
   */
  public static final class VrClientInfo extends
      com.google.protobuf.GeneratedMessage
      implements VrClientInfoOrBuilder {
    // Use VrClientInfo.newBuilder() to construct.
    private VrClientInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private VrClientInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final VrClientInfo defaultInstance;
    public static VrClientInfo getDefaultInstance() {
      return defaultInstance;
    }

    public VrClientInfo getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private VrClientInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(1, rawValue);
              } else {
                bitField0_ |= 0x00000001;
                vrClientType_ = value;
              }
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              sdkVersion_ = input.readBytes();
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              fingerprint_ = input.readBytes();
              break;
            }
            case 34: {
              bitField0_ |= 0x00000008;
              gvrVersion_ = input.readBytes();
              break;
            }
            case 42: {
              bitField0_ |= 0x00000010;
              manufacturer_ = input.readBytes();
              break;
            }
            case 50: {
              bitField0_ |= 0x00000020;
              model_ = input.readBytes();
              break;
            }
            case 58: {
              bitField0_ |= 0x00000040;
              language_ = input.readBytes();
              break;
            }
            case 66: {
              bitField0_ |= 0x00000080;
              country_ = input.readBytes();
              break;
            }
            case 74: {
              bitField0_ |= 0x00000100;
              unityVersion_ = input.readBytes();
              break;
            }
            case 82: {
              bitField0_ |= 0x00000200;
              unitySdkVersion_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_VrClientInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_VrClientInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.Builder.class);
    }

    public static com.google.protobuf.Parser<VrClientInfo> PARSER =
        new com.google.protobuf.AbstractParser<VrClientInfo>() {
      public VrClientInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new VrClientInfo(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<VrClientInfo> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.VrClientInfo.VrClientType}
     *
     * <pre>
     * The type of VR client that made this request.
     *  Next enum tag: 6
     * </pre>
     */
    public enum VrClientType
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>UNKNOWN = 0;</code>
       *
       * <pre>
       * VR client type is unknown.
       * </pre>
       */
      UNKNOWN(0, 0),
      /**
       * <code>ANDROID_CARDBOARD_SDK = 1;</code>
       *
       * <pre>
       * Client type is an Android device using the Cardboard SDK.
       * </pre>
       */
      ANDROID_CARDBOARD_SDK(1, 1),
      /**
       * <code>IOS_CARDBOARD_SDK = 2;</code>
       *
       * <pre>
       * Client type is an iOS device using the Cardboard SDK.
       * </pre>
       */
      IOS_CARDBOARD_SDK(2, 2),
      /**
       * <code>ANDROID_UNITY_SDK = 3;</code>
       *
       * <pre>
       * Client type is an Android device using Unity SDK.
       * </pre>
       */
      ANDROID_UNITY_SDK(3, 3),
      /**
       * <code>IOS_UNITY_SDK = 4;</code>
       *
       * <pre>
       * Client type is an iOS device using Unity SDK.
       * </pre>
       */
      IOS_UNITY_SDK(4, 4),
      /**
       * <code>WINDOWS = 5;</code>
       *
       * <pre>
       * Client type is a Windows machine (e.g. VrApp running Oculus or Valve).
       * </pre>
       */
      WINDOWS(5, 5),
      ;

      /**
       * <code>UNKNOWN = 0;</code>
       *
       * <pre>
       * VR client type is unknown.
       * </pre>
       */
      public static final int UNKNOWN_VALUE = 0;
      /**
       * <code>ANDROID_CARDBOARD_SDK = 1;</code>
       *
       * <pre>
       * Client type is an Android device using the Cardboard SDK.
       * </pre>
       */
      public static final int ANDROID_CARDBOARD_SDK_VALUE = 1;
      /**
       * <code>IOS_CARDBOARD_SDK = 2;</code>
       *
       * <pre>
       * Client type is an iOS device using the Cardboard SDK.
       * </pre>
       */
      public static final int IOS_CARDBOARD_SDK_VALUE = 2;
      /**
       * <code>ANDROID_UNITY_SDK = 3;</code>
       *
       * <pre>
       * Client type is an Android device using Unity SDK.
       * </pre>
       */
      public static final int ANDROID_UNITY_SDK_VALUE = 3;
      /**
       * <code>IOS_UNITY_SDK = 4;</code>
       *
       * <pre>
       * Client type is an iOS device using Unity SDK.
       * </pre>
       */
      public static final int IOS_UNITY_SDK_VALUE = 4;
      /**
       * <code>WINDOWS = 5;</code>
       *
       * <pre>
       * Client type is a Windows machine (e.g. VrApp running Oculus or Valve).
       * </pre>
       */
      public static final int WINDOWS_VALUE = 5;


      public final int getNumber() { return value; }

      public static VrClientType valueOf(int value) {
        switch (value) {
          case 0: return UNKNOWN;
          case 1: return ANDROID_CARDBOARD_SDK;
          case 2: return IOS_CARDBOARD_SDK;
          case 3: return ANDROID_UNITY_SDK;
          case 4: return IOS_UNITY_SDK;
          case 5: return WINDOWS;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<VrClientType>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<VrClientType>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<VrClientType>() {
              public VrClientType findValueByNumber(int number) {
                return VrClientType.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.getDescriptor().getEnumTypes().get(0);
      }

      private static final VrClientType[] VALUES = values();

      public static VrClientType valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private VrClientType(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.VrClientInfo.VrClientType)
    }

    private int bitField0_;
    // optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;
    public static final int VR_CLIENT_TYPE_FIELD_NUMBER = 1;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType vrClientType_;
    /**
     * <code>optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;</code>
     *
     * <pre>
     * The VR client type for this client. One of the enum values defined above.
     * </pre>
     */
    public boolean hasVrClientType() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;</code>
     *
     * <pre>
     * The VR client type for this client. One of the enum values defined above.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType getVrClientType() {
      return vrClientType_;
    }

    // optional string sdk_version = 2;
    public static final int SDK_VERSION_FIELD_NUMBER = 2;
    private java.lang.Object sdkVersion_;
    /**
     * <code>optional string sdk_version = 2;</code>
     *
     * <pre>
     * The VR client OS SDK version, in a format appropriate for the platform.
     * </pre>
     */
    public boolean hasSdkVersion() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string sdk_version = 2;</code>
     *
     * <pre>
     * The VR client OS SDK version, in a format appropriate for the platform.
     * </pre>
     */
    public java.lang.String getSdkVersion() {
      java.lang.Object ref = sdkVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          sdkVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string sdk_version = 2;</code>
     *
     * <pre>
     * The VR client OS SDK version, in a format appropriate for the platform.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getSdkVersionBytes() {
      java.lang.Object ref = sdkVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        sdkVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string fingerprint = 3;
    public static final int FINGERPRINT_FIELD_NUMBER = 3;
    private java.lang.Object fingerprint_;
    /**
     * <code>optional string fingerprint = 3;</code>
     *
     * <pre>
     * The VR device build fingerprint, in a format appropriate for the platform.
     * </pre>
     */
    public boolean hasFingerprint() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional string fingerprint = 3;</code>
     *
     * <pre>
     * The VR device build fingerprint, in a format appropriate for the platform.
     * </pre>
     */
    public java.lang.String getFingerprint() {
      java.lang.Object ref = fingerprint_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          fingerprint_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string fingerprint = 3;</code>
     *
     * <pre>
     * The VR device build fingerprint, in a format appropriate for the platform.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getFingerprintBytes() {
      java.lang.Object ref = fingerprint_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        fingerprint_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string gvr_version = 4;
    public static final int GVR_VERSION_FIELD_NUMBER = 4;
    private java.lang.Object gvrVersion_;
    /**
     * <code>optional string gvr_version = 4;</code>
     *
     * <pre>
     * Version of the Google VR Toolkit (aka GVR).
     * </pre>
     */
    public boolean hasGvrVersion() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional string gvr_version = 4;</code>
     *
     * <pre>
     * Version of the Google VR Toolkit (aka GVR).
     * </pre>
     */
    public java.lang.String getGvrVersion() {
      java.lang.Object ref = gvrVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          gvrVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string gvr_version = 4;</code>
     *
     * <pre>
     * Version of the Google VR Toolkit (aka GVR).
     * </pre>
     */
    public com.google.protobuf.ByteString
        getGvrVersionBytes() {
      java.lang.Object ref = gvrVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        gvrVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string manufacturer = 5;
    public static final int MANUFACTURER_FIELD_NUMBER = 5;
    private java.lang.Object manufacturer_;
    /**
     * <code>optional string manufacturer = 5;</code>
     *
     * <pre>
     * The manufacturer of the client, for example Samsung.
     * </pre>
     */
    public boolean hasManufacturer() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional string manufacturer = 5;</code>
     *
     * <pre>
     * The manufacturer of the client, for example Samsung.
     * </pre>
     */
    public java.lang.String getManufacturer() {
      java.lang.Object ref = manufacturer_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          manufacturer_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string manufacturer = 5;</code>
     *
     * <pre>
     * The manufacturer of the client, for example Samsung.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getManufacturerBytes() {
      java.lang.Object ref = manufacturer_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        manufacturer_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string model = 6;
    public static final int MODEL_FIELD_NUMBER = 6;
    private java.lang.Object model_;
    /**
     * <code>optional string model = 6;</code>
     *
     * <pre>
     * The model of the client, for example Nexus 6.
     * </pre>
     */
    public boolean hasModel() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * <code>optional string model = 6;</code>
     *
     * <pre>
     * The model of the client, for example Nexus 6.
     * </pre>
     */
    public java.lang.String getModel() {
      java.lang.Object ref = model_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          model_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string model = 6;</code>
     *
     * <pre>
     * The model of the client, for example Nexus 6.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getModelBytes() {
      java.lang.Object ref = model_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        model_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string language = 7;
    public static final int LANGUAGE_FIELD_NUMBER = 7;
    private java.lang.Object language_;
    /**
     * <code>optional string language = 7;</code>
     *
     * <pre>
     * The chosen language from the client. e.g., "en", "ko".  We originally
     *  logged locale, but after a privacy review switched to only log language.
     * </pre>
     */
    public boolean hasLanguage() {
      return ((bitField0_ & 0x00000040) == 0x00000040);
    }
    /**
     * <code>optional string language = 7;</code>
     *
     * <pre>
     * The chosen language from the client. e.g., "en", "ko".  We originally
     *  logged locale, but after a privacy review switched to only log language.
     * </pre>
     */
    public java.lang.String getLanguage() {
      java.lang.Object ref = language_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          language_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string language = 7;</code>
     *
     * <pre>
     * The chosen language from the client. e.g., "en", "ko".  We originally
     *  logged locale, but after a privacy review switched to only log language.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getLanguageBytes() {
      java.lang.Object ref = language_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        language_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string country = 8;
    public static final int COUNTRY_FIELD_NUMBER = 8;
    private java.lang.Object country_;
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    public boolean hasCountry() {
      return ((bitField0_ & 0x00000080) == 0x00000080);
    }
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    public java.lang.String getCountry() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          country_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string country = 8;</code>
     *
     * <pre>
     * The chosen country from the client. e.g., "US", "KR", "JP".
     * </pre>
     */
    public com.google.protobuf.ByteString
        getCountryBytes() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        country_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string unity_version = 9;
    public static final int UNITY_VERSION_FIELD_NUMBER = 9;
    private java.lang.Object unityVersion_;
    /**
     * <code>optional string unity_version = 9;</code>
     *
     * <pre>
     * The version of the Unity runtime.
     * </pre>
     */
    public boolean hasUnityVersion() {
      return ((bitField0_ & 0x00000100) == 0x00000100);
    }
    /**
     * <code>optional string unity_version = 9;</code>
     *
     * <pre>
     * The version of the Unity runtime.
     * </pre>
     */
    public java.lang.String getUnityVersion() {
      java.lang.Object ref = unityVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          unityVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string unity_version = 9;</code>
     *
     * <pre>
     * The version of the Unity runtime.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getUnityVersionBytes() {
      java.lang.Object ref = unityVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        unityVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string unity_sdk_version = 10;
    public static final int UNITY_SDK_VERSION_FIELD_NUMBER = 10;
    private java.lang.Object unitySdkVersion_;
    /**
     * <code>optional string unity_sdk_version = 10;</code>
     *
     * <pre>
     * The version of Google's VR Unity SDK.
     * </pre>
     */
    public boolean hasUnitySdkVersion() {
      return ((bitField0_ & 0x00000200) == 0x00000200);
    }
    /**
     * <code>optional string unity_sdk_version = 10;</code>
     *
     * <pre>
     * The version of Google's VR Unity SDK.
     * </pre>
     */
    public java.lang.String getUnitySdkVersion() {
      java.lang.Object ref = unitySdkVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          unitySdkVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string unity_sdk_version = 10;</code>
     *
     * <pre>
     * The version of Google's VR Unity SDK.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getUnitySdkVersionBytes() {
      java.lang.Object ref = unitySdkVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        unitySdkVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private void initFields() {
      vrClientType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType.UNKNOWN;
      sdkVersion_ = "";
      fingerprint_ = "";
      gvrVersion_ = "";
      manufacturer_ = "";
      model_ = "";
      language_ = "";
      country_ = "";
      unityVersion_ = "";
      unitySdkVersion_ = "";
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeEnum(1, vrClientType_.getNumber());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, getSdkVersionBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, getFingerprintBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBytes(4, getGvrVersionBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeBytes(5, getManufacturerBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeBytes(6, getModelBytes());
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        output.writeBytes(7, getLanguageBytes());
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        output.writeBytes(8, getCountryBytes());
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        output.writeBytes(9, getUnityVersionBytes());
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        output.writeBytes(10, getUnitySdkVersionBytes());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(1, vrClientType_.getNumber());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, getSdkVersionBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, getFingerprintBytes());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, getGvrVersionBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(5, getManufacturerBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(6, getModelBytes());
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(7, getLanguageBytes());
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(8, getCountryBytes());
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(9, getUnityVersionBytes());
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(10, getUnitySdkVersionBytes());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.VrClientInfo}
     *
     * <pre>
     * Attributes specific to VR clients. These are applications built on top of
     *  the cross-platform Google Virtual Reality Toolkit (aka GVR). They run on a
     *  variety of platforms including Android Cardboard, IOS Cardboard, Oculus, etc
     *
     *  This may be an Android phone for Cardboard, or may be a full VR headset.
     *
     *  Next tag: 11
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_VrClientInfo_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_VrClientInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        vrClientType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType.UNKNOWN;
        bitField0_ = (bitField0_ & ~0x00000001);
        sdkVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        fingerprint_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        gvrVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        manufacturer_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        model_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        language_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        country_ = "";
        bitField0_ = (bitField0_ & ~0x00000080);
        unityVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000100);
        unitySdkVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000200);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_VrClientInfo_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.vrClientType_ = vrClientType_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.sdkVersion_ = sdkVersion_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.fingerprint_ = fingerprint_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.gvrVersion_ = gvrVersion_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.manufacturer_ = manufacturer_;
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        result.model_ = model_;
        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
          to_bitField0_ |= 0x00000040;
        }
        result.language_ = language_;
        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
          to_bitField0_ |= 0x00000080;
        }
        result.country_ = country_;
        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
          to_bitField0_ |= 0x00000100;
        }
        result.unityVersion_ = unityVersion_;
        if (((from_bitField0_ & 0x00000200) == 0x00000200)) {
          to_bitField0_ |= 0x00000200;
        }
        result.unitySdkVersion_ = unitySdkVersion_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.getDefaultInstance()) return this;
        if (other.hasVrClientType()) {
          setVrClientType(other.getVrClientType());
        }
        if (other.hasSdkVersion()) {
          bitField0_ |= 0x00000002;
          sdkVersion_ = other.sdkVersion_;
          onChanged();
        }
        if (other.hasFingerprint()) {
          bitField0_ |= 0x00000004;
          fingerprint_ = other.fingerprint_;
          onChanged();
        }
        if (other.hasGvrVersion()) {
          bitField0_ |= 0x00000008;
          gvrVersion_ = other.gvrVersion_;
          onChanged();
        }
        if (other.hasManufacturer()) {
          bitField0_ |= 0x00000010;
          manufacturer_ = other.manufacturer_;
          onChanged();
        }
        if (other.hasModel()) {
          bitField0_ |= 0x00000020;
          model_ = other.model_;
          onChanged();
        }
        if (other.hasLanguage()) {
          bitField0_ |= 0x00000040;
          language_ = other.language_;
          onChanged();
        }
        if (other.hasCountry()) {
          bitField0_ |= 0x00000080;
          country_ = other.country_;
          onChanged();
        }
        if (other.hasUnityVersion()) {
          bitField0_ |= 0x00000100;
          unityVersion_ = other.unityVersion_;
          onChanged();
        }
        if (other.hasUnitySdkVersion()) {
          bitField0_ |= 0x00000200;
          unitySdkVersion_ = other.unitySdkVersion_;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType vrClientType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType.UNKNOWN;
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;</code>
       *
       * <pre>
       * The VR client type for this client. One of the enum values defined above.
       * </pre>
       */
      public boolean hasVrClientType() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;</code>
       *
       * <pre>
       * The VR client type for this client. One of the enum values defined above.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType getVrClientType() {
        return vrClientType_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;</code>
       *
       * <pre>
       * The VR client type for this client. One of the enum values defined above.
       * </pre>
       */
      public Builder setVrClientType(com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000001;
        vrClientType_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo.VrClientType vr_client_type = 1;</code>
       *
       * <pre>
       * The VR client type for this client. One of the enum values defined above.
       * </pre>
       */
      public Builder clearVrClientType() {
        bitField0_ = (bitField0_ & ~0x00000001);
        vrClientType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.VrClientType.UNKNOWN;
        onChanged();
        return this;
      }

      // optional string sdk_version = 2;
      private java.lang.Object sdkVersion_ = "";
      /**
       * <code>optional string sdk_version = 2;</code>
       *
       * <pre>
       * The VR client OS SDK version, in a format appropriate for the platform.
       * </pre>
       */
      public boolean hasSdkVersion() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string sdk_version = 2;</code>
       *
       * <pre>
       * The VR client OS SDK version, in a format appropriate for the platform.
       * </pre>
       */
      public java.lang.String getSdkVersion() {
        java.lang.Object ref = sdkVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          sdkVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string sdk_version = 2;</code>
       *
       * <pre>
       * The VR client OS SDK version, in a format appropriate for the platform.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getSdkVersionBytes() {
        java.lang.Object ref = sdkVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          sdkVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string sdk_version = 2;</code>
       *
       * <pre>
       * The VR client OS SDK version, in a format appropriate for the platform.
       * </pre>
       */
      public Builder setSdkVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        sdkVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string sdk_version = 2;</code>
       *
       * <pre>
       * The VR client OS SDK version, in a format appropriate for the platform.
       * </pre>
       */
      public Builder clearSdkVersion() {
        bitField0_ = (bitField0_ & ~0x00000002);
        sdkVersion_ = getDefaultInstance().getSdkVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string sdk_version = 2;</code>
       *
       * <pre>
       * The VR client OS SDK version, in a format appropriate for the platform.
       * </pre>
       */
      public Builder setSdkVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        sdkVersion_ = value;
        onChanged();
        return this;
      }

      // optional string fingerprint = 3;
      private java.lang.Object fingerprint_ = "";
      /**
       * <code>optional string fingerprint = 3;</code>
       *
       * <pre>
       * The VR device build fingerprint, in a format appropriate for the platform.
       * </pre>
       */
      public boolean hasFingerprint() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional string fingerprint = 3;</code>
       *
       * <pre>
       * The VR device build fingerprint, in a format appropriate for the platform.
       * </pre>
       */
      public java.lang.String getFingerprint() {
        java.lang.Object ref = fingerprint_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          fingerprint_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string fingerprint = 3;</code>
       *
       * <pre>
       * The VR device build fingerprint, in a format appropriate for the platform.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getFingerprintBytes() {
        java.lang.Object ref = fingerprint_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          fingerprint_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string fingerprint = 3;</code>
       *
       * <pre>
       * The VR device build fingerprint, in a format appropriate for the platform.
       * </pre>
       */
      public Builder setFingerprint(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        fingerprint_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string fingerprint = 3;</code>
       *
       * <pre>
       * The VR device build fingerprint, in a format appropriate for the platform.
       * </pre>
       */
      public Builder clearFingerprint() {
        bitField0_ = (bitField0_ & ~0x00000004);
        fingerprint_ = getDefaultInstance().getFingerprint();
        onChanged();
        return this;
      }
      /**
       * <code>optional string fingerprint = 3;</code>
       *
       * <pre>
       * The VR device build fingerprint, in a format appropriate for the platform.
       * </pre>
       */
      public Builder setFingerprintBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        fingerprint_ = value;
        onChanged();
        return this;
      }

      // optional string gvr_version = 4;
      private java.lang.Object gvrVersion_ = "";
      /**
       * <code>optional string gvr_version = 4;</code>
       *
       * <pre>
       * Version of the Google VR Toolkit (aka GVR).
       * </pre>
       */
      public boolean hasGvrVersion() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional string gvr_version = 4;</code>
       *
       * <pre>
       * Version of the Google VR Toolkit (aka GVR).
       * </pre>
       */
      public java.lang.String getGvrVersion() {
        java.lang.Object ref = gvrVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          gvrVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string gvr_version = 4;</code>
       *
       * <pre>
       * Version of the Google VR Toolkit (aka GVR).
       * </pre>
       */
      public com.google.protobuf.ByteString
          getGvrVersionBytes() {
        java.lang.Object ref = gvrVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          gvrVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string gvr_version = 4;</code>
       *
       * <pre>
       * Version of the Google VR Toolkit (aka GVR).
       * </pre>
       */
      public Builder setGvrVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        gvrVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string gvr_version = 4;</code>
       *
       * <pre>
       * Version of the Google VR Toolkit (aka GVR).
       * </pre>
       */
      public Builder clearGvrVersion() {
        bitField0_ = (bitField0_ & ~0x00000008);
        gvrVersion_ = getDefaultInstance().getGvrVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string gvr_version = 4;</code>
       *
       * <pre>
       * Version of the Google VR Toolkit (aka GVR).
       * </pre>
       */
      public Builder setGvrVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        gvrVersion_ = value;
        onChanged();
        return this;
      }

      // optional string manufacturer = 5;
      private java.lang.Object manufacturer_ = "";
      /**
       * <code>optional string manufacturer = 5;</code>
       *
       * <pre>
       * The manufacturer of the client, for example Samsung.
       * </pre>
       */
      public boolean hasManufacturer() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional string manufacturer = 5;</code>
       *
       * <pre>
       * The manufacturer of the client, for example Samsung.
       * </pre>
       */
      public java.lang.String getManufacturer() {
        java.lang.Object ref = manufacturer_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          manufacturer_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string manufacturer = 5;</code>
       *
       * <pre>
       * The manufacturer of the client, for example Samsung.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getManufacturerBytes() {
        java.lang.Object ref = manufacturer_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          manufacturer_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string manufacturer = 5;</code>
       *
       * <pre>
       * The manufacturer of the client, for example Samsung.
       * </pre>
       */
      public Builder setManufacturer(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        manufacturer_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string manufacturer = 5;</code>
       *
       * <pre>
       * The manufacturer of the client, for example Samsung.
       * </pre>
       */
      public Builder clearManufacturer() {
        bitField0_ = (bitField0_ & ~0x00000010);
        manufacturer_ = getDefaultInstance().getManufacturer();
        onChanged();
        return this;
      }
      /**
       * <code>optional string manufacturer = 5;</code>
       *
       * <pre>
       * The manufacturer of the client, for example Samsung.
       * </pre>
       */
      public Builder setManufacturerBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        manufacturer_ = value;
        onChanged();
        return this;
      }

      // optional string model = 6;
      private java.lang.Object model_ = "";
      /**
       * <code>optional string model = 6;</code>
       *
       * <pre>
       * The model of the client, for example Nexus 6.
       * </pre>
       */
      public boolean hasModel() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * <code>optional string model = 6;</code>
       *
       * <pre>
       * The model of the client, for example Nexus 6.
       * </pre>
       */
      public java.lang.String getModel() {
        java.lang.Object ref = model_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          model_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string model = 6;</code>
       *
       * <pre>
       * The model of the client, for example Nexus 6.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getModelBytes() {
        java.lang.Object ref = model_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          model_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string model = 6;</code>
       *
       * <pre>
       * The model of the client, for example Nexus 6.
       * </pre>
       */
      public Builder setModel(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        model_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string model = 6;</code>
       *
       * <pre>
       * The model of the client, for example Nexus 6.
       * </pre>
       */
      public Builder clearModel() {
        bitField0_ = (bitField0_ & ~0x00000020);
        model_ = getDefaultInstance().getModel();
        onChanged();
        return this;
      }
      /**
       * <code>optional string model = 6;</code>
       *
       * <pre>
       * The model of the client, for example Nexus 6.
       * </pre>
       */
      public Builder setModelBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        model_ = value;
        onChanged();
        return this;
      }

      // optional string language = 7;
      private java.lang.Object language_ = "";
      /**
       * <code>optional string language = 7;</code>
       *
       * <pre>
       * The chosen language from the client. e.g., "en", "ko".  We originally
       *  logged locale, but after a privacy review switched to only log language.
       * </pre>
       */
      public boolean hasLanguage() {
        return ((bitField0_ & 0x00000040) == 0x00000040);
      }
      /**
       * <code>optional string language = 7;</code>
       *
       * <pre>
       * The chosen language from the client. e.g., "en", "ko".  We originally
       *  logged locale, but after a privacy review switched to only log language.
       * </pre>
       */
      public java.lang.String getLanguage() {
        java.lang.Object ref = language_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          language_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string language = 7;</code>
       *
       * <pre>
       * The chosen language from the client. e.g., "en", "ko".  We originally
       *  logged locale, but after a privacy review switched to only log language.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getLanguageBytes() {
        java.lang.Object ref = language_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          language_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string language = 7;</code>
       *
       * <pre>
       * The chosen language from the client. e.g., "en", "ko".  We originally
       *  logged locale, but after a privacy review switched to only log language.
       * </pre>
       */
      public Builder setLanguage(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        language_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string language = 7;</code>
       *
       * <pre>
       * The chosen language from the client. e.g., "en", "ko".  We originally
       *  logged locale, but after a privacy review switched to only log language.
       * </pre>
       */
      public Builder clearLanguage() {
        bitField0_ = (bitField0_ & ~0x00000040);
        language_ = getDefaultInstance().getLanguage();
        onChanged();
        return this;
      }
      /**
       * <code>optional string language = 7;</code>
       *
       * <pre>
       * The chosen language from the client. e.g., "en", "ko".  We originally
       *  logged locale, but after a privacy review switched to only log language.
       * </pre>
       */
      public Builder setLanguageBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        language_ = value;
        onChanged();
        return this;
      }

      // optional string country = 8;
      private java.lang.Object country_ = "";
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public boolean hasCountry() {
        return ((bitField0_ & 0x00000080) == 0x00000080);
      }
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public java.lang.String getCountry() {
        java.lang.Object ref = country_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          country_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public com.google.protobuf.ByteString
          getCountryBytes() {
        java.lang.Object ref = country_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          country_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public Builder setCountry(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        country_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public Builder clearCountry() {
        bitField0_ = (bitField0_ & ~0x00000080);
        country_ = getDefaultInstance().getCountry();
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 8;</code>
       *
       * <pre>
       * The chosen country from the client. e.g., "US", "KR", "JP".
       * </pre>
       */
      public Builder setCountryBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
        country_ = value;
        onChanged();
        return this;
      }

      // optional string unity_version = 9;
      private java.lang.Object unityVersion_ = "";
      /**
       * <code>optional string unity_version = 9;</code>
       *
       * <pre>
       * The version of the Unity runtime.
       * </pre>
       */
      public boolean hasUnityVersion() {
        return ((bitField0_ & 0x00000100) == 0x00000100);
      }
      /**
       * <code>optional string unity_version = 9;</code>
       *
       * <pre>
       * The version of the Unity runtime.
       * </pre>
       */
      public java.lang.String getUnityVersion() {
        java.lang.Object ref = unityVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          unityVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string unity_version = 9;</code>
       *
       * <pre>
       * The version of the Unity runtime.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getUnityVersionBytes() {
        java.lang.Object ref = unityVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          unityVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string unity_version = 9;</code>
       *
       * <pre>
       * The version of the Unity runtime.
       * </pre>
       */
      public Builder setUnityVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        unityVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string unity_version = 9;</code>
       *
       * <pre>
       * The version of the Unity runtime.
       * </pre>
       */
      public Builder clearUnityVersion() {
        bitField0_ = (bitField0_ & ~0x00000100);
        unityVersion_ = getDefaultInstance().getUnityVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string unity_version = 9;</code>
       *
       * <pre>
       * The version of the Unity runtime.
       * </pre>
       */
      public Builder setUnityVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        unityVersion_ = value;
        onChanged();
        return this;
      }

      // optional string unity_sdk_version = 10;
      private java.lang.Object unitySdkVersion_ = "";
      /**
       * <code>optional string unity_sdk_version = 10;</code>
       *
       * <pre>
       * The version of Google's VR Unity SDK.
       * </pre>
       */
      public boolean hasUnitySdkVersion() {
        return ((bitField0_ & 0x00000200) == 0x00000200);
      }
      /**
       * <code>optional string unity_sdk_version = 10;</code>
       *
       * <pre>
       * The version of Google's VR Unity SDK.
       * </pre>
       */
      public java.lang.String getUnitySdkVersion() {
        java.lang.Object ref = unitySdkVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          unitySdkVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string unity_sdk_version = 10;</code>
       *
       * <pre>
       * The version of Google's VR Unity SDK.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getUnitySdkVersionBytes() {
        java.lang.Object ref = unitySdkVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          unitySdkVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string unity_sdk_version = 10;</code>
       *
       * <pre>
       * The version of Google's VR Unity SDK.
       * </pre>
       */
      public Builder setUnitySdkVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
        unitySdkVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string unity_sdk_version = 10;</code>
       *
       * <pre>
       * The version of Google's VR Unity SDK.
       * </pre>
       */
      public Builder clearUnitySdkVersion() {
        bitField0_ = (bitField0_ & ~0x00000200);
        unitySdkVersion_ = getDefaultInstance().getUnitySdkVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string unity_sdk_version = 10;</code>
       *
       * <pre>
       * The version of Google's VR Unity SDK.
       * </pre>
       */
      public Builder setUnitySdkVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
        unitySdkVersion_ = value;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.VrClientInfo)
    }

    static {
      defaultInstance = new VrClientInfo(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.VrClientInfo)
  }

  public interface JsClientInfoOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional string os = 1;
    /**
     * <code>optional string os = 1;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    boolean hasOs();
    /**
     * <code>optional string os = 1;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    java.lang.String getOs();
    /**
     * <code>optional string os = 1;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    com.google.protobuf.ByteString
        getOsBytes();

    // optional string os_version = 2;
    /**
     * <code>optional string os_version = 2;</code>
     *
     * <pre>
     * The OS version (not available for everything).
     * </pre>
     */
    boolean hasOsVersion();
    /**
     * <code>optional string os_version = 2;</code>
     *
     * <pre>
     * The OS version (not available for everything).
     * </pre>
     */
    java.lang.String getOsVersion();
    /**
     * <code>optional string os_version = 2;</code>
     *
     * <pre>
     * The OS version (not available for everything).
     * </pre>
     */
    com.google.protobuf.ByteString
        getOsVersionBytes();

    // optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;</code>
     */
    boolean hasDeviceType();
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType getDeviceType();

    // optional string country = 4;
    /**
     * <code>optional string country = 4;</code>
     *
     * <pre>
     * The country from the client. e.g., "US", "KR", "JP".
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    boolean hasCountry();
    /**
     * <code>optional string country = 4;</code>
     *
     * <pre>
     * The country from the client. e.g., "US", "KR", "JP".
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    java.lang.String getCountry();
    /**
     * <code>optional string country = 4;</code>
     *
     * <pre>
     * The country from the client. e.g., "US", "KR", "JP".
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    com.google.protobuf.ByteString
        getCountryBytes();

    // optional string locale = 5;
    /**
     * <code>optional string locale = 5;</code>
     *
     * <pre>
     * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
     *  differ from the browser's locale if the user overrode the language
     *  settings.
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    boolean hasLocale();
    /**
     * <code>optional string locale = 5;</code>
     *
     * <pre>
     * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
     *  differ from the browser's locale if the user overrode the language
     *  settings.
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    java.lang.String getLocale();
    /**
     * <code>optional string locale = 5;</code>
     *
     * <pre>
     * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
     *  differ from the browser's locale if the user overrode the language
     *  settings.
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    com.google.protobuf.ByteString
        getLocaleBytes();

    // optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;</code>
     *
     * <pre>
     * e.g., MAC, WINDOWS, ANDROID etc.
     * </pre>
     */
    boolean hasOsType();
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;</code>
     *
     * <pre>
     * e.g., MAC, WINDOWS, ANDROID etc.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType getOsType();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.JsClientInfo}
   *
   * <pre>
   * Attributes specific to JavaScript clients.
   *
   *  Next tag: 7
   * </pre>
   */
  public static final class JsClientInfo extends
      com.google.protobuf.GeneratedMessage
      implements JsClientInfoOrBuilder {
    // Use JsClientInfo.newBuilder() to construct.
    private JsClientInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private JsClientInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final JsClientInfo defaultInstance;
    public static JsClientInfo getDefaultInstance() {
      return defaultInstance;
    }

    public JsClientInfo getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private JsClientInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              bitField0_ |= 0x00000001;
              os_ = input.readBytes();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              osVersion_ = input.readBytes();
              break;
            }
            case 24: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(3, rawValue);
              } else {
                bitField0_ |= 0x00000004;
                deviceType_ = value;
              }
              break;
            }
            case 34: {
              bitField0_ |= 0x00000008;
              country_ = input.readBytes();
              break;
            }
            case 42: {
              bitField0_ |= 0x00000010;
              locale_ = input.readBytes();
              break;
            }
            case 48: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(6, rawValue);
              } else {
                bitField0_ |= 0x00000020;
                osType_ = value;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_JsClientInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_JsClientInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.Builder.class);
    }

    public static com.google.protobuf.Parser<JsClientInfo> PARSER =
        new com.google.protobuf.AbstractParser<JsClientInfo>() {
      public JsClientInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new JsClientInfo(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<JsClientInfo> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.JsClientInfo.OsType}
     */
    public enum OsType
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>OS_UNKNOWN = 0;</code>
       */
      OS_UNKNOWN(0, 0),
      /**
       * <code>MAC = 1;</code>
       */
      MAC(1, 1),
      /**
       * <code>WINDOWS = 2;</code>
       */
      WINDOWS(2, 2),
      /**
       * <code>ANDROID = 3;</code>
       */
      ANDROID(3, 3),
      /**
       * <code>LINUX = 4;</code>
       */
      LINUX(4, 4),
      /**
       * <code>CHROME_OS = 5;</code>
       */
      CHROME_OS(5, 5),
      /**
       * <code>IPAD = 6;</code>
       */
      IPAD(6, 6),
      /**
       * <code>IPHONE = 7;</code>
       */
      IPHONE(7, 7),
      /**
       * <code>IPOD = 8;</code>
       */
      IPOD(8, 8),
      ;

      /**
       * <code>OS_UNKNOWN = 0;</code>
       */
      public static final int OS_UNKNOWN_VALUE = 0;
      /**
       * <code>MAC = 1;</code>
       */
      public static final int MAC_VALUE = 1;
      /**
       * <code>WINDOWS = 2;</code>
       */
      public static final int WINDOWS_VALUE = 2;
      /**
       * <code>ANDROID = 3;</code>
       */
      public static final int ANDROID_VALUE = 3;
      /**
       * <code>LINUX = 4;</code>
       */
      public static final int LINUX_VALUE = 4;
      /**
       * <code>CHROME_OS = 5;</code>
       */
      public static final int CHROME_OS_VALUE = 5;
      /**
       * <code>IPAD = 6;</code>
       */
      public static final int IPAD_VALUE = 6;
      /**
       * <code>IPHONE = 7;</code>
       */
      public static final int IPHONE_VALUE = 7;
      /**
       * <code>IPOD = 8;</code>
       */
      public static final int IPOD_VALUE = 8;


      public final int getNumber() { return value; }

      public static OsType valueOf(int value) {
        switch (value) {
          case 0: return OS_UNKNOWN;
          case 1: return MAC;
          case 2: return WINDOWS;
          case 3: return ANDROID;
          case 4: return LINUX;
          case 5: return CHROME_OS;
          case 6: return IPAD;
          case 7: return IPHONE;
          case 8: return IPOD;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<OsType>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<OsType>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<OsType>() {
              public OsType findValueByNumber(int number) {
                return OsType.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.getDescriptor().getEnumTypes().get(0);
      }

      private static final OsType[] VALUES = values();

      public static OsType valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private OsType(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.JsClientInfo.OsType)
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.JsClientInfo.DeviceType}
     */
    public enum DeviceType
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>UNKNOWN = 0;</code>
       */
      UNKNOWN(0, 0),
      /**
       * <code>MOBILE = 1;</code>
       */
      MOBILE(1, 1),
      /**
       * <code>TABLET = 2;</code>
       */
      TABLET(2, 2),
      /**
       * <code>DESKTOP = 3;</code>
       */
      DESKTOP(3, 3),
      ;

      /**
       * <code>UNKNOWN = 0;</code>
       */
      public static final int UNKNOWN_VALUE = 0;
      /**
       * <code>MOBILE = 1;</code>
       */
      public static final int MOBILE_VALUE = 1;
      /**
       * <code>TABLET = 2;</code>
       */
      public static final int TABLET_VALUE = 2;
      /**
       * <code>DESKTOP = 3;</code>
       */
      public static final int DESKTOP_VALUE = 3;


      public final int getNumber() { return value; }

      public static DeviceType valueOf(int value) {
        switch (value) {
          case 0: return UNKNOWN;
          case 1: return MOBILE;
          case 2: return TABLET;
          case 3: return DESKTOP;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<DeviceType>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<DeviceType>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<DeviceType>() {
              public DeviceType findValueByNumber(int number) {
                return DeviceType.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.getDescriptor().getEnumTypes().get(1);
      }

      private static final DeviceType[] VALUES = values();

      public static DeviceType valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private DeviceType(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.JsClientInfo.DeviceType)
    }

    private int bitField0_;
    // optional string os = 1;
    public static final int OS_FIELD_NUMBER = 1;
    private java.lang.Object os_;
    /**
     * <code>optional string os = 1;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    public boolean hasOs() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional string os = 1;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    public java.lang.String getOs() {
      java.lang.Object ref = os_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          os_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string os = 1;</code>
     *
     * <pre>
     * e.g., "mac", "windows", "linux"
     * </pre>
     */
    public com.google.protobuf.ByteString
        getOsBytes() {
      java.lang.Object ref = os_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        os_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string os_version = 2;
    public static final int OS_VERSION_FIELD_NUMBER = 2;
    private java.lang.Object osVersion_;
    /**
     * <code>optional string os_version = 2;</code>
     *
     * <pre>
     * The OS version (not available for everything).
     * </pre>
     */
    public boolean hasOsVersion() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string os_version = 2;</code>
     *
     * <pre>
     * The OS version (not available for everything).
     * </pre>
     */
    public java.lang.String getOsVersion() {
      java.lang.Object ref = osVersion_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          osVersion_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string os_version = 2;</code>
     *
     * <pre>
     * The OS version (not available for everything).
     * </pre>
     */
    public com.google.protobuf.ByteString
        getOsVersionBytes() {
      java.lang.Object ref = osVersion_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        osVersion_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;
    public static final int DEVICE_TYPE_FIELD_NUMBER = 3;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType deviceType_;
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;</code>
     */
    public boolean hasDeviceType() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType getDeviceType() {
      return deviceType_;
    }

    // optional string country = 4;
    public static final int COUNTRY_FIELD_NUMBER = 4;
    private java.lang.Object country_;
    /**
     * <code>optional string country = 4;</code>
     *
     * <pre>
     * The country from the client. e.g., "US", "KR", "JP".
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    public boolean hasCountry() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional string country = 4;</code>
     *
     * <pre>
     * The country from the client. e.g., "US", "KR", "JP".
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    public java.lang.String getCountry() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          country_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string country = 4;</code>
     *
     * <pre>
     * The country from the client. e.g., "US", "KR", "JP".
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getCountryBytes() {
      java.lang.Object ref = country_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        country_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string locale = 5;
    public static final int LOCALE_FIELD_NUMBER = 5;
    private java.lang.Object locale_;
    /**
     * <code>optional string locale = 5;</code>
     *
     * <pre>
     * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
     *  differ from the browser's locale if the user overrode the language
     *  settings.
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    public boolean hasLocale() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional string locale = 5;</code>
     *
     * <pre>
     * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
     *  differ from the browser's locale if the user overrode the language
     *  settings.
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    public java.lang.String getLocale() {
      java.lang.Object ref = locale_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          locale_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string locale = 5;</code>
     *
     * <pre>
     * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
     *  differ from the browser's locale if the user overrode the language
     *  settings.
     *  Only populated if the client explicitly sets it.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getLocaleBytes() {
      java.lang.Object ref = locale_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        locale_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;
    public static final int OS_TYPE_FIELD_NUMBER = 6;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType osType_;
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;</code>
     *
     * <pre>
     * e.g., MAC, WINDOWS, ANDROID etc.
     * </pre>
     */
    public boolean hasOsType() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;</code>
     *
     * <pre>
     * e.g., MAC, WINDOWS, ANDROID etc.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType getOsType() {
      return osType_;
    }

    private void initFields() {
      os_ = "";
      osVersion_ = "";
      deviceType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType.UNKNOWN;
      country_ = "";
      locale_ = "";
      osType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType.OS_UNKNOWN;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBytes(1, getOsBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, getOsVersionBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeEnum(3, deviceType_.getNumber());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBytes(4, getCountryBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeBytes(5, getLocaleBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeEnum(6, osType_.getNumber());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(1, getOsBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, getOsVersionBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(3, deviceType_.getNumber());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(4, getCountryBytes());
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(5, getLocaleBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(6, osType_.getNumber());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.JsClientInfo}
     *
     * <pre>
     * Attributes specific to JavaScript clients.
     *
     *  Next tag: 7
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_JsClientInfo_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_JsClientInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        os_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        osVersion_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        deviceType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType.UNKNOWN;
        bitField0_ = (bitField0_ & ~0x00000004);
        country_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        locale_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        osType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType.OS_UNKNOWN;
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_JsClientInfo_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.os_ = os_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.osVersion_ = osVersion_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.deviceType_ = deviceType_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.country_ = country_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.locale_ = locale_;
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        result.osType_ = osType_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.getDefaultInstance()) return this;
        if (other.hasOs()) {
          bitField0_ |= 0x00000001;
          os_ = other.os_;
          onChanged();
        }
        if (other.hasOsVersion()) {
          bitField0_ |= 0x00000002;
          osVersion_ = other.osVersion_;
          onChanged();
        }
        if (other.hasDeviceType()) {
          setDeviceType(other.getDeviceType());
        }
        if (other.hasCountry()) {
          bitField0_ |= 0x00000008;
          country_ = other.country_;
          onChanged();
        }
        if (other.hasLocale()) {
          bitField0_ |= 0x00000010;
          locale_ = other.locale_;
          onChanged();
        }
        if (other.hasOsType()) {
          setOsType(other.getOsType());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional string os = 1;
      private java.lang.Object os_ = "";
      /**
       * <code>optional string os = 1;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public boolean hasOs() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional string os = 1;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public java.lang.String getOs() {
        java.lang.Object ref = os_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          os_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string os = 1;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public com.google.protobuf.ByteString
          getOsBytes() {
        java.lang.Object ref = os_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          os_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string os = 1;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public Builder setOs(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        os_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string os = 1;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public Builder clearOs() {
        bitField0_ = (bitField0_ & ~0x00000001);
        os_ = getDefaultInstance().getOs();
        onChanged();
        return this;
      }
      /**
       * <code>optional string os = 1;</code>
       *
       * <pre>
       * e.g., "mac", "windows", "linux"
       * </pre>
       */
      public Builder setOsBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        os_ = value;
        onChanged();
        return this;
      }

      // optional string os_version = 2;
      private java.lang.Object osVersion_ = "";
      /**
       * <code>optional string os_version = 2;</code>
       *
       * <pre>
       * The OS version (not available for everything).
       * </pre>
       */
      public boolean hasOsVersion() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string os_version = 2;</code>
       *
       * <pre>
       * The OS version (not available for everything).
       * </pre>
       */
      public java.lang.String getOsVersion() {
        java.lang.Object ref = osVersion_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          osVersion_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string os_version = 2;</code>
       *
       * <pre>
       * The OS version (not available for everything).
       * </pre>
       */
      public com.google.protobuf.ByteString
          getOsVersionBytes() {
        java.lang.Object ref = osVersion_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          osVersion_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string os_version = 2;</code>
       *
       * <pre>
       * The OS version (not available for everything).
       * </pre>
       */
      public Builder setOsVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        osVersion_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_version = 2;</code>
       *
       * <pre>
       * The OS version (not available for everything).
       * </pre>
       */
      public Builder clearOsVersion() {
        bitField0_ = (bitField0_ & ~0x00000002);
        osVersion_ = getDefaultInstance().getOsVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string os_version = 2;</code>
       *
       * <pre>
       * The OS version (not available for everything).
       * </pre>
       */
      public Builder setOsVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        osVersion_ = value;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType deviceType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType.UNKNOWN;
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;</code>
       */
      public boolean hasDeviceType() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType getDeviceType() {
        return deviceType_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;</code>
       */
      public Builder setDeviceType(com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000004;
        deviceType_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo.DeviceType device_type = 3;</code>
       */
      public Builder clearDeviceType() {
        bitField0_ = (bitField0_ & ~0x00000004);
        deviceType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.DeviceType.UNKNOWN;
        onChanged();
        return this;
      }

      // optional string country = 4;
      private java.lang.Object country_ = "";
      /**
       * <code>optional string country = 4;</code>
       *
       * <pre>
       * The country from the client. e.g., "US", "KR", "JP".
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public boolean hasCountry() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional string country = 4;</code>
       *
       * <pre>
       * The country from the client. e.g., "US", "KR", "JP".
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public java.lang.String getCountry() {
        java.lang.Object ref = country_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          country_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string country = 4;</code>
       *
       * <pre>
       * The country from the client. e.g., "US", "KR", "JP".
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getCountryBytes() {
        java.lang.Object ref = country_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          country_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string country = 4;</code>
       *
       * <pre>
       * The country from the client. e.g., "US", "KR", "JP".
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public Builder setCountry(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        country_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 4;</code>
       *
       * <pre>
       * The country from the client. e.g., "US", "KR", "JP".
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public Builder clearCountry() {
        bitField0_ = (bitField0_ & ~0x00000008);
        country_ = getDefaultInstance().getCountry();
        onChanged();
        return this;
      }
      /**
       * <code>optional string country = 4;</code>
       *
       * <pre>
       * The country from the client. e.g., "US", "KR", "JP".
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public Builder setCountryBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        country_ = value;
        onChanged();
        return this;
      }

      // optional string locale = 5;
      private java.lang.Object locale_ = "";
      /**
       * <code>optional string locale = 5;</code>
       *
       * <pre>
       * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
       *  differ from the browser's locale if the user overrode the language
       *  settings.
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public boolean hasLocale() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional string locale = 5;</code>
       *
       * <pre>
       * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
       *  differ from the browser's locale if the user overrode the language
       *  settings.
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public java.lang.String getLocale() {
        java.lang.Object ref = locale_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          locale_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string locale = 5;</code>
       *
       * <pre>
       * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
       *  differ from the browser's locale if the user overrode the language
       *  settings.
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getLocaleBytes() {
        java.lang.Object ref = locale_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          locale_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string locale = 5;</code>
       *
       * <pre>
       * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
       *  differ from the browser's locale if the user overrode the language
       *  settings.
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public Builder setLocale(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        locale_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string locale = 5;</code>
       *
       * <pre>
       * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
       *  differ from the browser's locale if the user overrode the language
       *  settings.
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public Builder clearLocale() {
        bitField0_ = (bitField0_ & ~0x00000010);
        locale_ = getDefaultInstance().getLocale();
        onChanged();
        return this;
      }
      /**
       * <code>optional string locale = 5;</code>
       *
       * <pre>
       * The locale used to display the page, e.g., "de_DE", "en", "en_US"; this may
       *  differ from the browser's locale if the user overrode the language
       *  settings.
       *  Only populated if the client explicitly sets it.
       * </pre>
       */
      public Builder setLocaleBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        locale_ = value;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType osType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType.OS_UNKNOWN;
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;</code>
       *
       * <pre>
       * e.g., MAC, WINDOWS, ANDROID etc.
       * </pre>
       */
      public boolean hasOsType() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;</code>
       *
       * <pre>
       * e.g., MAC, WINDOWS, ANDROID etc.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType getOsType() {
        return osType_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;</code>
       *
       * <pre>
       * e.g., MAC, WINDOWS, ANDROID etc.
       * </pre>
       */
      public Builder setOsType(com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000020;
        osType_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo.OsType os_type = 6;</code>
       *
       * <pre>
       * e.g., MAC, WINDOWS, ANDROID etc.
       * </pre>
       */
      public Builder clearOsType() {
        bitField0_ = (bitField0_ & ~0x00000020);
        osType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.OsType.OS_UNKNOWN;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.JsClientInfo)
    }

    static {
      defaultInstance = new JsClientInfo(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.JsClientInfo)
  }

  public interface ClientInfoOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;
    /**
     * <code>optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;</code>
     *
     * <pre>
     * The client type for this client. One of the enum values defined above.
     * </pre>
     */
    boolean hasClientType();
    /**
     * <code>optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;</code>
     *
     * <pre>
     * The client type for this client. One of the enum values defined above.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType getClientType();

    // optional string remote_host = 6;
    /**
     * <code>optional string remote_host = 6;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    boolean hasRemoteHost();
    /**
     * <code>optional string remote_host = 6;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    java.lang.String getRemoteHost();
    /**
     * <code>optional string remote_host = 6;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    com.google.protobuf.ByteString
        getRemoteHostBytes();

    // optional string remote_host6 = 7;
    /**
     * <code>optional string remote_host6 = 7;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost6.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    boolean hasRemoteHost6();
    /**
     * <code>optional string remote_host6 = 7;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost6.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    java.lang.String getRemoteHost6();
    /**
     * <code>optional string remote_host6 = 7;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost6.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    com.google.protobuf.ByteString
        getRemoteHost6Bytes();

    // optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;
    /**
     * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
     *
     * <pre>
     * Only one of the following *_client_info fields will exist in any request.
     * </pre>
     */
    boolean hasAndroidClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
     *
     * <pre>
     * Only one of the following *_client_info fields will exist in any request.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo getAndroidClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
     *
     * <pre>
     * Only one of the following *_client_info fields will exist in any request.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfoOrBuilder getAndroidClientInfoOrBuilder();

    // optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;
    /**
     * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
     */
    boolean hasDesktopClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo getDesktopClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfoOrBuilder getDesktopClientInfoOrBuilder();

    // optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;
    /**
     * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
     */
    boolean hasIosClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo getIosClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfoOrBuilder getIosClientInfoOrBuilder();

    // optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;
    /**
     * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
     */
    boolean hasPlayCeClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo getPlayCeClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfoOrBuilder getPlayCeClientInfoOrBuilder();

    // optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;
    /**
     * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
     */
    boolean hasVrClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo getVrClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfoOrBuilder getVrClientInfoOrBuilder();

    // optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;
    /**
     * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
     *
     * <pre>
     * Pancetta contact: pancetta-cloud-eng@.
     * </pre>
     */
    boolean hasPancettaClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
     *
     * <pre>
     * Pancetta contact: pancetta-cloud-eng@.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo getPancettaClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
     *
     * <pre>
     * Pancetta contact: pancetta-cloud-eng@.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfoOrBuilder getPancettaClientInfoOrBuilder();

    // optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;
    /**
     * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
     *
     * <pre>
     * The browser used to make the request, if accessing through any web client.
     * </pre>
     */
    boolean hasBrowserInfo();
    /**
     * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
     *
     * <pre>
     * The browser used to make the request, if accessing through any web client.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo getBrowserInfo();
    /**
     * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
     *
     * <pre>
     * The browser used to make the request, if accessing through any web client.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfoOrBuilder getBrowserInfoOrBuilder();

    // optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
     */
    boolean hasJsClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo getJsClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfoOrBuilder getJsClientInfoOrBuilder();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.ClientInfo}
   *
   * <pre>
   * Next tag: 12
   * </pre>
   */
  public static final class ClientInfo extends
      com.google.protobuf.GeneratedMessage
      implements ClientInfoOrBuilder {
    // Use ClientInfo.newBuilder() to construct.
    private ClientInfo(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private ClientInfo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final ClientInfo defaultInstance;
    public static ClientInfo getDefaultInstance() {
      return defaultInstance;
    }

    public ClientInfo getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private ClientInfo(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(1, rawValue);
              } else {
                bitField0_ |= 0x00000001;
                clientType_ = value;
              }
              break;
            }
            case 18: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000008) == 0x00000008)) {
                subBuilder = androidClientInfo_.toBuilder();
              }
              androidClientInfo_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(androidClientInfo_);
                androidClientInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000008;
              break;
            }
            case 26: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000010) == 0x00000010)) {
                subBuilder = desktopClientInfo_.toBuilder();
              }
              desktopClientInfo_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(desktopClientInfo_);
                desktopClientInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000010;
              break;
            }
            case 34: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000020) == 0x00000020)) {
                subBuilder = iosClientInfo_.toBuilder();
              }
              iosClientInfo_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(iosClientInfo_);
                iosClientInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000020;
              break;
            }
            case 42: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000040) == 0x00000040)) {
                subBuilder = playCeClientInfo_.toBuilder();
              }
              playCeClientInfo_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(playCeClientInfo_);
                playCeClientInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000040;
              break;
            }
            case 50: {
              bitField0_ |= 0x00000002;
              remoteHost_ = input.readBytes();
              break;
            }
            case 58: {
              bitField0_ |= 0x00000004;
              remoteHost6_ = input.readBytes();
              break;
            }
            case 66: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000080) == 0x00000080)) {
                subBuilder = vrClientInfo_.toBuilder();
              }
              vrClientInfo_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(vrClientInfo_);
                vrClientInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000080;
              break;
            }
            case 74: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000200) == 0x00000200)) {
                subBuilder = browserInfo_.toBuilder();
              }
              browserInfo_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(browserInfo_);
                browserInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000200;
              break;
            }
            case 82: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000100) == 0x00000100)) {
                subBuilder = pancettaClientInfo_.toBuilder();
              }
              pancettaClientInfo_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(pancettaClientInfo_);
                pancettaClientInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000100;
              break;
            }
            case 90: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000400) == 0x00000400)) {
                subBuilder = jsClientInfo_.toBuilder();
              }
              jsClientInfo_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(jsClientInfo_);
                jsClientInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000400;
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ClientInfo_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ClientInfo_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.Builder.class);
    }

    public static com.google.protobuf.Parser<ClientInfo> PARSER =
        new com.google.protobuf.AbstractParser<ClientInfo>() {
      public ClientInfo parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new ClientInfo(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<ClientInfo> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.ClientInfo.ClientType}
     *
     * <pre>
     * The type of client that made this request.
     *  Next enum tag: 10
     * </pre>
     */
    public enum ClientType
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>UNKNOWN = 0;</code>
       *
       * <pre>
       * Client type is unknown.
       * </pre>
       */
      UNKNOWN(0, 0),
      /**
       * <code>JS = 1;</code>
       *
       * <pre>
       * Client type is Javascript.
       * </pre>
       */
      JS(1, 1),
      /**
       * <code>DESKTOP = 2;</code>
       *
       * <pre>
       * Desktop client type.
       * </pre>
       */
      DESKTOP(2, 2),
      /**
       * <code>IOS = 3;</code>
       *
       * <pre>
       * iOS client type.
       * </pre>
       */
      IOS(3, 3),
      /**
       * <code>ANDROID = 4;</code>
       *
       * <pre>
       * Android client type.
       * </pre>
       */
      ANDROID(4, 4),
      /**
       * <code>PLAY_CE = 5;</code>
       *
       * <pre>
       * This is to be used by third party consumer electronics devices
       *  with GooglePlay apps, e.g.: Roku, Smart TVs etc.
       * </pre>
       */
      PLAY_CE(5, 5),
      /**
       * <code>PYTHON = 6;</code>
       *
       * <pre>
       * Python client type.
       * </pre>
       */
      PYTHON(6, 6),
      /**
       * <code>VR = 7;</code>
       *
       * <pre>
       * VR client type.
       * </pre>
       */
      VR(7, 7),
      /**
       * <code>PANCETTA = 8;</code>
       *
       * <pre>
       * Pancetta client type. go/pancetta
       * </pre>
       */
      PANCETTA(8, 8),
      /**
       * <code>DRIVE_FS = 9;</code>
       *
       * <pre>
       * DriveFS client type. go/drive-fs
       * </pre>
       */
      DRIVE_FS(9, 9),
      ;

      /**
       * <code>UNKNOWN = 0;</code>
       *
       * <pre>
       * Client type is unknown.
       * </pre>
       */
      public static final int UNKNOWN_VALUE = 0;
      /**
       * <code>JS = 1;</code>
       *
       * <pre>
       * Client type is Javascript.
       * </pre>
       */
      public static final int JS_VALUE = 1;
      /**
       * <code>DESKTOP = 2;</code>
       *
       * <pre>
       * Desktop client type.
       * </pre>
       */
      public static final int DESKTOP_VALUE = 2;
      /**
       * <code>IOS = 3;</code>
       *
       * <pre>
       * iOS client type.
       * </pre>
       */
      public static final int IOS_VALUE = 3;
      /**
       * <code>ANDROID = 4;</code>
       *
       * <pre>
       * Android client type.
       * </pre>
       */
      public static final int ANDROID_VALUE = 4;
      /**
       * <code>PLAY_CE = 5;</code>
       *
       * <pre>
       * This is to be used by third party consumer electronics devices
       *  with GooglePlay apps, e.g.: Roku, Smart TVs etc.
       * </pre>
       */
      public static final int PLAY_CE_VALUE = 5;
      /**
       * <code>PYTHON = 6;</code>
       *
       * <pre>
       * Python client type.
       * </pre>
       */
      public static final int PYTHON_VALUE = 6;
      /**
       * <code>VR = 7;</code>
       *
       * <pre>
       * VR client type.
       * </pre>
       */
      public static final int VR_VALUE = 7;
      /**
       * <code>PANCETTA = 8;</code>
       *
       * <pre>
       * Pancetta client type. go/pancetta
       * </pre>
       */
      public static final int PANCETTA_VALUE = 8;
      /**
       * <code>DRIVE_FS = 9;</code>
       *
       * <pre>
       * DriveFS client type. go/drive-fs
       * </pre>
       */
      public static final int DRIVE_FS_VALUE = 9;


      public final int getNumber() { return value; }

      public static ClientType valueOf(int value) {
        switch (value) {
          case 0: return UNKNOWN;
          case 1: return JS;
          case 2: return DESKTOP;
          case 3: return IOS;
          case 4: return ANDROID;
          case 5: return PLAY_CE;
          case 6: return PYTHON;
          case 7: return VR;
          case 8: return PANCETTA;
          case 9: return DRIVE_FS;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<ClientType>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<ClientType>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<ClientType>() {
              public ClientType findValueByNumber(int number) {
                return ClientType.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.getDescriptor().getEnumTypes().get(0);
      }

      private static final ClientType[] VALUES = values();

      public static ClientType valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private ClientType(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.ClientInfo.ClientType)
    }

    private int bitField0_;
    // optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;
    public static final int CLIENT_TYPE_FIELD_NUMBER = 1;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType clientType_;
    /**
     * <code>optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;</code>
     *
     * <pre>
     * The client type for this client. One of the enum values defined above.
     * </pre>
     */
    public boolean hasClientType() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;</code>
     *
     * <pre>
     * The client type for this client. One of the enum values defined above.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType getClientType() {
      return clientType_;
    }

    // optional string remote_host = 6;
    public static final int REMOTE_HOST_FIELD_NUMBER = 6;
    private java.lang.Object remoteHost_;
    /**
     * <code>optional string remote_host = 6;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    public boolean hasRemoteHost() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string remote_host = 6;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    public java.lang.String getRemoteHost() {
      java.lang.Object ref = remoteHost_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          remoteHost_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string remote_host = 6;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getRemoteHostBytes() {
      java.lang.Object ref = remoteHost_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        remoteHost_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string remote_host6 = 7;
    public static final int REMOTE_HOST6_FIELD_NUMBER = 7;
    private java.lang.Object remoteHost6_;
    /**
     * <code>optional string remote_host6 = 7;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost6.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    public boolean hasRemoteHost6() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional string remote_host6 = 7;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost6.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    public java.lang.String getRemoteHost6() {
      java.lang.Object ref = remoteHost6_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          remoteHost6_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string remote_host6 = 7;</code>
     *
     * <pre>
     * Identical to GWSLogEntryProto.RemoteHost6.
     *  Set by the Clearcut server when ClientInfo is written to Footprints.
     *  Do not set this value in client code; the server will ignore it.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getRemoteHost6Bytes() {
      java.lang.Object ref = remoteHost6_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        remoteHost6_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;
    public static final int ANDROID_CLIENT_INFO_FIELD_NUMBER = 2;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo androidClientInfo_;
    /**
     * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
     *
     * <pre>
     * Only one of the following *_client_info fields will exist in any request.
     * </pre>
     */
    public boolean hasAndroidClientInfo() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
     *
     * <pre>
     * Only one of the following *_client_info fields will exist in any request.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo getAndroidClientInfo() {
      return androidClientInfo_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
     *
     * <pre>
     * Only one of the following *_client_info fields will exist in any request.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfoOrBuilder getAndroidClientInfoOrBuilder() {
      return androidClientInfo_;
    }

    // optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;
    public static final int DESKTOP_CLIENT_INFO_FIELD_NUMBER = 3;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo desktopClientInfo_;
    /**
     * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
     */
    public boolean hasDesktopClientInfo() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo getDesktopClientInfo() {
      return desktopClientInfo_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfoOrBuilder getDesktopClientInfoOrBuilder() {
      return desktopClientInfo_;
    }

    // optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;
    public static final int IOS_CLIENT_INFO_FIELD_NUMBER = 4;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo iosClientInfo_;
    /**
     * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
     */
    public boolean hasIosClientInfo() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo getIosClientInfo() {
      return iosClientInfo_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfoOrBuilder getIosClientInfoOrBuilder() {
      return iosClientInfo_;
    }

    // optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;
    public static final int PLAY_CE_CLIENT_INFO_FIELD_NUMBER = 5;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo playCeClientInfo_;
    /**
     * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
     */
    public boolean hasPlayCeClientInfo() {
      return ((bitField0_ & 0x00000040) == 0x00000040);
    }
    /**
     * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo getPlayCeClientInfo() {
      return playCeClientInfo_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfoOrBuilder getPlayCeClientInfoOrBuilder() {
      return playCeClientInfo_;
    }

    // optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;
    public static final int VR_CLIENT_INFO_FIELD_NUMBER = 8;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo vrClientInfo_;
    /**
     * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
     */
    public boolean hasVrClientInfo() {
      return ((bitField0_ & 0x00000080) == 0x00000080);
    }
    /**
     * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo getVrClientInfo() {
      return vrClientInfo_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfoOrBuilder getVrClientInfoOrBuilder() {
      return vrClientInfo_;
    }

    // optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;
    public static final int PANCETTA_CLIENT_INFO_FIELD_NUMBER = 10;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo pancettaClientInfo_;
    /**
     * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
     *
     * <pre>
     * Pancetta contact: pancetta-cloud-eng@.
     * </pre>
     */
    public boolean hasPancettaClientInfo() {
      return ((bitField0_ & 0x00000100) == 0x00000100);
    }
    /**
     * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
     *
     * <pre>
     * Pancetta contact: pancetta-cloud-eng@.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo getPancettaClientInfo() {
      return pancettaClientInfo_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
     *
     * <pre>
     * Pancetta contact: pancetta-cloud-eng@.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfoOrBuilder getPancettaClientInfoOrBuilder() {
      return pancettaClientInfo_;
    }

    // optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;
    public static final int BROWSER_INFO_FIELD_NUMBER = 9;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo browserInfo_;
    /**
     * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
     *
     * <pre>
     * The browser used to make the request, if accessing through any web client.
     * </pre>
     */
    public boolean hasBrowserInfo() {
      return ((bitField0_ & 0x00000200) == 0x00000200);
    }
    /**
     * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
     *
     * <pre>
     * The browser used to make the request, if accessing through any web client.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo getBrowserInfo() {
      return browserInfo_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
     *
     * <pre>
     * The browser used to make the request, if accessing through any web client.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfoOrBuilder getBrowserInfoOrBuilder() {
      return browserInfo_;
    }

    // optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;
    public static final int JS_CLIENT_INFO_FIELD_NUMBER = 11;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo jsClientInfo_;
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
     */
    public boolean hasJsClientInfo() {
      return ((bitField0_ & 0x00000400) == 0x00000400);
    }
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo getJsClientInfo() {
      return jsClientInfo_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfoOrBuilder getJsClientInfoOrBuilder() {
      return jsClientInfo_;
    }

    private void initFields() {
      clientType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType.UNKNOWN;
      remoteHost_ = "";
      remoteHost6_ = "";
      androidClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.getDefaultInstance();
      desktopClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.getDefaultInstance();
      iosClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.getDefaultInstance();
      playCeClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.getDefaultInstance();
      vrClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.getDefaultInstance();
      pancettaClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.getDefaultInstance();
      browserInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.getDefaultInstance();
      jsClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.getDefaultInstance();
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeEnum(1, clientType_.getNumber());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeMessage(2, androidClientInfo_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeMessage(3, desktopClientInfo_);
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeMessage(4, iosClientInfo_);
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        output.writeMessage(5, playCeClientInfo_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(6, getRemoteHostBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(7, getRemoteHost6Bytes());
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        output.writeMessage(8, vrClientInfo_);
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        output.writeMessage(9, browserInfo_);
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        output.writeMessage(10, pancettaClientInfo_);
      }
      if (((bitField0_ & 0x00000400) == 0x00000400)) {
        output.writeMessage(11, jsClientInfo_);
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(1, clientType_.getNumber());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, androidClientInfo_);
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, desktopClientInfo_);
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, iosClientInfo_);
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(5, playCeClientInfo_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(6, getRemoteHostBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(7, getRemoteHost6Bytes());
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(8, vrClientInfo_);
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(9, browserInfo_);
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(10, pancettaClientInfo_);
      }
      if (((bitField0_ & 0x00000400) == 0x00000400)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(11, jsClientInfo_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.ClientInfo}
     *
     * <pre>
     * Next tag: 12
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfoOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ClientInfo_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ClientInfo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          getAndroidClientInfoFieldBuilder();
          getDesktopClientInfoFieldBuilder();
          getIosClientInfoFieldBuilder();
          getPlayCeClientInfoFieldBuilder();
          getVrClientInfoFieldBuilder();
          getPancettaClientInfoFieldBuilder();
          getBrowserInfoFieldBuilder();
          getJsClientInfoFieldBuilder();
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        clientType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType.UNKNOWN;
        bitField0_ = (bitField0_ & ~0x00000001);
        remoteHost_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        remoteHost6_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        if (androidClientInfoBuilder_ == null) {
          androidClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.getDefaultInstance();
        } else {
          androidClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        if (desktopClientInfoBuilder_ == null) {
          desktopClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.getDefaultInstance();
        } else {
          desktopClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000010);
        if (iosClientInfoBuilder_ == null) {
          iosClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.getDefaultInstance();
        } else {
          iosClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000020);
        if (playCeClientInfoBuilder_ == null) {
          playCeClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.getDefaultInstance();
        } else {
          playCeClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000040);
        if (vrClientInfoBuilder_ == null) {
          vrClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.getDefaultInstance();
        } else {
          vrClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000080);
        if (pancettaClientInfoBuilder_ == null) {
          pancettaClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.getDefaultInstance();
        } else {
          pancettaClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000100);
        if (browserInfoBuilder_ == null) {
          browserInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.getDefaultInstance();
        } else {
          browserInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000200);
        if (jsClientInfoBuilder_ == null) {
          jsClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.getDefaultInstance();
        } else {
          jsClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000400);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ClientInfo_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.clientType_ = clientType_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.remoteHost_ = remoteHost_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.remoteHost6_ = remoteHost6_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        if (androidClientInfoBuilder_ == null) {
          result.androidClientInfo_ = androidClientInfo_;
        } else {
          result.androidClientInfo_ = androidClientInfoBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        if (desktopClientInfoBuilder_ == null) {
          result.desktopClientInfo_ = desktopClientInfo_;
        } else {
          result.desktopClientInfo_ = desktopClientInfoBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        if (iosClientInfoBuilder_ == null) {
          result.iosClientInfo_ = iosClientInfo_;
        } else {
          result.iosClientInfo_ = iosClientInfoBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
          to_bitField0_ |= 0x00000040;
        }
        if (playCeClientInfoBuilder_ == null) {
          result.playCeClientInfo_ = playCeClientInfo_;
        } else {
          result.playCeClientInfo_ = playCeClientInfoBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
          to_bitField0_ |= 0x00000080;
        }
        if (vrClientInfoBuilder_ == null) {
          result.vrClientInfo_ = vrClientInfo_;
        } else {
          result.vrClientInfo_ = vrClientInfoBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
          to_bitField0_ |= 0x00000100;
        }
        if (pancettaClientInfoBuilder_ == null) {
          result.pancettaClientInfo_ = pancettaClientInfo_;
        } else {
          result.pancettaClientInfo_ = pancettaClientInfoBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000200) == 0x00000200)) {
          to_bitField0_ |= 0x00000200;
        }
        if (browserInfoBuilder_ == null) {
          result.browserInfo_ = browserInfo_;
        } else {
          result.browserInfo_ = browserInfoBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
          to_bitField0_ |= 0x00000400;
        }
        if (jsClientInfoBuilder_ == null) {
          result.jsClientInfo_ = jsClientInfo_;
        } else {
          result.jsClientInfo_ = jsClientInfoBuilder_.build();
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.getDefaultInstance()) return this;
        if (other.hasClientType()) {
          setClientType(other.getClientType());
        }
        if (other.hasRemoteHost()) {
          bitField0_ |= 0x00000002;
          remoteHost_ = other.remoteHost_;
          onChanged();
        }
        if (other.hasRemoteHost6()) {
          bitField0_ |= 0x00000004;
          remoteHost6_ = other.remoteHost6_;
          onChanged();
        }
        if (other.hasAndroidClientInfo()) {
          mergeAndroidClientInfo(other.getAndroidClientInfo());
        }
        if (other.hasDesktopClientInfo()) {
          mergeDesktopClientInfo(other.getDesktopClientInfo());
        }
        if (other.hasIosClientInfo()) {
          mergeIosClientInfo(other.getIosClientInfo());
        }
        if (other.hasPlayCeClientInfo()) {
          mergePlayCeClientInfo(other.getPlayCeClientInfo());
        }
        if (other.hasVrClientInfo()) {
          mergeVrClientInfo(other.getVrClientInfo());
        }
        if (other.hasPancettaClientInfo()) {
          mergePancettaClientInfo(other.getPancettaClientInfo());
        }
        if (other.hasBrowserInfo()) {
          mergeBrowserInfo(other.getBrowserInfo());
        }
        if (other.hasJsClientInfo()) {
          mergeJsClientInfo(other.getJsClientInfo());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType clientType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType.UNKNOWN;
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;</code>
       *
       * <pre>
       * The client type for this client. One of the enum values defined above.
       * </pre>
       */
      public boolean hasClientType() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;</code>
       *
       * <pre>
       * The client type for this client. One of the enum values defined above.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType getClientType() {
        return clientType_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;</code>
       *
       * <pre>
       * The client type for this client. One of the enum values defined above.
       * </pre>
       */
      public Builder setClientType(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000001;
        clientType_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo.ClientType client_type = 1;</code>
       *
       * <pre>
       * The client type for this client. One of the enum values defined above.
       * </pre>
       */
      public Builder clearClientType() {
        bitField0_ = (bitField0_ & ~0x00000001);
        clientType_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.ClientType.UNKNOWN;
        onChanged();
        return this;
      }

      // optional string remote_host = 6;
      private java.lang.Object remoteHost_ = "";
      /**
       * <code>optional string remote_host = 6;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public boolean hasRemoteHost() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string remote_host = 6;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public java.lang.String getRemoteHost() {
        java.lang.Object ref = remoteHost_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          remoteHost_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string remote_host = 6;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getRemoteHostBytes() {
        java.lang.Object ref = remoteHost_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          remoteHost_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string remote_host = 6;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public Builder setRemoteHost(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        remoteHost_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string remote_host = 6;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public Builder clearRemoteHost() {
        bitField0_ = (bitField0_ & ~0x00000002);
        remoteHost_ = getDefaultInstance().getRemoteHost();
        onChanged();
        return this;
      }
      /**
       * <code>optional string remote_host = 6;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public Builder setRemoteHostBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        remoteHost_ = value;
        onChanged();
        return this;
      }

      // optional string remote_host6 = 7;
      private java.lang.Object remoteHost6_ = "";
      /**
       * <code>optional string remote_host6 = 7;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost6.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public boolean hasRemoteHost6() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional string remote_host6 = 7;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost6.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public java.lang.String getRemoteHost6() {
        java.lang.Object ref = remoteHost6_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          remoteHost6_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string remote_host6 = 7;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost6.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getRemoteHost6Bytes() {
        java.lang.Object ref = remoteHost6_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          remoteHost6_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string remote_host6 = 7;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost6.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public Builder setRemoteHost6(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        remoteHost6_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string remote_host6 = 7;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost6.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public Builder clearRemoteHost6() {
        bitField0_ = (bitField0_ & ~0x00000004);
        remoteHost6_ = getDefaultInstance().getRemoteHost6();
        onChanged();
        return this;
      }
      /**
       * <code>optional string remote_host6 = 7;</code>
       *
       * <pre>
       * Identical to GWSLogEntryProto.RemoteHost6.
       *  Set by the Clearcut server when ClientInfo is written to Footprints.
       *  Do not set this value in client code; the server will ignore it.
       * </pre>
       */
      public Builder setRemoteHost6Bytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        remoteHost6_ = value;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo androidClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfoOrBuilder> androidClientInfoBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
       *
       * <pre>
       * Only one of the following *_client_info fields will exist in any request.
       * </pre>
       */
      public boolean hasAndroidClientInfo() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
       *
       * <pre>
       * Only one of the following *_client_info fields will exist in any request.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo getAndroidClientInfo() {
        if (androidClientInfoBuilder_ == null) {
          return androidClientInfo_;
        } else {
          return androidClientInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
       *
       * <pre>
       * Only one of the following *_client_info fields will exist in any request.
       * </pre>
       */
      public Builder setAndroidClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo value) {
        if (androidClientInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          androidClientInfo_ = value;
          onChanged();
        } else {
          androidClientInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
       *
       * <pre>
       * Only one of the following *_client_info fields will exist in any request.
       * </pre>
       */
      public Builder setAndroidClientInfo(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.Builder builderForValue) {
        if (androidClientInfoBuilder_ == null) {
          androidClientInfo_ = builderForValue.build();
          onChanged();
        } else {
          androidClientInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
       *
       * <pre>
       * Only one of the following *_client_info fields will exist in any request.
       * </pre>
       */
      public Builder mergeAndroidClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo value) {
        if (androidClientInfoBuilder_ == null) {
          if (((bitField0_ & 0x00000008) == 0x00000008) &&
              androidClientInfo_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.getDefaultInstance()) {
            androidClientInfo_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.newBuilder(androidClientInfo_).mergeFrom(value).buildPartial();
          } else {
            androidClientInfo_ = value;
          }
          onChanged();
        } else {
          androidClientInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
       *
       * <pre>
       * Only one of the following *_client_info fields will exist in any request.
       * </pre>
       */
      public Builder clearAndroidClientInfo() {
        if (androidClientInfoBuilder_ == null) {
          androidClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.getDefaultInstance();
          onChanged();
        } else {
          androidClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
       *
       * <pre>
       * Only one of the following *_client_info fields will exist in any request.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.Builder getAndroidClientInfoBuilder() {
        bitField0_ |= 0x00000008;
        onChanged();
        return getAndroidClientInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
       *
       * <pre>
       * Only one of the following *_client_info fields will exist in any request.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfoOrBuilder getAndroidClientInfoOrBuilder() {
        if (androidClientInfoBuilder_ != null) {
          return androidClientInfoBuilder_.getMessageOrBuilder();
        } else {
          return androidClientInfo_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.AndroidClientInfo android_client_info = 2;</code>
       *
       * <pre>
       * Only one of the following *_client_info fields will exist in any request.
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfoOrBuilder> 
          getAndroidClientInfoFieldBuilder() {
        if (androidClientInfoBuilder_ == null) {
          androidClientInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AndroidClientInfoOrBuilder>(
                  androidClientInfo_,
                  getParentForChildren(),
                  isClean());
          androidClientInfo_ = null;
        }
        return androidClientInfoBuilder_;
      }

      // optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo desktopClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfoOrBuilder> desktopClientInfoBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
       */
      public boolean hasDesktopClientInfo() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo getDesktopClientInfo() {
        if (desktopClientInfoBuilder_ == null) {
          return desktopClientInfo_;
        } else {
          return desktopClientInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
       */
      public Builder setDesktopClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo value) {
        if (desktopClientInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          desktopClientInfo_ = value;
          onChanged();
        } else {
          desktopClientInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
       */
      public Builder setDesktopClientInfo(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.Builder builderForValue) {
        if (desktopClientInfoBuilder_ == null) {
          desktopClientInfo_ = builderForValue.build();
          onChanged();
        } else {
          desktopClientInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
       */
      public Builder mergeDesktopClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo value) {
        if (desktopClientInfoBuilder_ == null) {
          if (((bitField0_ & 0x00000010) == 0x00000010) &&
              desktopClientInfo_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.getDefaultInstance()) {
            desktopClientInfo_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.newBuilder(desktopClientInfo_).mergeFrom(value).buildPartial();
          } else {
            desktopClientInfo_ = value;
          }
          onChanged();
        } else {
          desktopClientInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
       */
      public Builder clearDesktopClientInfo() {
        if (desktopClientInfoBuilder_ == null) {
          desktopClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.getDefaultInstance();
          onChanged();
        } else {
          desktopClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.Builder getDesktopClientInfoBuilder() {
        bitField0_ |= 0x00000010;
        onChanged();
        return getDesktopClientInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfoOrBuilder getDesktopClientInfoOrBuilder() {
        if (desktopClientInfoBuilder_ != null) {
          return desktopClientInfoBuilder_.getMessageOrBuilder();
        } else {
          return desktopClientInfo_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.DesktopClientInfo desktop_client_info = 3;</code>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfoOrBuilder> 
          getDesktopClientInfoFieldBuilder() {
        if (desktopClientInfoBuilder_ == null) {
          desktopClientInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DesktopClientInfoOrBuilder>(
                  desktopClientInfo_,
                  getParentForChildren(),
                  isClean());
          desktopClientInfo_ = null;
        }
        return desktopClientInfoBuilder_;
      }

      // optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo iosClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfoOrBuilder> iosClientInfoBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
       */
      public boolean hasIosClientInfo() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo getIosClientInfo() {
        if (iosClientInfoBuilder_ == null) {
          return iosClientInfo_;
        } else {
          return iosClientInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
       */
      public Builder setIosClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo value) {
        if (iosClientInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          iosClientInfo_ = value;
          onChanged();
        } else {
          iosClientInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
       */
      public Builder setIosClientInfo(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.Builder builderForValue) {
        if (iosClientInfoBuilder_ == null) {
          iosClientInfo_ = builderForValue.build();
          onChanged();
        } else {
          iosClientInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
       */
      public Builder mergeIosClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo value) {
        if (iosClientInfoBuilder_ == null) {
          if (((bitField0_ & 0x00000020) == 0x00000020) &&
              iosClientInfo_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.getDefaultInstance()) {
            iosClientInfo_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.newBuilder(iosClientInfo_).mergeFrom(value).buildPartial();
          } else {
            iosClientInfo_ = value;
          }
          onChanged();
        } else {
          iosClientInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
       */
      public Builder clearIosClientInfo() {
        if (iosClientInfoBuilder_ == null) {
          iosClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.getDefaultInstance();
          onChanged();
        } else {
          iosClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.Builder getIosClientInfoBuilder() {
        bitField0_ |= 0x00000020;
        onChanged();
        return getIosClientInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfoOrBuilder getIosClientInfoOrBuilder() {
        if (iosClientInfoBuilder_ != null) {
          return iosClientInfoBuilder_.getMessageOrBuilder();
        } else {
          return iosClientInfo_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.IosClientInfo ios_client_info = 4;</code>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfoOrBuilder> 
          getIosClientInfoFieldBuilder() {
        if (iosClientInfoBuilder_ == null) {
          iosClientInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.IosClientInfoOrBuilder>(
                  iosClientInfo_,
                  getParentForChildren(),
                  isClean());
          iosClientInfo_ = null;
        }
        return iosClientInfoBuilder_;
      }

      // optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo playCeClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfoOrBuilder> playCeClientInfoBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
       */
      public boolean hasPlayCeClientInfo() {
        return ((bitField0_ & 0x00000040) == 0x00000040);
      }
      /**
       * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo getPlayCeClientInfo() {
        if (playCeClientInfoBuilder_ == null) {
          return playCeClientInfo_;
        } else {
          return playCeClientInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
       */
      public Builder setPlayCeClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo value) {
        if (playCeClientInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          playCeClientInfo_ = value;
          onChanged();
        } else {
          playCeClientInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000040;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
       */
      public Builder setPlayCeClientInfo(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.Builder builderForValue) {
        if (playCeClientInfoBuilder_ == null) {
          playCeClientInfo_ = builderForValue.build();
          onChanged();
        } else {
          playCeClientInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000040;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
       */
      public Builder mergePlayCeClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo value) {
        if (playCeClientInfoBuilder_ == null) {
          if (((bitField0_ & 0x00000040) == 0x00000040) &&
              playCeClientInfo_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.getDefaultInstance()) {
            playCeClientInfo_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.newBuilder(playCeClientInfo_).mergeFrom(value).buildPartial();
          } else {
            playCeClientInfo_ = value;
          }
          onChanged();
        } else {
          playCeClientInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000040;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
       */
      public Builder clearPlayCeClientInfo() {
        if (playCeClientInfoBuilder_ == null) {
          playCeClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.getDefaultInstance();
          onChanged();
        } else {
          playCeClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000040);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.Builder getPlayCeClientInfoBuilder() {
        bitField0_ |= 0x00000040;
        onChanged();
        return getPlayCeClientInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfoOrBuilder getPlayCeClientInfoOrBuilder() {
        if (playCeClientInfoBuilder_ != null) {
          return playCeClientInfoBuilder_.getMessageOrBuilder();
        } else {
          return playCeClientInfo_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.PlayCeClientInfo play_ce_client_info = 5;</code>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfoOrBuilder> 
          getPlayCeClientInfoFieldBuilder() {
        if (playCeClientInfoBuilder_ == null) {
          playCeClientInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PlayCeClientInfoOrBuilder>(
                  playCeClientInfo_,
                  getParentForChildren(),
                  isClean());
          playCeClientInfo_ = null;
        }
        return playCeClientInfoBuilder_;
      }

      // optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo vrClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfoOrBuilder> vrClientInfoBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
       */
      public boolean hasVrClientInfo() {
        return ((bitField0_ & 0x00000080) == 0x00000080);
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo getVrClientInfo() {
        if (vrClientInfoBuilder_ == null) {
          return vrClientInfo_;
        } else {
          return vrClientInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
       */
      public Builder setVrClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo value) {
        if (vrClientInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          vrClientInfo_ = value;
          onChanged();
        } else {
          vrClientInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
       */
      public Builder setVrClientInfo(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.Builder builderForValue) {
        if (vrClientInfoBuilder_ == null) {
          vrClientInfo_ = builderForValue.build();
          onChanged();
        } else {
          vrClientInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
       */
      public Builder mergeVrClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo value) {
        if (vrClientInfoBuilder_ == null) {
          if (((bitField0_ & 0x00000080) == 0x00000080) &&
              vrClientInfo_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.getDefaultInstance()) {
            vrClientInfo_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.newBuilder(vrClientInfo_).mergeFrom(value).buildPartial();
          } else {
            vrClientInfo_ = value;
          }
          onChanged();
        } else {
          vrClientInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
       */
      public Builder clearVrClientInfo() {
        if (vrClientInfoBuilder_ == null) {
          vrClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.getDefaultInstance();
          onChanged();
        } else {
          vrClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000080);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.Builder getVrClientInfoBuilder() {
        bitField0_ |= 0x00000080;
        onChanged();
        return getVrClientInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfoOrBuilder getVrClientInfoOrBuilder() {
        if (vrClientInfoBuilder_ != null) {
          return vrClientInfoBuilder_.getMessageOrBuilder();
        } else {
          return vrClientInfo_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.VrClientInfo vr_client_info = 8;</code>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfoOrBuilder> 
          getVrClientInfoFieldBuilder() {
        if (vrClientInfoBuilder_ == null) {
          vrClientInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.VrClientInfoOrBuilder>(
                  vrClientInfo_,
                  getParentForChildren(),
                  isClean());
          vrClientInfo_ = null;
        }
        return vrClientInfoBuilder_;
      }

      // optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo pancettaClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfoOrBuilder> pancettaClientInfoBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
       *
       * <pre>
       * Pancetta contact: pancetta-cloud-eng@.
       * </pre>
       */
      public boolean hasPancettaClientInfo() {
        return ((bitField0_ & 0x00000100) == 0x00000100);
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
       *
       * <pre>
       * Pancetta contact: pancetta-cloud-eng@.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo getPancettaClientInfo() {
        if (pancettaClientInfoBuilder_ == null) {
          return pancettaClientInfo_;
        } else {
          return pancettaClientInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
       *
       * <pre>
       * Pancetta contact: pancetta-cloud-eng@.
       * </pre>
       */
      public Builder setPancettaClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo value) {
        if (pancettaClientInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          pancettaClientInfo_ = value;
          onChanged();
        } else {
          pancettaClientInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
       *
       * <pre>
       * Pancetta contact: pancetta-cloud-eng@.
       * </pre>
       */
      public Builder setPancettaClientInfo(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.Builder builderForValue) {
        if (pancettaClientInfoBuilder_ == null) {
          pancettaClientInfo_ = builderForValue.build();
          onChanged();
        } else {
          pancettaClientInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
       *
       * <pre>
       * Pancetta contact: pancetta-cloud-eng@.
       * </pre>
       */
      public Builder mergePancettaClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo value) {
        if (pancettaClientInfoBuilder_ == null) {
          if (((bitField0_ & 0x00000100) == 0x00000100) &&
              pancettaClientInfo_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.getDefaultInstance()) {
            pancettaClientInfo_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.newBuilder(pancettaClientInfo_).mergeFrom(value).buildPartial();
          } else {
            pancettaClientInfo_ = value;
          }
          onChanged();
        } else {
          pancettaClientInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000100;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
       *
       * <pre>
       * Pancetta contact: pancetta-cloud-eng@.
       * </pre>
       */
      public Builder clearPancettaClientInfo() {
        if (pancettaClientInfoBuilder_ == null) {
          pancettaClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.getDefaultInstance();
          onChanged();
        } else {
          pancettaClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000100);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
       *
       * <pre>
       * Pancetta contact: pancetta-cloud-eng@.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.Builder getPancettaClientInfoBuilder() {
        bitField0_ |= 0x00000100;
        onChanged();
        return getPancettaClientInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
       *
       * <pre>
       * Pancetta contact: pancetta-cloud-eng@.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfoOrBuilder getPancettaClientInfoOrBuilder() {
        if (pancettaClientInfoBuilder_ != null) {
          return pancettaClientInfoBuilder_.getMessageOrBuilder();
        } else {
          return pancettaClientInfo_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.PancettaClientInfo pancetta_client_info = 10;</code>
       *
       * <pre>
       * Pancetta contact: pancetta-cloud-eng@.
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfoOrBuilder> 
          getPancettaClientInfoFieldBuilder() {
        if (pancettaClientInfoBuilder_ == null) {
          pancettaClientInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.PancettaClientInfoOrBuilder>(
                  pancettaClientInfo_,
                  getParentForChildren(),
                  isClean());
          pancettaClientInfo_ = null;
        }
        return pancettaClientInfoBuilder_;
      }

      // optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo browserInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfoOrBuilder> browserInfoBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
       *
       * <pre>
       * The browser used to make the request, if accessing through any web client.
       * </pre>
       */
      public boolean hasBrowserInfo() {
        return ((bitField0_ & 0x00000200) == 0x00000200);
      }
      /**
       * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
       *
       * <pre>
       * The browser used to make the request, if accessing through any web client.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo getBrowserInfo() {
        if (browserInfoBuilder_ == null) {
          return browserInfo_;
        } else {
          return browserInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
       *
       * <pre>
       * The browser used to make the request, if accessing through any web client.
       * </pre>
       */
      public Builder setBrowserInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo value) {
        if (browserInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          browserInfo_ = value;
          onChanged();
        } else {
          browserInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
       *
       * <pre>
       * The browser used to make the request, if accessing through any web client.
       * </pre>
       */
      public Builder setBrowserInfo(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.Builder builderForValue) {
        if (browserInfoBuilder_ == null) {
          browserInfo_ = builderForValue.build();
          onChanged();
        } else {
          browserInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
       *
       * <pre>
       * The browser used to make the request, if accessing through any web client.
       * </pre>
       */
      public Builder mergeBrowserInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo value) {
        if (browserInfoBuilder_ == null) {
          if (((bitField0_ & 0x00000200) == 0x00000200) &&
              browserInfo_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.getDefaultInstance()) {
            browserInfo_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.newBuilder(browserInfo_).mergeFrom(value).buildPartial();
          } else {
            browserInfo_ = value;
          }
          onChanged();
        } else {
          browserInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000200;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
       *
       * <pre>
       * The browser used to make the request, if accessing through any web client.
       * </pre>
       */
      public Builder clearBrowserInfo() {
        if (browserInfoBuilder_ == null) {
          browserInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.getDefaultInstance();
          onChanged();
        } else {
          browserInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000200);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
       *
       * <pre>
       * The browser used to make the request, if accessing through any web client.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.Builder getBrowserInfoBuilder() {
        bitField0_ |= 0x00000200;
        onChanged();
        return getBrowserInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
       *
       * <pre>
       * The browser used to make the request, if accessing through any web client.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfoOrBuilder getBrowserInfoOrBuilder() {
        if (browserInfoBuilder_ != null) {
          return browserInfoBuilder_.getMessageOrBuilder();
        } else {
          return browserInfo_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.BrowserInfo browser_info = 9;</code>
       *
       * <pre>
       * The browser used to make the request, if accessing through any web client.
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfoOrBuilder> 
          getBrowserInfoFieldBuilder() {
        if (browserInfoBuilder_ == null) {
          browserInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.BrowserInfoOrBuilder>(
                  browserInfo_,
                  getParentForChildren(),
                  isClean());
          browserInfo_ = null;
        }
        return browserInfoBuilder_;
      }

      // optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo jsClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfoOrBuilder> jsClientInfoBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
       */
      public boolean hasJsClientInfo() {
        return ((bitField0_ & 0x00000400) == 0x00000400);
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo getJsClientInfo() {
        if (jsClientInfoBuilder_ == null) {
          return jsClientInfo_;
        } else {
          return jsClientInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
       */
      public Builder setJsClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo value) {
        if (jsClientInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          jsClientInfo_ = value;
          onChanged();
        } else {
          jsClientInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
       */
      public Builder setJsClientInfo(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.Builder builderForValue) {
        if (jsClientInfoBuilder_ == null) {
          jsClientInfo_ = builderForValue.build();
          onChanged();
        } else {
          jsClientInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
       */
      public Builder mergeJsClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo value) {
        if (jsClientInfoBuilder_ == null) {
          if (((bitField0_ & 0x00000400) == 0x00000400) &&
              jsClientInfo_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.getDefaultInstance()) {
            jsClientInfo_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.newBuilder(jsClientInfo_).mergeFrom(value).buildPartial();
          } else {
            jsClientInfo_ = value;
          }
          onChanged();
        } else {
          jsClientInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
       */
      public Builder clearJsClientInfo() {
        if (jsClientInfoBuilder_ == null) {
          jsClientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.getDefaultInstance();
          onChanged();
        } else {
          jsClientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000400);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.Builder getJsClientInfoBuilder() {
        bitField0_ |= 0x00000400;
        onChanged();
        return getJsClientInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfoOrBuilder getJsClientInfoOrBuilder() {
        if (jsClientInfoBuilder_ != null) {
          return jsClientInfoBuilder_.getMessageOrBuilder();
        } else {
          return jsClientInfo_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.JsClientInfo js_client_info = 11;</code>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfoOrBuilder> 
          getJsClientInfoFieldBuilder() {
        if (jsClientInfoBuilder_ == null) {
          jsClientInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.JsClientInfoOrBuilder>(
                  jsClientInfo_,
                  getParentForChildren(),
                  isClean());
          jsClientInfo_ = null;
        }
        return jsClientInfoBuilder_;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.ClientInfo)
    }

    static {
      defaultInstance = new ClientInfo(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.ClientInfo)
  }

  public interface ExperimentIdListOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // repeated string id = 1;
    /**
     * <code>repeated string id = 1;</code>
     *
     * <pre>
     * IDs are sorted and do not contain duplicates.
     * </pre>
     */
    java.util.List<java.lang.String>
    getIdList();
    /**
     * <code>repeated string id = 1;</code>
     *
     * <pre>
     * IDs are sorted and do not contain duplicates.
     * </pre>
     */
    int getIdCount();
    /**
     * <code>repeated string id = 1;</code>
     *
     * <pre>
     * IDs are sorted and do not contain duplicates.
     * </pre>
     */
    java.lang.String getId(int index);
    /**
     * <code>repeated string id = 1;</code>
     *
     * <pre>
     * IDs are sorted and do not contain duplicates.
     * </pre>
     */
    com.google.protobuf.ByteString
        getIdBytes(int index);
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.ExperimentIdList}
   *
   * <pre>
   * The list of IDs of experiments that are currently on for this client. All
   *  other experiments are off.
   *
   *  Next tag: 2
   * </pre>
   */
  public static final class ExperimentIdList extends
      com.google.protobuf.GeneratedMessage
      implements ExperimentIdListOrBuilder {
    // Use ExperimentIdList.newBuilder() to construct.
    private ExperimentIdList(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private ExperimentIdList(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final ExperimentIdList defaultInstance;
    public static ExperimentIdList getDefaultInstance() {
      return defaultInstance;
    }

    public ExperimentIdList getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private ExperimentIdList(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
                id_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00000001;
              }
              id_.add(input.readBytes());
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
          id_ = new com.google.protobuf.UnmodifiableLazyStringList(id_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExperimentIdList_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExperimentIdList_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.Builder.class);
    }

    public static com.google.protobuf.Parser<ExperimentIdList> PARSER =
        new com.google.protobuf.AbstractParser<ExperimentIdList>() {
      public ExperimentIdList parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new ExperimentIdList(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<ExperimentIdList> getParserForType() {
      return PARSER;
    }

    // repeated string id = 1;
    public static final int ID_FIELD_NUMBER = 1;
    private com.google.protobuf.LazyStringList id_;
    /**
     * <code>repeated string id = 1;</code>
     *
     * <pre>
     * IDs are sorted and do not contain duplicates.
     * </pre>
     */
    public java.util.List<java.lang.String>
        getIdList() {
      return id_;
    }
    /**
     * <code>repeated string id = 1;</code>
     *
     * <pre>
     * IDs are sorted and do not contain duplicates.
     * </pre>
     */
    public int getIdCount() {
      return id_.size();
    }
    /**
     * <code>repeated string id = 1;</code>
     *
     * <pre>
     * IDs are sorted and do not contain duplicates.
     * </pre>
     */
    public java.lang.String getId(int index) {
      return id_.get(index);
    }
    /**
     * <code>repeated string id = 1;</code>
     *
     * <pre>
     * IDs are sorted and do not contain duplicates.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getIdBytes(int index) {
      return id_.getByteString(index);
    }

    private void initFields() {
      id_ = com.google.protobuf.LazyStringArrayList.EMPTY;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      for (int i = 0; i < id_.size(); i++) {
        output.writeBytes(1, id_.getByteString(i));
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      {
        int dataSize = 0;
        for (int i = 0; i < id_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeBytesSizeNoTag(id_.getByteString(i));
        }
        size += dataSize;
        size += 1 * getIdList().size();
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.ExperimentIdList}
     *
     * <pre>
     * The list of IDs of experiments that are currently on for this client. All
     *  other experiments are off.
     *
     *  Next tag: 2
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdListOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExperimentIdList_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExperimentIdList_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        id_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExperimentIdList_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList(this);
        int from_bitField0_ = bitField0_;
        if (((bitField0_ & 0x00000001) == 0x00000001)) {
          id_ = new com.google.protobuf.UnmodifiableLazyStringList(
              id_);
          bitField0_ = (bitField0_ & ~0x00000001);
        }
        result.id_ = id_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.getDefaultInstance()) return this;
        if (!other.id_.isEmpty()) {
          if (id_.isEmpty()) {
            id_ = other.id_;
            bitField0_ = (bitField0_ & ~0x00000001);
          } else {
            ensureIdIsMutable();
            id_.addAll(other.id_);
          }
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // repeated string id = 1;
      private com.google.protobuf.LazyStringList id_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureIdIsMutable() {
        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
          id_ = new com.google.protobuf.LazyStringArrayList(id_);
          bitField0_ |= 0x00000001;
         }
      }
      /**
       * <code>repeated string id = 1;</code>
       *
       * <pre>
       * IDs are sorted and do not contain duplicates.
       * </pre>
       */
      public java.util.List<java.lang.String>
          getIdList() {
        return java.util.Collections.unmodifiableList(id_);
      }
      /**
       * <code>repeated string id = 1;</code>
       *
       * <pre>
       * IDs are sorted and do not contain duplicates.
       * </pre>
       */
      public int getIdCount() {
        return id_.size();
      }
      /**
       * <code>repeated string id = 1;</code>
       *
       * <pre>
       * IDs are sorted and do not contain duplicates.
       * </pre>
       */
      public java.lang.String getId(int index) {
        return id_.get(index);
      }
      /**
       * <code>repeated string id = 1;</code>
       *
       * <pre>
       * IDs are sorted and do not contain duplicates.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getIdBytes(int index) {
        return id_.getByteString(index);
      }
      /**
       * <code>repeated string id = 1;</code>
       *
       * <pre>
       * IDs are sorted and do not contain duplicates.
       * </pre>
       */
      public Builder setId(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureIdIsMutable();
        id_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string id = 1;</code>
       *
       * <pre>
       * IDs are sorted and do not contain duplicates.
       * </pre>
       */
      public Builder addId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureIdIsMutable();
        id_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string id = 1;</code>
       *
       * <pre>
       * IDs are sorted and do not contain duplicates.
       * </pre>
       */
      public Builder addAllId(
          java.lang.Iterable<java.lang.String> values) {
        ensureIdIsMutable();
        super.addAll(values, id_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string id = 1;</code>
       *
       * <pre>
       * IDs are sorted and do not contain duplicates.
       * </pre>
       */
      public Builder clearId() {
        id_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string id = 1;</code>
       *
       * <pre>
       * IDs are sorted and do not contain duplicates.
       * </pre>
       */
      public Builder addIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureIdIsMutable();
        id_.add(value);
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.ExperimentIdList)
    }

    static {
      defaultInstance = new ExperimentIdList(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.ExperimentIdList)
  }

  public interface AppUsage1pLogEventOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional int32 app_type = 1;
    /**
     * <code>optional int32 app_type = 1;</code>
     *
     * <pre>
     * A wireless.android.stats.playlog.activeusers.AppType.Id value. See
     *  google3/wireless/android/stats/playlog/activeusers/apptype.proto.
     * </pre>
     */
    boolean hasAppType();
    /**
     * <code>optional int32 app_type = 1;</code>
     *
     * <pre>
     * A wireless.android.stats.playlog.activeusers.AppType.Id value. See
     *  google3/wireless/android/stats/playlog/activeusers/apptype.proto.
     * </pre>
     */
    int getAppType();

    // optional string android_package_name = 2;
    /**
     * <code>optional string android_package_name = 2;</code>
     *
     * <pre>
     * Package name of the app (on Android).
     * </pre>
     */
    boolean hasAndroidPackageName();
    /**
     * <code>optional string android_package_name = 2;</code>
     *
     * <pre>
     * Package name of the app (on Android).
     * </pre>
     */
    java.lang.String getAndroidPackageName();
    /**
     * <code>optional string android_package_name = 2;</code>
     *
     * <pre>
     * Package name of the app (on Android).
     * </pre>
     */
    com.google.protobuf.ByteString
        getAndroidPackageNameBytes();

    // optional string version = 3;
    /**
     * <code>optional string version = 3;</code>
     *
     * <pre>
     * Version of the app.
     * </pre>
     */
    boolean hasVersion();
    /**
     * <code>optional string version = 3;</code>
     *
     * <pre>
     * Version of the app.
     * </pre>
     */
    java.lang.String getVersion();
    /**
     * <code>optional string version = 3;</code>
     *
     * <pre>
     * Version of the app.
     * </pre>
     */
    com.google.protobuf.ByteString
        getVersionBytes();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.AppUsage1pLogEvent}
   *
   * <pre>
   * First party app usage log event extension.
   *  Used only when log_source = APP_USAGE_1P.
   *
   *  TODO(jsw): Investigate whether anyone is actually using this, and if not,
   *  remove it.
   *
   *  Next tag: 4
   * </pre>
   */
  public static final class AppUsage1pLogEvent extends
      com.google.protobuf.GeneratedMessage
      implements AppUsage1pLogEventOrBuilder {
    // Use AppUsage1pLogEvent.newBuilder() to construct.
    private AppUsage1pLogEvent(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private AppUsage1pLogEvent(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final AppUsage1pLogEvent defaultInstance;
    public static AppUsage1pLogEvent getDefaultInstance() {
      return defaultInstance;
    }

    public AppUsage1pLogEvent getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private AppUsage1pLogEvent(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              bitField0_ |= 0x00000001;
              appType_ = input.readInt32();
              break;
            }
            case 18: {
              bitField0_ |= 0x00000002;
              androidPackageName_ = input.readBytes();
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              version_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_AppUsage1pLogEvent_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_AppUsage1pLogEvent_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.Builder.class);
    }

    public static com.google.protobuf.Parser<AppUsage1pLogEvent> PARSER =
        new com.google.protobuf.AbstractParser<AppUsage1pLogEvent>() {
      public AppUsage1pLogEvent parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new AppUsage1pLogEvent(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<AppUsage1pLogEvent> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // optional int32 app_type = 1;
    public static final int APP_TYPE_FIELD_NUMBER = 1;
    private int appType_;
    /**
     * <code>optional int32 app_type = 1;</code>
     *
     * <pre>
     * A wireless.android.stats.playlog.activeusers.AppType.Id value. See
     *  google3/wireless/android/stats/playlog/activeusers/apptype.proto.
     * </pre>
     */
    public boolean hasAppType() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional int32 app_type = 1;</code>
     *
     * <pre>
     * A wireless.android.stats.playlog.activeusers.AppType.Id value. See
     *  google3/wireless/android/stats/playlog/activeusers/apptype.proto.
     * </pre>
     */
    public int getAppType() {
      return appType_;
    }

    // optional string android_package_name = 2;
    public static final int ANDROID_PACKAGE_NAME_FIELD_NUMBER = 2;
    private java.lang.Object androidPackageName_;
    /**
     * <code>optional string android_package_name = 2;</code>
     *
     * <pre>
     * Package name of the app (on Android).
     * </pre>
     */
    public boolean hasAndroidPackageName() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional string android_package_name = 2;</code>
     *
     * <pre>
     * Package name of the app (on Android).
     * </pre>
     */
    public java.lang.String getAndroidPackageName() {
      java.lang.Object ref = androidPackageName_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          androidPackageName_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string android_package_name = 2;</code>
     *
     * <pre>
     * Package name of the app (on Android).
     * </pre>
     */
    public com.google.protobuf.ByteString
        getAndroidPackageNameBytes() {
      java.lang.Object ref = androidPackageName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        androidPackageName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string version = 3;
    public static final int VERSION_FIELD_NUMBER = 3;
    private java.lang.Object version_;
    /**
     * <code>optional string version = 3;</code>
     *
     * <pre>
     * Version of the app.
     * </pre>
     */
    public boolean hasVersion() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional string version = 3;</code>
     *
     * <pre>
     * Version of the app.
     * </pre>
     */
    public java.lang.String getVersion() {
      java.lang.Object ref = version_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          version_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string version = 3;</code>
     *
     * <pre>
     * Version of the app.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getVersionBytes() {
      java.lang.Object ref = version_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        version_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private void initFields() {
      appType_ = 0;
      androidPackageName_ = "";
      version_ = "";
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt32(1, appType_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBytes(2, getAndroidPackageNameBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, getVersionBytes());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(1, appType_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(2, getAndroidPackageNameBytes());
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, getVersionBytes());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.AppUsage1pLogEvent}
     *
     * <pre>
     * First party app usage log event extension.
     *  Used only when log_source = APP_USAGE_1P.
     *
     *  TODO(jsw): Investigate whether anyone is actually using this, and if not,
     *  remove it.
     *
     *  Next tag: 4
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEventOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_AppUsage1pLogEvent_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_AppUsage1pLogEvent_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        appType_ = 0;
        bitField0_ = (bitField0_ & ~0x00000001);
        androidPackageName_ = "";
        bitField0_ = (bitField0_ & ~0x00000002);
        version_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_AppUsage1pLogEvent_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.appType_ = appType_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.androidPackageName_ = androidPackageName_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.version_ = version_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent.getDefaultInstance()) return this;
        if (other.hasAppType()) {
          setAppType(other.getAppType());
        }
        if (other.hasAndroidPackageName()) {
          bitField0_ |= 0x00000002;
          androidPackageName_ = other.androidPackageName_;
          onChanged();
        }
        if (other.hasVersion()) {
          bitField0_ |= 0x00000004;
          version_ = other.version_;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.AppUsage1pLogEvent) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional int32 app_type = 1;
      private int appType_ ;
      /**
       * <code>optional int32 app_type = 1;</code>
       *
       * <pre>
       * A wireless.android.stats.playlog.activeusers.AppType.Id value. See
       *  google3/wireless/android/stats/playlog/activeusers/apptype.proto.
       * </pre>
       */
      public boolean hasAppType() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional int32 app_type = 1;</code>
       *
       * <pre>
       * A wireless.android.stats.playlog.activeusers.AppType.Id value. See
       *  google3/wireless/android/stats/playlog/activeusers/apptype.proto.
       * </pre>
       */
      public int getAppType() {
        return appType_;
      }
      /**
       * <code>optional int32 app_type = 1;</code>
       *
       * <pre>
       * A wireless.android.stats.playlog.activeusers.AppType.Id value. See
       *  google3/wireless/android/stats/playlog/activeusers/apptype.proto.
       * </pre>
       */
      public Builder setAppType(int value) {
        bitField0_ |= 0x00000001;
        appType_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int32 app_type = 1;</code>
       *
       * <pre>
       * A wireless.android.stats.playlog.activeusers.AppType.Id value. See
       *  google3/wireless/android/stats/playlog/activeusers/apptype.proto.
       * </pre>
       */
      public Builder clearAppType() {
        bitField0_ = (bitField0_ & ~0x00000001);
        appType_ = 0;
        onChanged();
        return this;
      }

      // optional string android_package_name = 2;
      private java.lang.Object androidPackageName_ = "";
      /**
       * <code>optional string android_package_name = 2;</code>
       *
       * <pre>
       * Package name of the app (on Android).
       * </pre>
       */
      public boolean hasAndroidPackageName() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional string android_package_name = 2;</code>
       *
       * <pre>
       * Package name of the app (on Android).
       * </pre>
       */
      public java.lang.String getAndroidPackageName() {
        java.lang.Object ref = androidPackageName_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          androidPackageName_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string android_package_name = 2;</code>
       *
       * <pre>
       * Package name of the app (on Android).
       * </pre>
       */
      public com.google.protobuf.ByteString
          getAndroidPackageNameBytes() {
        java.lang.Object ref = androidPackageName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          androidPackageName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string android_package_name = 2;</code>
       *
       * <pre>
       * Package name of the app (on Android).
       * </pre>
       */
      public Builder setAndroidPackageName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        androidPackageName_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string android_package_name = 2;</code>
       *
       * <pre>
       * Package name of the app (on Android).
       * </pre>
       */
      public Builder clearAndroidPackageName() {
        bitField0_ = (bitField0_ & ~0x00000002);
        androidPackageName_ = getDefaultInstance().getAndroidPackageName();
        onChanged();
        return this;
      }
      /**
       * <code>optional string android_package_name = 2;</code>
       *
       * <pre>
       * Package name of the app (on Android).
       * </pre>
       */
      public Builder setAndroidPackageNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
        androidPackageName_ = value;
        onChanged();
        return this;
      }

      // optional string version = 3;
      private java.lang.Object version_ = "";
      /**
       * <code>optional string version = 3;</code>
       *
       * <pre>
       * Version of the app.
       * </pre>
       */
      public boolean hasVersion() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional string version = 3;</code>
       *
       * <pre>
       * Version of the app.
       * </pre>
       */
      public java.lang.String getVersion() {
        java.lang.Object ref = version_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          version_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string version = 3;</code>
       *
       * <pre>
       * Version of the app.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getVersionBytes() {
        java.lang.Object ref = version_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          version_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string version = 3;</code>
       *
       * <pre>
       * Version of the app.
       * </pre>
       */
      public Builder setVersion(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        version_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string version = 3;</code>
       *
       * <pre>
       * Version of the app.
       * </pre>
       */
      public Builder clearVersion() {
        bitField0_ = (bitField0_ & ~0x00000004);
        version_ = getDefaultInstance().getVersion();
        onChanged();
        return this;
      }
      /**
       * <code>optional string version = 3;</code>
       *
       * <pre>
       * Version of the app.
       * </pre>
       */
      public Builder setVersionBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        version_ = value;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.AppUsage1pLogEvent)
    }

    static {
      defaultInstance = new AppUsage1pLogEvent(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.AppUsage1pLogEvent)
  }

  public interface BatchedLogRequestOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // repeated .wireless_android_play_playlog.LogRequest log_request = 1;
    /**
     * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
     */
    java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest> 
        getLogRequestList();
    /**
     * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest getLogRequest(int index);
    /**
     * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
     */
    int getLogRequestCount();
    /**
     * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
     */
    java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequestOrBuilder> 
        getLogRequestOrBuilderList();
    /**
     * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequestOrBuilder getLogRequestOrBuilder(
        int index);
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.BatchedLogRequest}
   *
   * <pre>
   * A BatchedLogRequest represents a batched collection of log requests.
   *
   *  Next tag: 2
   * </pre>
   */
  public static final class BatchedLogRequest extends
      com.google.protobuf.GeneratedMessage
      implements BatchedLogRequestOrBuilder {
    // Use BatchedLogRequest.newBuilder() to construct.
    private BatchedLogRequest(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private BatchedLogRequest(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final BatchedLogRequest defaultInstance;
    public static BatchedLogRequest getDefaultInstance() {
      return defaultInstance;
    }

    public BatchedLogRequest getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private BatchedLogRequest(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
                logRequest_ = new java.util.ArrayList<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest>();
                mutable_bitField0_ |= 0x00000001;
              }
              logRequest_.add(input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.PARSER, extensionRegistry));
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
          logRequest_ = java.util.Collections.unmodifiableList(logRequest_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_BatchedLogRequest_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_BatchedLogRequest_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest.Builder.class);
    }

    public static com.google.protobuf.Parser<BatchedLogRequest> PARSER =
        new com.google.protobuf.AbstractParser<BatchedLogRequest>() {
      public BatchedLogRequest parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new BatchedLogRequest(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<BatchedLogRequest> getParserForType() {
      return PARSER;
    }

    // repeated .wireless_android_play_playlog.LogRequest log_request = 1;
    public static final int LOG_REQUEST_FIELD_NUMBER = 1;
    private java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest> logRequest_;
    /**
     * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
     */
    public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest> getLogRequestList() {
      return logRequest_;
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
     */
    public java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequestOrBuilder> 
        getLogRequestOrBuilderList() {
      return logRequest_;
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
     */
    public int getLogRequestCount() {
      return logRequest_.size();
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest getLogRequest(int index) {
      return logRequest_.get(index);
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequestOrBuilder getLogRequestOrBuilder(
        int index) {
      return logRequest_.get(index);
    }

    private void initFields() {
      logRequest_ = java.util.Collections.emptyList();
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      for (int i = 0; i < getLogRequestCount(); i++) {
        if (!getLogRequest(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      for (int i = 0; i < logRequest_.size(); i++) {
        output.writeMessage(1, logRequest_.get(i));
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      for (int i = 0; i < logRequest_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(1, logRequest_.get(i));
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.BatchedLogRequest}
     *
     * <pre>
     * A BatchedLogRequest represents a batched collection of log requests.
     *
     *  Next tag: 2
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequestOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_BatchedLogRequest_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_BatchedLogRequest_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          getLogRequestFieldBuilder();
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        if (logRequestBuilder_ == null) {
          logRequest_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000001);
        } else {
          logRequestBuilder_.clear();
        }
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_BatchedLogRequest_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest(this);
        int from_bitField0_ = bitField0_;
        if (logRequestBuilder_ == null) {
          if (((bitField0_ & 0x00000001) == 0x00000001)) {
            logRequest_ = java.util.Collections.unmodifiableList(logRequest_);
            bitField0_ = (bitField0_ & ~0x00000001);
          }
          result.logRequest_ = logRequest_;
        } else {
          result.logRequest_ = logRequestBuilder_.build();
        }
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest.getDefaultInstance()) return this;
        if (logRequestBuilder_ == null) {
          if (!other.logRequest_.isEmpty()) {
            if (logRequest_.isEmpty()) {
              logRequest_ = other.logRequest_;
              bitField0_ = (bitField0_ & ~0x00000001);
            } else {
              ensureLogRequestIsMutable();
              logRequest_.addAll(other.logRequest_);
            }
            onChanged();
          }
        } else {
          if (!other.logRequest_.isEmpty()) {
            if (logRequestBuilder_.isEmpty()) {
              logRequestBuilder_.dispose();
              logRequestBuilder_ = null;
              logRequest_ = other.logRequest_;
              bitField0_ = (bitField0_ & ~0x00000001);
              logRequestBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getLogRequestFieldBuilder() : null;
            } else {
              logRequestBuilder_.addAllMessages(other.logRequest_);
            }
          }
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        for (int i = 0; i < getLogRequestCount(); i++) {
          if (!getLogRequest(i).isInitialized()) {
            
            return false;
          }
        }
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.BatchedLogRequest) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // repeated .wireless_android_play_playlog.LogRequest log_request = 1;
      private java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest> logRequest_ =
        java.util.Collections.emptyList();
      private void ensureLogRequestIsMutable() {
        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
          logRequest_ = new java.util.ArrayList<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest>(logRequest_);
          bitField0_ |= 0x00000001;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequestOrBuilder> logRequestBuilder_;

      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest> getLogRequestList() {
        if (logRequestBuilder_ == null) {
          return java.util.Collections.unmodifiableList(logRequest_);
        } else {
          return logRequestBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public int getLogRequestCount() {
        if (logRequestBuilder_ == null) {
          return logRequest_.size();
        } else {
          return logRequestBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest getLogRequest(int index) {
        if (logRequestBuilder_ == null) {
          return logRequest_.get(index);
        } else {
          return logRequestBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public Builder setLogRequest(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest value) {
        if (logRequestBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureLogRequestIsMutable();
          logRequest_.set(index, value);
          onChanged();
        } else {
          logRequestBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public Builder setLogRequest(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder builderForValue) {
        if (logRequestBuilder_ == null) {
          ensureLogRequestIsMutable();
          logRequest_.set(index, builderForValue.build());
          onChanged();
        } else {
          logRequestBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public Builder addLogRequest(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest value) {
        if (logRequestBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureLogRequestIsMutable();
          logRequest_.add(value);
          onChanged();
        } else {
          logRequestBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public Builder addLogRequest(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest value) {
        if (logRequestBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureLogRequestIsMutable();
          logRequest_.add(index, value);
          onChanged();
        } else {
          logRequestBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public Builder addLogRequest(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder builderForValue) {
        if (logRequestBuilder_ == null) {
          ensureLogRequestIsMutable();
          logRequest_.add(builderForValue.build());
          onChanged();
        } else {
          logRequestBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public Builder addLogRequest(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder builderForValue) {
        if (logRequestBuilder_ == null) {
          ensureLogRequestIsMutable();
          logRequest_.add(index, builderForValue.build());
          onChanged();
        } else {
          logRequestBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public Builder addAllLogRequest(
          java.lang.Iterable<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest> values) {
        if (logRequestBuilder_ == null) {
          ensureLogRequestIsMutable();
          super.addAll(values, logRequest_);
          onChanged();
        } else {
          logRequestBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public Builder clearLogRequest() {
        if (logRequestBuilder_ == null) {
          logRequest_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000001);
          onChanged();
        } else {
          logRequestBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public Builder removeLogRequest(int index) {
        if (logRequestBuilder_ == null) {
          ensureLogRequestIsMutable();
          logRequest_.remove(index);
          onChanged();
        } else {
          logRequestBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder getLogRequestBuilder(
          int index) {
        return getLogRequestFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequestOrBuilder getLogRequestOrBuilder(
          int index) {
        if (logRequestBuilder_ == null) {
          return logRequest_.get(index);  } else {
          return logRequestBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequestOrBuilder> 
           getLogRequestOrBuilderList() {
        if (logRequestBuilder_ != null) {
          return logRequestBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(logRequest_);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder addLogRequestBuilder() {
        return getLogRequestFieldBuilder().addBuilder(
            com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.getDefaultInstance());
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder addLogRequestBuilder(
          int index) {
        return getLogRequestFieldBuilder().addBuilder(
            index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.getDefaultInstance());
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogRequest log_request = 1;</code>
       */
      public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder> 
           getLogRequestBuilderList() {
        return getLogRequestFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequestOrBuilder> 
          getLogRequestFieldBuilder() {
        if (logRequestBuilder_ == null) {
          logRequestBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequestOrBuilder>(
                  logRequest_,
                  ((bitField0_ & 0x00000001) == 0x00000001),
                  getParentForChildren(),
                  isClean());
          logRequest_ = null;
        }
        return logRequestBuilder_;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.BatchedLogRequest)
    }

    static {
      defaultInstance = new BatchedLogRequest(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.BatchedLogRequest)
  }

  public interface LogRequestOrBuilder extends
      com.google.protobuf.GeneratedMessage.
          ExtendableMessageOrBuilder<LogRequest> {

    // optional int64 request_time_ms = 4;
    /**
     * <code>optional int64 request_time_ms = 4;</code>
     *
     * <pre>
     * "Now", in milliseconds, according to the same clock as the one used to set
     *  the 'event_time_ms' values in the LogEvent protos above.
     * </pre>
     */
    boolean hasRequestTimeMs();
    /**
     * <code>optional int64 request_time_ms = 4;</code>
     *
     * <pre>
     * "Now", in milliseconds, according to the same clock as the one used to set
     *  the 'event_time_ms' values in the LogEvent protos above.
     * </pre>
     */
    long getRequestTimeMs();

    // optional int64 request_uptime_ms = 8;
    /**
     * <code>optional int64 request_uptime_ms = 8;</code>
     *
     * <pre>
     * Current time since boot in milliseconds, including time spent in sleep,
     *  according to the same clock as the one used to set
     *  the 'event_uptime_ms' values in the LogEvent protos above.
     * </pre>
     */
    boolean hasRequestUptimeMs();
    /**
     * <code>optional int64 request_uptime_ms = 8;</code>
     *
     * <pre>
     * Current time since boot in milliseconds, including time spent in sleep,
     *  according to the same clock as the one used to set
     *  the 'event_uptime_ms' values in the LogEvent protos above.
     * </pre>
     */
    long getRequestUptimeMs();

    // optional .wireless_android_play_playlog.ClientInfo client_info = 1;
    /**
     * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
     */
    boolean hasClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo getClientInfo();
    /**
     * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfoOrBuilder getClientInfoOrBuilder();

    // optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];
    /**
     * <code>optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];</code>
     */
    boolean hasLogSource();
    /**
     * <code>optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource getLogSource();

    // optional string log_source_name = 6;
    /**
     * <code>optional string log_source_name = 6;</code>
     *
     * <pre>
     * If log_source is not present and log_source_name is present, the value of
     *  log_source_name is parsed as a LogSource value and set to log_source.
     * </pre>
     */
    boolean hasLogSourceName();
    /**
     * <code>optional string log_source_name = 6;</code>
     *
     * <pre>
     * If log_source is not present and log_source_name is present, the value of
     *  log_source_name is parsed as a LogSource value and set to log_source.
     * </pre>
     */
    java.lang.String getLogSourceName();
    /**
     * <code>optional string log_source_name = 6;</code>
     *
     * <pre>
     * If log_source is not present and log_source_name is present, the value of
     *  log_source_name is parsed as a LogSource value and set to log_source.
     * </pre>
     */
    com.google.protobuf.ByteString
        getLogSourceNameBytes();

    // optional string zwieback_cookie = 7;
    /**
     * <code>optional string zwieback_cookie = 7;</code>
     *
     * <pre>
     * cookie from pseudonymous id service at the time the event was posted
     * </pre>
     */
    boolean hasZwiebackCookie();
    /**
     * <code>optional string zwieback_cookie = 7;</code>
     *
     * <pre>
     * cookie from pseudonymous id service at the time the event was posted
     * </pre>
     */
    java.lang.String getZwiebackCookie();
    /**
     * <code>optional string zwieback_cookie = 7;</code>
     *
     * <pre>
     * cookie from pseudonymous id service at the time the event was posted
     * </pre>
     */
    com.google.protobuf.ByteString
        getZwiebackCookieBytes();

    // repeated .wireless_android_play_playlog.LogEvent log_event = 3;
    /**
     * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
     */
    java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent> 
        getLogEventList();
    /**
     * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent getLogEvent(int index);
    /**
     * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
     */
    int getLogEventCount();
    /**
     * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
     */
    java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventOrBuilder> 
        getLogEventOrBuilderList();
    /**
     * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventOrBuilder getLogEventOrBuilder(
        int index);

    // repeated bytes serialized_log_events = 5;
    /**
     * <code>repeated bytes serialized_log_events = 5;</code>
     *
     * <pre>
     * Can be used instead of 'log_event' in order to save battery in cases where
     *  LogEvent protos are already serialized, and deserializing is undesirable.
     *  If used, this is a collection of byte streams each produced using a
     *  CodedOutputStream.
     * </pre>
     */
    java.util.List<com.google.protobuf.ByteString> getSerializedLogEventsList();
    /**
     * <code>repeated bytes serialized_log_events = 5;</code>
     *
     * <pre>
     * Can be used instead of 'log_event' in order to save battery in cases where
     *  LogEvent protos are already serialized, and deserializing is undesirable.
     *  If used, this is a collection of byte streams each produced using a
     *  CodedOutputStream.
     * </pre>
     */
    int getSerializedLogEventsCount();
    /**
     * <code>repeated bytes serialized_log_events = 5;</code>
     *
     * <pre>
     * Can be used instead of 'log_event' in order to save battery in cases where
     *  LogEvent protos are already serialized, and deserializing is undesirable.
     *  If used, this is a collection of byte streams each produced using a
     *  CodedOutputStream.
     * </pre>
     */
    com.google.protobuf.ByteString getSerializedLogEvents(int index);

    // optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];
    /**
     * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];</code>
     *
     * <pre>
     * Quality of Service tier for log upload.
     * </pre>
     */
    boolean hasQosTier();
    /**
     * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];</code>
     *
     * <pre>
     * Quality of Service tier for log upload.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier getQosTier();

    // optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;
    /**
     * <code>optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;</code>
     *
     * <pre>
     * The type of log upload scheduler.
     * </pre>
     */
    boolean hasScheduler();
    /**
     * <code>optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;</code>
     *
     * <pre>
     * The type of log upload scheduler.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType getScheduler();

    // optional .wireless_android_play_playlog.DeviceStatus device_status = 11;
    /**
     * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
     *
     * <pre>
     * Device status.
     * </pre>
     */
    boolean hasDeviceStatus();
    /**
     * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
     *
     * <pre>
     * Device status.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus getDeviceStatus();
    /**
     * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
     *
     * <pre>
     * Device status.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatusOrBuilder getDeviceStatusOrBuilder();

    // optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;
    /**
     * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
     *
     * <pre>
     * A timestamp taken from a source external to the device. For example, a GPS
     *  timestamp. This can be more accurate than the device wall clock, but is not
     *  guaranteed to be. That will depend on the source, and on the device
     *  hardware and software that obtains the timestamp.
     * </pre>
     */
    boolean hasExternalTimestamp();
    /**
     * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
     *
     * <pre>
     * A timestamp taken from a source external to the device. For example, a GPS
     *  timestamp. This can be more accurate than the device wall clock, but is not
     *  guaranteed to be. That will depend on the source, and on the device
     *  hardware and software that obtains the timestamp.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp getExternalTimestamp();
    /**
     * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
     *
     * <pre>
     * A timestamp taken from a source external to the device. For example, a GPS
     *  timestamp. This can be more accurate than the device wall clock, but is not
     *  guaranteed to be. That will depend on the source, and on the device
     *  hardware and software that obtains the timestamp.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestampOrBuilder getExternalTimestampOrBuilder();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.LogRequest}
   *
   * <pre>
   * A LogRequest represents a batched collection of loggable events, each event
   *  to be processed and sent to zero or more destinations (e.g. Sawmill log types
   *  or Footprints) by the Clearcut server.
   *
   *  Next tag: 13
   * </pre>
   */
  public static final class LogRequest extends
      com.google.protobuf.GeneratedMessage.ExtendableMessage<
        LogRequest> implements LogRequestOrBuilder {
    // Use LogRequest.newBuilder() to construct.
    private LogRequest(com.google.protobuf.GeneratedMessage.ExtendableBuilder<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest, ?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private LogRequest(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final LogRequest defaultInstance;
    public static LogRequest getDefaultInstance() {
      return defaultInstance;
    }

    public LogRequest getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private LogRequest(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.Builder subBuilder = null;
              if (((bitField0_ & 0x00000004) == 0x00000004)) {
                subBuilder = clientInfo_.toBuilder();
              }
              clientInfo_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(clientInfo_);
                clientInfo_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000004;
              break;
            }
            case 16: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(2, rawValue);
              } else {
                bitField0_ |= 0x00000008;
                logSource_ = value;
              }
              break;
            }
            case 26: {
              if (!((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
                logEvent_ = new java.util.ArrayList<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent>();
                mutable_bitField0_ |= 0x00000040;
              }
              logEvent_.add(input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.PARSER, extensionRegistry));
              break;
            }
            case 32: {
              bitField0_ |= 0x00000001;
              requestTimeMs_ = input.readInt64();
              break;
            }
            case 42: {
              if (!((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
                serializedLogEvents_ = new java.util.ArrayList<com.google.protobuf.ByteString>();
                mutable_bitField0_ |= 0x00000080;
              }
              serializedLogEvents_.add(input.readBytes());
              break;
            }
            case 50: {
              bitField0_ |= 0x00000010;
              logSourceName_ = input.readBytes();
              break;
            }
            case 58: {
              bitField0_ |= 0x00000020;
              zwiebackCookie_ = input.readBytes();
              break;
            }
            case 64: {
              bitField0_ |= 0x00000002;
              requestUptimeMs_ = input.readInt64();
              break;
            }
            case 72: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(9, rawValue);
              } else {
                bitField0_ |= 0x00000040;
                qosTier_ = value;
              }
              break;
            }
            case 80: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(10, rawValue);
              } else {
                bitField0_ |= 0x00000080;
                scheduler_ = value;
              }
              break;
            }
            case 90: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.Builder subBuilder = null;
              if (((bitField0_ & 0x00000100) == 0x00000100)) {
                subBuilder = deviceStatus_.toBuilder();
              }
              deviceStatus_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(deviceStatus_);
                deviceStatus_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000100;
              break;
            }
            case 98: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.Builder subBuilder = null;
              if (((bitField0_ & 0x00000200) == 0x00000200)) {
                subBuilder = externalTimestamp_.toBuilder();
              }
              externalTimestamp_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(externalTimestamp_);
                externalTimestamp_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000200;
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
          logEvent_ = java.util.Collections.unmodifiableList(logEvent_);
        }
        if (((mutable_bitField0_ & 0x00000080) == 0x00000080)) {
          serializedLogEvents_ = java.util.Collections.unmodifiableList(serializedLogEvents_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogRequest_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogRequest_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder.class);
    }

    public static com.google.protobuf.Parser<LogRequest> PARSER =
        new com.google.protobuf.AbstractParser<LogRequest>() {
      public LogRequest parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LogRequest(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<LogRequest> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.LogRequest.LogSource}
     */
    public enum LogSource
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>UNKNOWN = -1;</code>
       */
      UNKNOWN(0, -1),
      /**
       * <code>STORE = 0;</code>
       */
      STORE(1, 0),
      /**
       * <code>WEB_STORE = 65;</code>
       *
       * <pre>
       * Google Play Store Android App
       * </pre>
       */
      WEB_STORE(2, 65),
      /**
       * <code>WORK_STORE = 132;</code>
       *
       * <pre>
       * Google Play Web Store (https://play.google.com/store)
       * </pre>
       */
      WORK_STORE(3, 132),
      /**
       * <code>WORK_STORE_APP = 261;</code>
       *
       * <pre>
       * Play for Work on the web client (Worksky)
       * </pre>
       */
      WORK_STORE_APP(4, 261),
      /**
       * <code>EDU_STORE = 15;</code>
       *
       * <pre>
       * Play for Work on the Google Play Store Android App
       * </pre>
       */
      EDU_STORE(5, 15),
      /**
       * <code>MUSIC = 1;</code>
       *
       * <pre>
       * for collecting stats on Play for Education
       * </pre>
       */
      MUSIC(6, 1),
      /**
       * <code>BOOKS = 2;</code>
       */
      BOOKS(7, 2),
      /**
       * <code>VIDEO = 3;</code>
       */
      VIDEO(8, 3),
      /**
       * <code>MOVIES = 74;</code>
       *
       * <pre>
       * Android Video (go/avi, android-video-oncall@)
       * </pre>
       */
      MOVIES(9, 74),
      /**
       * <code>MAGAZINES = 4;</code>
       */
      MAGAZINES(10, 4),
      /**
       * <code>GAMES = 5;</code>
       */
      GAMES(11, 5),
      /**
       * <code>LB_A = 6;</code>
       */
      LB_A(12, 6),
      /**
       * <code>ANDROID_IDE = 7;</code>
       *
       * <pre>
       * for collecting app usage stats (Lockbox project)
       * </pre>
       */
      ANDROID_IDE(13, 7),
      /**
       * <code>LB_P = 8;</code>
       *
       * <pre>
       * Android IDE (deprecated, see ANDROID_STUDIO below)
       * </pre>
       */
      LB_P(14, 8),
      /**
       * <code>LB_S = 9;</code>
       *
       * <pre>
       * for collecting phone call events and stats (Lockbox project)
       * </pre>
       */
      LB_S(15, 9),
      /**
       * <code>GMS_CORE = 10;</code>
       *
       * <pre>
       * for collecting SMS events and stats (Lockbox project)
       * </pre>
       */
      GMS_CORE(16, 10),
      /**
       * <code>APP_USAGE_1P = 11;</code>
       *
       * <pre>
       * Usage of GMS Core itself and its internal stats
       * </pre>
       */
      APP_USAGE_1P(17, 11),
      /**
       * <code>ICING = 12;</code>
       *
       * <pre>
       * First-party app usage tracking.
       * </pre>
       */
      ICING(18, 12),
      /**
       * <code>HERREVAD = 13;</code>
       *
       * <pre>
       * Icing stats (AppDataSearch go/icing)
       * </pre>
       */
      HERREVAD(19, 13),
      /**
       * <code>GOOGLE_TV = 14;</code>
       *
       * <pre>
       * for collecting Nova Network quality data
       * </pre>
       */
      GOOGLE_TV(20, 14),
      /**
       * <code>GMS_CORE_PEOPLE = 16;</code>
       *
       * <pre>
       * Google TV, not Eureka.
       * </pre>
       */
      GMS_CORE_PEOPLE(21, 16),
      /**
       * <code>LE = 17;</code>
       *
       * <pre>
       * GMS core people (aka menagerie, zhengfu@, android-contacts@)
       * </pre>
       */
      LE(22, 17),
      /**
       * <code>GOOGLE_ANALYTICS = 18;</code>
       *
       * <pre>
       * Location Engine statistics
       * </pre>
       */
      GOOGLE_ANALYTICS(23, 18),
      /**
       * <code>LB_D = 19;</code>
       *
       * <pre>
       * Google Analytics SDK health monitoring
       * </pre>
       */
      LB_D(24, 19),
      /**
       * <code>ANDROID_GSA = 20;</code>
       *
       * <pre>
       * for collecting device state changes (Lockbox project)
       * </pre>
       */
      ANDROID_GSA(25, 20),
      /**
       * <code>LB_T = 21;</code>
       *
       * <pre>
       * Android GSA (Google Search App) stats
       * </pre>
       */
      LB_T(26, 21),
      /**
       * <code>PERSONAL_LOGGER = 22;</code>
       *
       * <pre>
       * for collecting Android RunningTaskInfo (Lockbox project)
       * </pre>
       */
      PERSONAL_LOGGER(27, 22),
      /**
       * <code>PERSONAL_BROWSER_LOGGER = 37;</code>
       *
       * <pre>
       * PixelPerfect activity logger
       * </pre>
       */
      PERSONAL_BROWSER_LOGGER(28, 37),
      /**
       * <code>GMS_CORE_WALLET_MERCHANT_ERROR = 23;</code>
       *
       * <pre>
       * PixelPerfect Chrome extension logger
       * </pre>
       */
      GMS_CORE_WALLET_MERCHANT_ERROR(29, 23),
      /**
       * <code>LB_C = 24;</code>
       *
       * <pre>
       * GMS core wallet merchant errors
       * </pre>
       */
      LB_C(30, 24),
      /**
       * <code>LB_IA = 52;</code>
       *
       * <pre>
       * Android contacts going from Now to HappyHour.log_event_extension_test
       * </pre>
       */
      LB_IA(31, 52),
      /**
       * <code>LB_CB = 237;</code>
       *
       * <pre>
       * Android installed apps going from Now to HappyHour.
       * </pre>
       */
      LB_CB(32, 237),
      /**
       * <code>LB_DM = 268;</code>
       *
       * <pre>
       * Android contacts for backup/restore purpose.
       * </pre>
       */
      LB_DM(33, 268),
      /**
       * <code>ANDROID_AUTH = 25;</code>
       *
       * <pre>
       * Android device metadata used for contacts backup/restore
       * purpose.
       * </pre>
       */
      ANDROID_AUTH(34, 25),
      /**
       * <code>ANDROID_CAMERA = 26;</code>
       *
       * <pre>
       * for collecting GMS core android auth data
       * </pre>
       */
      ANDROID_CAMERA(35, 26),
      /**
       * <code>CW = 27;</code>
       *
       * <pre>
       * Android camera usage statistics
       * </pre>
       */
      CW(36, 27),
      /**
       * <code>CW_COUNTERS = 243;</code>
       *
       * <pre>
       * Clockwork interaction logs
       * </pre>
       */
      CW_COUNTERS(37, 243),
      /**
       * <code>GEL = 28;</code>
       *
       * <pre>
       * Clockwork counters
       * </pre>
       */
      GEL(38, 28),
      /**
       * <code>DNA_PROBER = 29;</code>
       *
       * <pre>
       * Google experience launcher logs (http://go/signac).
       * </pre>
       */
      DNA_PROBER(39, 29),
      /**
       * <code>UDR = 30;</code>
       *
       * <pre>
       * DNA logger (for internal research), go/dna2014.
       * </pre>
       */
      UDR(40, 30),
      /**
       * <code>GMS_CORE_WALLET = 31;</code>
       *
       * <pre>
       * For collecting Android app usage data.
       * </pre>
       */
      GMS_CORE_WALLET(41, 31),
      /**
       * <code>SOCIAL = 32;</code>
       *
       * <pre>
       * GMS core wallet analytics
       * </pre>
       */
      SOCIAL(42, 32),
      /**
       * <code>INSTORE_WALLET = 33;</code>
       *
       * <pre>
       * Traffic from Social clients: gplus-log-quality@
       * </pre>
       */
      INSTORE_WALLET(43, 33),
      /**
       * <code>NOVA = 34;</code>
       *
       * <pre>
       * Instore play payments
       * </pre>
       */
      NOVA(44, 34),
      /**
       * <code>LB_CA = 35;</code>
       *
       * <pre>
       * Nova client logs.
       * </pre>
       */
      LB_CA(45, 35),
      /**
       * <code>LATIN_IME = 36;</code>
       *
       * <pre>
       * DEPRECATED: Android contact account data going from Now to Footprints.
       * </pre>
       */
      LATIN_IME(46, 36),
      /**
       * <code>NEWS_WEATHER = 38;</code>
       *
       * <pre>
       * Google Keyboard (http://go/google-keyboard)
       * </pre>
       */
      NEWS_WEATHER(47, 38),
      /**
       * <code>HANGOUT = 39;</code>
       *
       * <pre>
       * News &amp; Weather Android/iOS apps
       * </pre>
       */
      HANGOUT(48, 39),
      /**
       * <code>HANGOUT_LOG_REQUEST = 50;</code>
       *
       * <pre>
       * Deprecated source for HangoutLogEntry (rtc-analytics-eng@)
       * </pre>
       */
      HANGOUT_LOG_REQUEST(49, 50),
      /**
       * <code>COPRESENCE = 40;</code>
       *
       * <pre>
       * Hangouts data using HangoutLogRequest (rtc-analytics-eng@)
       * </pre>
       */
      COPRESENCE(50, 40),
      /**
       * <code>SOCIAL_AFFINITY = 41;</code>
       *
       * <pre>
       * Copresence (http://go/whisper)
       * </pre>
       */
      SOCIAL_AFFINITY(51, 41),
      /**
       * <code>PHOTOS = 42;</code>
       *
       * <pre>
       * Social Affinity logs (go/disco-logging-v2).
       * </pre>
       */
      PHOTOS(52, 42),
      /**
       * <code>GCM = 43;</code>
       *
       * <pre>
       * Google Photos (go/photos).
       * </pre>
       */
      GCM(53, 43),
      /**
       * <code>GOKART = 44;</code>
       *
       * <pre>
       * Google Cloud Messaging logs (go/gcm).
       * </pre>
       */
      GOKART(54, 44),
      /**
       * <code>FINDR = 45;</code>
       *
       * <pre>
       * GoKart (go/gokart, Drive Android API)
       * </pre>
       */
      FINDR(55, 45),
      /**
       * <code>ANDROID_MESSAGING = 46;</code>
       *
       * <pre>
       * Findr app (go/findr).
       * </pre>
       */
      ANDROID_MESSAGING(56, 46),
      /**
       * <code>SOCIAL_WEB = 47;</code>
       *
       * <pre>
       * Android messenger(Bugle).
       * </pre>
       */
      SOCIAL_WEB(57, 47),
      /**
       * <code>BACKDROP = 48;</code>
       *
       * <pre>
       * Traffic from Social clients: gplus-log-quality@.
       * </pre>
       */
      BACKDROP(58, 48),
      /**
       * <code>TELEMATICS = 49;</code>
       *
       * <pre>
       * Backdrop device logs (go/tv-imax).
       * </pre>
       */
      TELEMATICS(59, 49),
      /**
       * <code>GVC_HARVESTER = 51;</code>
       *
       * <pre>
       * Telematics app (go/telematics).
       * </pre>
       */
      GVC_HARVESTER(60, 51),
      /**
       * <code>CAR = 53;</code>
       *
       * <pre>
       * GVC Harvester (go/harvesterdesigndoc)
       * </pre>
       */
      CAR(61, 53),
      /**
       * <code>PIXEL_PERFECT = 54;</code>
       *
       * <pre>
       * Android Automotive (go/gearhead).
       * </pre>
       */
      PIXEL_PERFECT(62, 54),
      /**
       * <code>DRIVE = 55;</code>
       *
       * <pre>
       * PixelPerfect app client log (go/pixelperfect-analytics)
       * </pre>
       */
      DRIVE(63, 55),
      /**
       * <code>DOCS = 56;</code>
       *
       * <pre>
       * Google Drive (go/cakemix, nickread@, cakemix-drive@)
       * </pre>
       */
      DOCS(64, 56),
      /**
       * <code>SHEETS = 57;</code>
       *
       * <pre>
       * Google Docs (go/cakemix, haluk@, bulach@, tstrauss@)
       * </pre>
       */
      SHEETS(65, 57),
      /**
       * <code>SLIDES = 58;</code>
       *
       * <pre>
       * Google Sheets (go/cakemix, tgleason@, bulach@, tstrauss@)
       * </pre>
       */
      SLIDES(66, 58),
      /**
       * <code>IME = 59;</code>
       *
       * <pre>
       * Google Slides (go/cakemix, yugacohler@, bulach@, tstrauss@)
       * </pre>
       */
      IME(67, 59),
      /**
       * <code>WARP = 60;</code>
       *
       * <pre>
       * Google Android IME logs (go/goopy).
       * </pre>
       */
      WARP(68, 60),
      /**
       * <code>NFC_PROGRAMMER = 61;</code>
       *
       * <pre>
       * Warp (go/warp-project)
       * </pre>
       */
      NFC_PROGRAMMER(69, 61),
      /**
       * <code>NETSTATS = 62;</code>
       *
       * <pre>
       * NfcProgrammer (go/aedu-platform-overview)
       * </pre>
       */
      NETSTATS(70, 62),
      /**
       * <code>NEWSSTAND = 63;</code>
       *
       * <pre>
       * Collection of Network Statistics (go/n-s).
       * </pre>
       */
      NEWSSTAND(71, 63),
      /**
       * <code>KIDS_COMMUNICATOR = 64;</code>
       *
       * <pre>
       * Google Play Newsstand.
       * </pre>
       */
      KIDS_COMMUNICATOR(72, 64),
      /**
       * <code>WIFI_ASSISTANT = 66;</code>
       *
       * <pre>
       * Kids Communicator (http://goto/kidscommunicator_dd)
       * </pre>
       */
      WIFI_ASSISTANT(73, 66),
      /**
       * <code>CAST_SENDER_SDK = 67;</code>
       *
       * <pre>
       * WiFi Assistant client logs.
       * </pre>
       */
      CAST_SENDER_SDK(74, 67),
      /**
       * <code>CRONET_SOCIAL = 68;</code>
       *
       * <pre>
       * Cast Sender SDK (go/dongle)
       * </pre>
       */
      CRONET_SOCIAL(75, 68),
      /**
       * <code>PHENOTYPE = 69;</code>
       *
       * <pre>
       * Social cronet metrics.
       * </pre>
       */
      PHENOTYPE(76, 69),
      /**
       * <code>PHENOTYPE_COUNTERS = 70;</code>
       *
       * <pre>
       * The client side of experiment framework (go/ph, peiling@, phenotype-eng@).
       * </pre>
       */
      PHENOTYPE_COUNTERS(77, 70),
      /**
       * <code>CHROME_INFRA = 71;</code>
       *
       * <pre>
       * The counters for Phenotype (go/ph, peiling@, phenotype-eng@).
       * </pre>
       */
      CHROME_INFRA(78, 71),
      /**
       * <code>JUSTSPEAK = 72;</code>
       *
       * <pre>
       * Chrome Infrastructure events
       * </pre>
       */
      JUSTSPEAK(79, 72),
      /**
       * <code>PERF_PROFILE = 73;</code>
       *
       * <pre>
       * JustSpeak (go/justspeak)
       * </pre>
       */
      PERF_PROFILE(80, 73),
      /**
       * <code>KATNISS = 75;</code>
       *
       * <pre>
       * Android Wide Profiling (go/android-wide-profiling)
       * </pre>
       */
      KATNISS(81, 75),
      /**
       * <code>SOCIAL_APPINVITE = 76;</code>
       *
       * <pre>
       * Android TV search (go/atv-search)
       * </pre>
       */
      SOCIAL_APPINVITE(82, 76),
      /**
       * <code>GMM_COUNTERS = 77;</code>
       *
       * <pre>
       * Google Plus Platform App Invite (go/appinvite)
       * </pre>
       */
      GMM_COUNTERS(83, 77),
      /**
       * <code>BOND_ONEGOOGLE = 78;</code>
       *
       * <pre>
       * Google Maps Mobile (go/gmm).
       * </pre>
       */
      BOND_ONEGOOGLE(84, 78),
      /**
       * <code>MAPS_API = 79;</code>
       *
       * <pre>
       * Bond OneGoogleBar integration (go/bond-ogb)
       * </pre>
       */
      MAPS_API(85, 79),
      /**
       * <code>CRONET_ANDROID_YT = 196;</code>
       *
       * <pre>
       * Android and iOS Maps API (go/mapview &amp; go/meridian)
       * </pre>
       */
      CRONET_ANDROID_YT(86, 196),
      /**
       * <code>CRONET_ANDROID_GSA = 80;</code>
       *
       * <pre>
       * Cronet UMA logs from Android YT (go/cronet-uma)
       * </pre>
       */
      CRONET_ANDROID_GSA(87, 80),
      /**
       * <code>GOOGLE_FIT_WEARABLE = 81;</code>
       *
       * <pre>
       * Cronet UMA logs from Android GSA (go/cronet-uma)
       * </pre>
       */
      GOOGLE_FIT_WEARABLE(88, 81),
      /**
       * <code>FITNESS_ANDROID = 169;</code>
       *
       * <pre>
       * Google Fit Wearable App (go/heart)
       * </pre>
       */
      FITNESS_ANDROID(89, 169),
      /**
       * <code>FITNESS_GMS_CORE = 170;</code>
       *
       * <pre>
       * Google Fit Android App (go/heart)
       * </pre>
       */
      FITNESS_GMS_CORE(90, 170),
      /**
       * <code>GOOGLE_EXPRESS = 82;</code>
       *
       * <pre>
       * Google Fit GMSCore (go/heart)
       * </pre>
       */
      GOOGLE_EXPRESS(91, 82),
      /**
       * <code>GOOGLE_EXPRESS_DEV = 215;</code>
       *
       * <pre>
       * Google Express (go/gsx)
       * </pre>
       */
      GOOGLE_EXPRESS_DEV(92, 215),
      /**
       * <code>GOOGLE_EXPRESS_COURIER_ANDROID_PRIMES = 228;</code>
       *
       * <pre>
       * Google Express (go/gsx) For DEV mall server
       * </pre>
       */
      GOOGLE_EXPRESS_COURIER_ANDROID_PRIMES(93, 228),
      /**
       * <code>GOOGLE_EXPRESS_ANDROID_PRIMES = 229;</code>
       *
       * <pre>
       * Google Express (go/gsx) Courier App metric logging (go/primes)
       * </pre>
       */
      GOOGLE_EXPRESS_ANDROID_PRIMES(94, 229),
      /**
       * <code>GOOGLE_EXPRESS_STOREOMS_ANDROID_PRIMES = 240;</code>
       *
       * <pre>
       * Google Express (go/gsx) App metric logging (go/primes)
       * </pre>
       */
      GOOGLE_EXPRESS_STOREOMS_ANDROID_PRIMES(95, 240),
      /**
       * <code>SENSE = 83;</code>
       *
       * <pre>
       * Google Express (go/gsx) Store OMS App metric logging (go/primes)
       * </pre>
       */
      SENSE(96, 83),
      /**
       * <code>ANDROID_BACKUP = 84;</code>
       *
       * <pre>
       * Sense (go/sense)
       * </pre>
       */
      ANDROID_BACKUP(97, 84),
      /**
       * <code>VR = 85;</code>
       *
       * <pre>
       * Android Backup Service.
       * </pre>
       */
      VR(98, 85),
      /**
       * <code>IME_COUNTERS = 86;</code>
       *
       * <pre>
       * Virtual Reality and Google Cardboard (go/vr-team)
       * </pre>
       */
      IME_COUNTERS(99, 86),
      /**
       * <code>SETUP_WIZARD = 87;</code>
       *
       * <pre>
       * The counters for Google Android IME (go/goopy).
       * </pre>
       */
      SETUP_WIZARD(100, 87),
      /**
       * <code>EMERGENCY_ASSIST = 88;</code>
       *
       * <pre>
       * Setup Wizard (go/suw)
       * </pre>
       */
      EMERGENCY_ASSIST(101, 88),
      /**
       * <code>TRON = 89;</code>
       *
       * <pre>
       * Barton (go/barton-deprecation)
       * </pre>
       */
      TRON(102, 89),
      /**
       * <code>TRON_COUNTERS = 90;</code>
       *
       * <pre>
       * The event logs for Android Framework (go/tron, cwren@, khigaki@, tron-eng@).
       * </pre>
       */
      TRON_COUNTERS(103, 90),
      /**
       * <code>BATTERY_STATS = 91;</code>
       *
       * <pre>
       * The counters for Android Framework (go/tron, cwren@, khigaki@, tron-eng@).
       * </pre>
       */
      BATTERY_STATS(104, 91),
      /**
       * <code>DISK_STATS = 92;</code>
       *
       * <pre>
       * For collecting battery performance data from Android clients. (go/androidplatformstats, belland@, clearcut-eng@)
       * </pre>
       */
      DISK_STATS(105, 92),
      /**
       * <code>GRAPHICS_STATS = 107;</code>
       *
       * <pre>
       * For collecting disk utilization stats from Android clients. (go/androidplatformstats, belland@, clearcut-eng@)
       * </pre>
       */
      GRAPHICS_STATS(106, 107),
      /**
       * <code>PROC_STATS = 93;</code>
       *
       * <pre>
       * For collecting rendering performance stats from Android clients. (go/androidplatformstats, belland@, clearcut-eng@)
       * </pre>
       */
      PROC_STATS(107, 93),
      /**
       * <code>DROP_BOX = 131;</code>
       *
       * <pre>
       * For collecting memory utilization stats from Android clients. (go/androidplatformstats, belland@, clearcut-eng@)
       * </pre>
       */
      DROP_BOX(108, 131),
      /**
       * <code>FINGERPRINT_STATS = 181;</code>
       *
       * <pre>
       * For collecting DropBox logs from Android clients.
       * </pre>
       */
      FINGERPRINT_STATS(109, 181),
      /**
       * <code>NOTIFICATION_STATS = 182;</code>
       *
       * <pre>
       * For collecting fingerprint stats from Android clients. (go/android-fingerprintstats)
       * </pre>
       */
      NOTIFICATION_STATS(110, 182),
      /**
       * <code>TAP_AND_PAY_GCORE = 94;</code>
       *
       * <pre>
       * For collecting notification stats from Android clients. (go/android-notificationstats)
       * </pre>
       */
      TAP_AND_PAY_GCORE(111, 94),
      /**
       * <code>A11YLOGGER = 95;</code>
       *
       * <pre>
       * Tap and Pay client service layer (go/tp2-eng)
       * </pre>
       */
      A11YLOGGER(112, 95),
      /**
       * <code>GCM_COUNTERS = 96;</code>
       *
       * <pre>
       * Accessibility Settings Logger (go/a11ylogger)
       * </pre>
       */
      GCM_COUNTERS(113, 96),
      /**
       * <code>PLACES_NO_GLS_CONSENT = 97;</code>
       *
       * <pre>
       * Google Cloud Messaging counters (go/gcm).
       * </pre>
       */
      PLACES_NO_GLS_CONSENT(114, 97),
      /**
       * <code>TACHYON_LOG_REQUEST = 98;</code>
       *
       * <pre>
       * Mobile Places API logs without GLS consent (go/ios-places-api).
       * </pre>
       */
      TACHYON_LOG_REQUEST(115, 98),
      /**
       * <code>TACHYON_COUNTERS = 99;</code>
       *
       * <pre>
       * WebRTC Tachyon (go/tachyon)
       * </pre>
       */
      TACHYON_COUNTERS(116, 99),
      /**
       * <code>VISION = 100;</code>
       *
       * <pre>
       * WebRTC Tachyon (go/tachyon)
       * </pre>
       */
      VISION(117, 100),
      /**
       * <code>SOCIAL_USER_LOCATION = 101;</code>
       *
       * <pre>
       * Vision (go/mobile-vision)
       * </pre>
       */
      SOCIAL_USER_LOCATION(118, 101),
      /**
       * <code>LAUNCHPAD_TOYS = 102;</code>
       *
       * <pre>
       * Location Sharing (go/location-sharing)
       * </pre>
       */
      LAUNCHPAD_TOYS(119, 102),
      /**
       * <code>METALOG_COUNTERS = 103;</code>
       *
       * <pre>
       * Launchpad Toys (go/launchpadtoys)
       * </pre>
       */
      METALOG_COUNTERS(120, 103),
      /**
       * <code>MOBILESDK_CLIENT = 104;</code>
       *
       * <pre>
       * Counters for metalog (go/clearcut-metalog, iamawong@, clearcut-eng@)
       * </pre>
       */
      MOBILESDK_CLIENT(121, 104),
      /**
       * <code>ANDROID_VERIFY_APPS = 105;</code>
       *
       * <pre>
       * go/greenhouse
       * </pre>
       */
      ANDROID_VERIFY_APPS(122, 105),
      /**
       * <code>ADSHIELD = 106;</code>
       *
       * <pre>
       * go/safety-net
       * </pre>
       */
      ADSHIELD(123, 106),
      /**
       * <code>SHERLOG = 108;</code>
       *
       * <pre>
       * go/adshield
       * </pre>
       */
      SHERLOG(124, 108),
      /**
       * <code>LE_ULR_COUNTERS = 109;</code>
       *
       * <pre>
       * Sherlog data (go/sherlog)
       * </pre>
       */
      LE_ULR_COUNTERS(125, 109),
      /**
       * <code>GMM_UE3 = 110;</code>
       *
       * <pre>
       * Counters for ULR (go/gcore-ulr). Location custom events use LE.
       * </pre>
       */
      GMM_UE3(126, 110),
      /**
       * <code>CALENDAR = 111;</code>
       *
       * <pre>
       * Logs for GMM analytics and sessions (go/gca-analytics)
       * </pre>
       */
      CALENDAR(127, 111),
      /**
       * <code>ENDER = 112;</code>
       *
       * <pre>
       * Google Android Calendar
       * </pre>
       */
      ENDER(128, 112),
      /**
       * <code>FAMILY_COMPASS = 113;</code>
       *
       * <pre>
       * Logs for Ender (go/ender)
       * </pre>
       */
      FAMILY_COMPASS(129, 113),
      /**
       * <code>TRANSOM = 114;</code>
       *
       * <pre>
       * go/familycompass
       * </pre>
       */
      TRANSOM(130, 114),
      /**
       * <code>TRANSOM_COUNTERS = 115;</code>
       *
       * <pre>
       * Transom client-side metrics (go/transom)
       * </pre>
       */
      TRANSOM_COUNTERS(131, 115),
      /**
       * <code>LB_AS = 116;</code>
       *
       * <pre>
       * Counters for transom metrics
       * </pre>
       */
      LB_AS(132, 116),
      /**
       * <code>LB_CFG = 117;</code>
       *
       * <pre>
       * App usage collected by the new UsageStats API (Lockbox project).
       * </pre>
       */
      LB_CFG(133, 117),
      /**
       * <code>IOS_GSA = 118;</code>
       *
       * <pre>
       * Device config collected by the new UsageStats API (Lockbox project).
       * </pre>
       */
      IOS_GSA(134, 118),
      /**
       * <code>TAP_AND_PAY_APP = 119;</code>
       *
       * <pre>
       * iOS GSA (Google Search App) stats
       * </pre>
       */
      TAP_AND_PAY_APP(135, 119),
      /**
       * <code>TAP_AND_PAY_APP_COUNTERS = 265;</code>
       *
       * <pre>
       * Tap and Pay android app, aka Android pay app (go/tp2)
       * </pre>
       */
      TAP_AND_PAY_APP_COUNTERS(136, 265),
      /**
       * <code>FLYDROID = 120;</code>
       *
       * <pre>
       * Tap and Pay android app counters
       * </pre>
       */
      FLYDROID(137, 120),
      /**
       * <code>CPANEL_APP = 121;</code>
       *
       * <pre>
       * Logs for Flydroid (go/flydroid).
       * </pre>
       */
      CPANEL_APP(138, 121),
      /**
       * <code>ANDROID_SNET_GCORE = 122;</code>
       *
       * <pre>
       * CPanel latency on mobile.
       * </pre>
       */
      ANDROID_SNET_GCORE(139, 122),
      /**
       * <code>ANDROID_SNET_IDLE = 123;</code>
       *
       * <pre>
       * go/safety-net
       * </pre>
       */
      ANDROID_SNET_IDLE(140, 123),
      /**
       * <code>ANDROID_SNET_JAR = 124;</code>
       *
       * <pre>
       * go/safety-net
       * </pre>
       */
      ANDROID_SNET_JAR(141, 124),
      /**
       * <code>CONTEXT_MANAGER = 125;</code>
       *
       * <pre>
       * go/safety-net
       * </pre>
       */
      CONTEXT_MANAGER(142, 125),
      /**
       * <code>CLASSROOM = 126;</code>
       *
       * <pre>
       * Logs for Context Manager (go/context-manager)
       * </pre>
       */
      CLASSROOM(143, 126),
      /**
       * <code>TAILORMADE = 127;</code>
       *
       * <pre>
       * App usage of the go/classroom app.
       * </pre>
       */
      TAILORMADE(144, 127),
      /**
       * <code>KEEP = 128;</code>
       *
       * <pre>
       * Logs for Tailormade app (go/a1-tm)
       * </pre>
       */
      KEEP(145, 128),
      /**
       * <code>GMM_BRIIM_COUNTERS = 129;</code>
       *
       * <pre>
       * Logs for Keep (go/keep).
       * </pre>
       */
      GMM_BRIIM_COUNTERS(146, 129),
      /**
       * <code>CHROMECAST_APP_LOG = 130;</code>
       *
       * <pre>
       * GMM BRIIM counters (go/gmm-briim)
       * </pre>
       */
      CHROMECAST_APP_LOG(147, 130),
      /**
       * <code>ADWORDS_MOBILE = 133;</code>
       *
       * <pre>
       * Logs for chromecast app (go/chromecastapplogs)
       * </pre>
       */
      ADWORDS_MOBILE(148, 133),
      /**
       * <code>LEANBACK_EVENT = 134;</code>
       *
       * <pre>
       * Logs for AdWords mobile app (go/awm)
       * </pre>
       */
      LEANBACK_EVENT(149, 134),
      /**
       * <code>ANDROID_GMAIL = 135;</code>
       *
       * <pre>
       * Logs for Android TV Leanback Launcher (go/android-tv)
       * </pre>
       */
      ANDROID_GMAIL(150, 135),
      /**
       * <code>SAMPLE_SHM = 136;</code>
       *
       * <pre>
       * Logs for Gmail (go/android-gmail-clearcut, shahrk@, android-mail-team@)
       * </pre>
       */
      SAMPLE_SHM(151, 136),
      /**
       * <code>GPLUS_ANDROID_PRIMES = 140;</code>
       *
       * <pre>
       * Logs for system health metric and memory metric sample app (go/primes)
       * </pre>
       */
      GPLUS_ANDROID_PRIMES(152, 140),
      /**
       * <code>GMAIL_ANDROID_PRIMES = 150;</code>
       */
      GMAIL_ANDROID_PRIMES(154, 150),
      /**
       * <code>CALENDAR_ANDROID_PRIMES = 151;</code>
       */
      CALENDAR_ANDROID_PRIMES(156, 151),
      /**
       * <code>DOCS_ANDROID_PRIMES = 152;</code>
       */
      DOCS_ANDROID_PRIMES(158, 152),
      /**
       * <code>YT_MAIN_APP_ANDROID_PRIMES = 154;</code>
       */
      YT_MAIN_APP_ANDROID_PRIMES(160, 154),
      /**
       * <code>YT_KIDS_ANDROID_PRIMES = 155;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube main app (go/primes)
       * </pre>
       */
      YT_KIDS_ANDROID_PRIMES(161, 155),
      /**
       * <code>YT_GAMING_ANDROID_PRIMES = 156;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube kids app (go/primes)
       * </pre>
       */
      YT_GAMING_ANDROID_PRIMES(162, 156),
      /**
       * <code>YT_MUSIC_ANDROID_PRIMES = 157;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube gaming app (go/primes)
       * </pre>
       */
      YT_MUSIC_ANDROID_PRIMES(163, 157),
      /**
       * <code>YT_LITE_ANDROID_PRIMES = 158;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube music app (go/primes)
       * </pre>
       */
      YT_LITE_ANDROID_PRIMES(164, 158),
      /**
       * <code>YT_CREATOR_ANDROID_PRIMES = 171;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube lite app (go/primes)
       * </pre>
       */
      YT_CREATOR_ANDROID_PRIMES(165, 171),
      /**
       * <code>JAM_ANDROID_PRIMES = 159;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube Creator Studio app (go/primes)
       * </pre>
       */
      JAM_ANDROID_PRIMES(166, 159),
      /**
       * <code>JAM_KIOSK_ANDROID_PRIMES = 160;</code>
       *
       * <pre>
       * Logs for system health metric for Jam (go/jam, go/primes)
       * </pre>
       */
      JAM_KIOSK_ANDROID_PRIMES(167, 160),
      /**
       * <code>PHOTOS_ANDROID_PRIMES = 165;</code>
       *
       * <pre>
       * Logs for system health metric for Jam Kiosk (go/jam, go/primes)
       * </pre>
       */
      PHOTOS_ANDROID_PRIMES(168, 165),
      /**
       * <code>DRIVE_ANDROID_PRIMES = 166;</code>
       *
       * <pre>
       * Logs for system health metric for Photos (go/primes)
       * </pre>
       */
      DRIVE_ANDROID_PRIMES(169, 166),
      /**
       * <code>SHEETS_ANDROID_PRIMES = 167;</code>
       *
       * <pre>
       * Logs for system health metric for Drive (go/primes)
       * </pre>
       */
      SHEETS_ANDROID_PRIMES(170, 167),
      /**
       * <code>SLIDES_ANDROID_PRIMES = 168;</code>
       *
       * <pre>
       * Logs for system health metric for Sheets (go/primes)
       * </pre>
       */
      SLIDES_ANDROID_PRIMES(171, 168),
      /**
       * <code>SNAPSEED_ANDROID_PRIMES = 178;</code>
       *
       * <pre>
       * Logs for system health metric for Slides (go/primes)
       * </pre>
       */
      SNAPSEED_ANDROID_PRIMES(172, 178),
      /**
       * <code>HANGOUTS_ANDROID_PRIMES = 179;</code>
       *
       * <pre>
       * Logs for system health metric for Snapseed (go/primes, go/snapseed).
       * </pre>
       */
      HANGOUTS_ANDROID_PRIMES(173, 179),
      /**
       * <code>INBOX_ANDROID_PRIMES = 180;</code>
       *
       * <pre>
       * Logs for system health metric for Shem (go/primes, go/rtc-shem).
       * </pre>
       */
      INBOX_ANDROID_PRIMES(174, 180),
      /**
       * <code>INBOX_IOS_PRIMES = 262;</code>
       *
       * <pre>
       * Logs for system health metric for Inbox (go/primes, go/bt-speed)
       * </pre>
       */
      INBOX_IOS_PRIMES(175, 262),
      /**
       * <code>SDP_IOS_PRIMES = 287;</code>
       *
       * <pre>
       * Logs for ios system health metric for Inbox (go/primes-ios, go/bt-speed)
       * </pre>
       */
      SDP_IOS_PRIMES(176, 287),
      /**
       * <code>GMSCORE_ANDROID_PRIMES = 193;</code>
       *
       * <pre>
       * Logs for ios system health metric for sdp (go/primes-ios, go/bt-speed)
       * </pre>
       */
      GMSCORE_ANDROID_PRIMES(177, 193),
      /**
       * <code>PLAY_MUSIC_ANDROID_WEAR_PRIMES = 200;</code>
       *
       * <pre>
       * Logs for system health metric for GmsCore (go/primes)
       * </pre>
       */
      PLAY_MUSIC_ANDROID_WEAR_PRIMES(178, 200),
      /**
       * <code>GEARHEAD_ANDROID_PRIMES = 201;</code>
       *
       * <pre>
       * Logs for system health metric for Play Music for Android Wear (music-android-wear@, go/wear-play-music, go/primes)
       * </pre>
       */
      GEARHEAD_ANDROID_PRIMES(179, 201),
      /**
       * <code>INSTORE_CONSUMER_PRIMES = 207;</code>
       *
       * <pre>
       * Logs for system health metric for the Android Auto (GearHead) app (go/primes, go/gearhead)
       * </pre>
       */
      INSTORE_CONSUMER_PRIMES(180, 207),
      /**
       * <code>SAMPLE_IOS_PRIMES = 202;</code>
       *
       * <pre>
       * Logs for system health metric for Hands Free (go/primes, go/instore-wallet)
       * </pre>
       */
      SAMPLE_IOS_PRIMES(181, 202),
      /**
       * <code>CPANEL_ANDROID_PRIMES = 213;</code>
       *
       * <pre>
       * Logs for ios system health metric and memory metric sample app (go/primes-ios)
       * </pre>
       */
      CPANEL_ANDROID_PRIMES(182, 213),
      /**
       * <code>HUDDLE_ANDROID_PRIMES = 214;</code>
       *
       * <pre>
       * Logs for android system health metric (go/cpanel-mobile)
       * </pre>
       */
      HUDDLE_ANDROID_PRIMES(183, 214),
      /**
       * <code>AWX_ANDROID_PRIMES = 222;</code>
       *
       * <pre>
       * Primes for Huddle (go/huddle)
       * </pre>
       */
      AWX_ANDROID_PRIMES(184, 222),
      /**
       * <code>GHS_ANDROID_PRIMES = 223;</code>
       *
       * <pre>
       * Primes for Google AdWords Express android app (go/primes, go/awx-android)
       * </pre>
       */
      GHS_ANDROID_PRIMES(185, 223),
      /**
       * <code>ADWORDS_MOBILE_ANDROID_PRIMES = 224;</code>
       *
       * <pre>
       * Primes for Google Home Services android app (go/primes, go/sab-awx-android)
       * </pre>
       */
      ADWORDS_MOBILE_ANDROID_PRIMES(186, 224),
      /**
       * <code>TAP_AND_PAY_ANDROID_PRIMES = 227;</code>
       *
       * <pre>
       * AdWords system health (go/awm, go/primes)
       * </pre>
       */
      TAP_AND_PAY_ANDROID_PRIMES(187, 227),
      /**
       * <code>WALLET_APP_ANDROID_PRIMES = 232;</code>
       *
       * <pre>
       * Primes for Tap and Pay android app, aka Android pay app (go/tp2)
       * </pre>
       */
      WALLET_APP_ANDROID_PRIMES(188, 232),
      /**
       * <code>WALLET_APP_IOS_PRIMES = 233;</code>
       *
       * <pre>
       * Primes for Wallet android app (go/gmoney)
       * </pre>
       */
      WALLET_APP_IOS_PRIMES(189, 233),
      /**
       * <code>ANALYTICS_ANDROID_PRIMES = 235;</code>
       *
       * <pre>
       * Primes for Wallet iOS app (go/gmoney)
       * </pre>
       */
      ANALYTICS_ANDROID_PRIMES(190, 235),
      /**
       * <code>SPACES_ANDROID_PRIMES = 236;</code>
       *
       * <pre>
       * Logs for system health metric for Analytics Android app (go/primes)
       * </pre>
       */
      SPACES_ANDROID_PRIMES(191, 236),
      /**
       * <code>SPACES_IOS_PRIMES = 276;</code>
       *
       * <pre>
       * Logs for the Spaces Android App (go/spaces)
       * </pre>
       */
      SPACES_IOS_PRIMES(192, 276),
      /**
       * <code>SOCIETY_ANDROID_PRIMES = 238;</code>
       *
       * <pre>
       * Logs for the Spaces iOS App (go/spaces)
       * </pre>
       */
      SOCIETY_ANDROID_PRIMES(193, 238),
      /**
       * <code>GMM_BRIIM_PRIMES = 239;</code>
       *
       * <pre>
       * Logs for system health metric for Society (go/primes, go/society)
       * </pre>
       */
      GMM_BRIIM_PRIMES(194, 239),
      /**
       * <code>CW_PRIMES = 242;</code>
       *
       * <pre>
       * Logs for system health metric for GMM BRIIM (go/gmm-briim)
       * </pre>
       */
      CW_PRIMES(195, 242),
      /**
       * <code>FAMILYLINK_ANDROID_PRIMES = 244;</code>
       *
       * <pre>
       * Clockwork go/primes logs
       * </pre>
       */
      FAMILYLINK_ANDROID_PRIMES(196, 244),
      /**
       * <code>FAMILYLINK_IOS_PRIMES = 291;</code>
       *
       * <pre>
       * Logs for system health metric for FamilyLink (go/primes)
       * </pre>
       */
      FAMILYLINK_IOS_PRIMES(197, 291),
      /**
       * <code>WH_PRIMES = 248;</code>
       *
       * <pre>
       * Logs for ios system health metric for FamilyLink (go/primes-ios, go/familylink-ios-app)
       * </pre>
       */
      WH_PRIMES(198, 248),
      /**
       * <code>NOVA_ANDROID_PRIMES = 249;</code>
       *
       * <pre>
       * Primes for Westinghouse (go/westinghouse, go/primes)
       * </pre>
       */
      NOVA_ANDROID_PRIMES(199, 249),
      /**
       * <code>PHOTOS_DRAPER_ANDROID_PRIMES = 253;</code>
       *
       * <pre>
       * Nova client app system health metrics (go/primes)
       * </pre>
       */
      PHOTOS_DRAPER_ANDROID_PRIMES(200, 253),
      /**
       * <code>GMM_PRIMES = 254;</code>
       *
       * <pre>
       * Logs for system health metric for Photos Draper (go/primes, go/photos-draper)
       * </pre>
       */
      GMM_PRIMES(201, 254),
      /**
       * <code>TRANSLATE_ANDROID_PRIMES = 255;</code>
       *
       * <pre>
       * Logs for system health metric for aGMM (go/gmm)
       * </pre>
       */
      TRANSLATE_ANDROID_PRIMES(202, 255),
      /**
       * <code>TRANSLATE_IOS_PRIMES = 256;</code>
       *
       * <pre>
       * Logs for system health metric for Translate on Android (go/primes)
       * </pre>
       */
      TRANSLATE_IOS_PRIMES(203, 256),
      /**
       * <code>FLYDROID_ANDROID_PRIMES = 259;</code>
       *
       * <pre>
       * Logs for system health metric for Translate on iOS (go/primes)
       * </pre>
       */
      FLYDROID_ANDROID_PRIMES(204, 259),
      /**
       * <code>CONSUMERIQ_PRIMES = 260;</code>
       *
       * <pre>
       * Log for system health metric for Freighter (go/freighter)
       * </pre>
       */
      CONSUMERIQ_PRIMES(205, 260),
      /**
       * <code>GMB_ANDROID_PRIMES = 263;</code>
       *
       * <pre>
       * Log for system health metric for Consumer IQ (go/primes)
       * </pre>
       */
      GMB_ANDROID_PRIMES(206, 263),
      /**
       * <code>CLOUDDPC_PRIMES = 304;</code>
       *
       * <pre>
       * Primes for Google My Business android app (go/gmb-android, go/primes).
       * </pre>
       */
      CLOUDDPC_PRIMES(207, 304),
      /**
       * <code>CLOUDDPC_ARC_PRIMES = 305;</code>
       *
       * <pre>
       * Primes for CloudDpc (go/clouddpc)
       * </pre>
       */
      CLOUDDPC_ARC_PRIMES(208, 305),
      /**
       * <code>ICORE = 137;</code>
       *
       * <pre>
       * Primes for CloudDpc for ARC (go/clouddpc)
       * </pre>
       */
      ICORE(209, 137),
      /**
       * <code>PANCETTA_MOBILE_HOST = 138;</code>
       *
       * <pre>
       * iOS logging (go/ios-logging)
       * </pre>
       */
      PANCETTA_MOBILE_HOST(210, 138),
      /**
       * <code>PANCETTA_MOBILE_HOST_COUNTERS = 139;</code>
       *
       * <pre>
       * Logs for Pancetta mobile hosts (go/pancetta)
       * </pre>
       */
      PANCETTA_MOBILE_HOST_COUNTERS(211, 139),
      /**
       * <code>CROSSDEVICENOTIFICATION = 141;</code>
       *
       * <pre>
       * Counters for Pancetta mobile hosts (go/pancetta)
       * </pre>
       */
      CROSSDEVICENOTIFICATION(212, 141),
      /**
       * <code>CROSSDEVICENOTIFICATION_DEV = 142;</code>
       *
       * <pre>
       * Logs for cross device notification service (go/hotpocket)
       * </pre>
       */
      CROSSDEVICENOTIFICATION_DEV(213, 142),
      /**
       * <code>MAPS_API_COUNTERS = 143;</code>
       *
       * <pre>
       * Dev logs for cross device notification service (go/hotpocket)
       * </pre>
       */
      MAPS_API_COUNTERS(214, 143),
      /**
       * <code>GPU = 144;</code>
       *
       * <pre>
       * Android and iOS Maps API (go/mapview &amp; go/meridian)
       * </pre>
       */
      GPU(215, 144),
      /**
       * <code>ON_THE_GO = 145;</code>
       *
       * <pre>
       * Logs for Geo Photo Uploader (go/gpu-site)
       * </pre>
       */
      ON_THE_GO(216, 145),
      /**
       * <code>ON_THE_GO_COUNTERS = 146;</code>
       *
       * <pre>
       * Logs for OnTheGo (go/onthego)
       * </pre>
       */
      ON_THE_GO_COUNTERS(217, 146),
      /**
       * <code>GMS_CORE_PEOPLE_AUTOCOMPLETE = 147;</code>
       *
       * <pre>
       * Counters for OnTheGo (go/onthego)
       * </pre>
       */
      GMS_CORE_PEOPLE_AUTOCOMPLETE(218, 147),
      /**
       * <code>FLYDROID_COUNTERS = 148;</code>
       *
       * <pre>
       * Logs for Gcore People Autocomplete (go/yenta)
       * </pre>
       */
      FLYDROID_COUNTERS(219, 148),
      /**
       * <code>FIREBALL = 149;</code>
       *
       * <pre>
       * Logs for Flydroid (go/flydroid).
       * </pre>
       */
      FIREBALL(220, 149),
      /**
       * <code>FIREBALL_COUNTERS = 257;</code>
       *
       * <pre>
       * Logs for Fireball (go/fireballdev)
       * </pre>
       */
      FIREBALL_COUNTERS(221, 257),
      /**
       * <code>CRONET_FIREBALL = 303;</code>
       *
       * <pre>
       * Fireball counters (go/fireballdev)
       * </pre>
       */
      CRONET_FIREBALL(222, 303),
      /**
       * <code>FIREBALL_PRIMES = 266;</code>
       *
       * <pre>
       * Fireball cronet (go/fireballdev)
       * </pre>
       */
      FIREBALL_PRIMES(223, 266),
      /**
       * <code>FIREBALL_IOS_PRIMES = 313;</code>
       *
       * <pre>
       * Logs for system health for Fireball (go/fireball-systemhealth-plan)
       * </pre>
       */
      FIREBALL_IOS_PRIMES(224, 313),
      /**
       * <code>GOOGLE_HANDWRITING_INPUT_ANDROID_PRIMES = 314;</code>
       *
       * <pre>
       * Logs for system health for Fireball iOS (go/fireball-systemhealth-plan)
       * </pre>
       */
      GOOGLE_HANDWRITING_INPUT_ANDROID_PRIMES(225, 314),
      /**
       * <code>PYROCLASM = 153;</code>
       *
       * <pre>
       * Primes for Google Handwriting Input (go/hwrime)
       * </pre>
       */
      PYROCLASM(226, 153),
      /**
       * <code>ANDROID_GSA_COUNTERS = 161;</code>
       *
       * <pre>
       * Logs for Pyroclasm (go/pyroclasm)
       * </pre>
       */
      ANDROID_GSA_COUNTERS(227, 161),
      /**
       * <code>JAM_IMPRESSIONS = 162;</code>
       *
       * <pre>
       * Logs for AGSA counters.
       * </pre>
       */
      JAM_IMPRESSIONS(228, 162),
      /**
       * <code>JAM_KIOSK_IMPRESSIONS = 163;</code>
       *
       * <pre>
       * Impressions logs for Jam (go/jam).
       * </pre>
       */
      JAM_KIOSK_IMPRESSIONS(229, 163),
      /**
       * <code>PAYMENTS_OCR = 164;</code>
       *
       * <pre>
       * Impressions logs for Jam Kiosk (go/jam).
       * </pre>
       */
      PAYMENTS_OCR(230, 164),
      /**
       * <code>UNICORN_FAMILY_MANAGEMENT = 172;</code>
       *
       * <pre>
       * Logs for payments ocr (go/cc-ocr-metrics).
       * </pre>
       */
      UNICORN_FAMILY_MANAGEMENT(231, 172),
      /**
       * <code>AUDITOR = 173;</code>
       *
       * <pre>
       * Logs for Family management (and onboarding) go/familymanagement
       * </pre>
       */
      AUDITOR(232, 173),
      /**
       * <code>NQLOOKUP = 174;</code>
       *
       * <pre>
       * Logs for Accesssibility Auditor (go/a11y-checker)
       * </pre>
       */
      NQLOOKUP(233, 174),
      /**
       * <code>ANDROID_GSA_HIGH_PRIORITY_EVENTS = 175;</code>
       *
       * <pre>
       * Logs for NQLookup (go/nqlookup, contact herrevad@google.com)
       * </pre>
       */
      ANDROID_GSA_HIGH_PRIORITY_EVENTS(234, 175),
      /**
       * <code>ANDROID_DIALER = 176;</code>
       *
       * <pre>
       * Logs for high priority events in AGSA (go/click-tracking-agsa).
       * </pre>
       */
      ANDROID_DIALER(235, 176),
      /**
       * <code>CLEARCUT_DEMO = 177;</code>
       *
       * <pre>
       * Logs for Android Dialer (go/android-dialer)
       * </pre>
       */
      CLEARCUT_DEMO(236, 177),
      /**
       * <code>APPMANAGER = 183;</code>
       *
       * <pre>
       * Logs for Clearcut's demo application
       * </pre>
       */
      APPMANAGER(237, 183),
      /**
       * <code>SMARTLOCK_COUNTERS = 184;</code>
       *
       * <pre>
       * Logs for Firebase App Manager (go/appmanager)
       * </pre>
       */
      SMARTLOCK_COUNTERS(238, 184),
      /**
       * <code>EXPEDITIONS_GUIDE = 185;</code>
       *
       * <pre>
       * Counters for Smart Lock (go/smartlock)
       * </pre>
       */
      EXPEDITIONS_GUIDE(239, 185),
      /**
       * <code>FUSE = 186;</code>
       *
       * <pre>
       * Guide-aggregated logs for go/expeditions .
       * </pre>
       */
      FUSE(240, 186),
      /**
       * <code>PIXEL_PERFECT_CLIENT_STATE_LOGGER = 187;</code>
       *
       * <pre>
       * Logs for Fuse (go/fuse).
       * </pre>
       */
      PIXEL_PERFECT_CLIENT_STATE_LOGGER(241, 187),
      /**
       * <code>PLATFORM_STATS_COUNTERS = 188;</code>
       *
       * <pre>
       * Logs for PixelPerfect client app (go/pxp-client)
       * </pre>
       */
      PLATFORM_STATS_COUNTERS(242, 188),
      /**
       * <code>DRIVE_VIEWER = 189;</code>
       *
       * <pre>
       * Counters for platform stats.(go/androidplatformstats, clearcut-eng@)
       * </pre>
       */
      DRIVE_VIEWER(243, 189),
      /**
       * <code>PDF_VIEWER = 190;</code>
       *
       * <pre>
       * Google Drive Viewer Android and iOS apps (go/picoprojector)
       * </pre>
       */
      PDF_VIEWER(244, 190),
      /**
       * <code>BIGTOP = 191;</code>
       *
       * <pre>
       * Google PDF Viewer Android app (go/picoprojector)
       * </pre>
       */
      BIGTOP(245, 191),
      /**
       * <code>VOICE = 192;</code>
       *
       * <pre>
       * Logs for Bigtop (externally known as Inbox, go/bigtop).
       * </pre>
       */
      VOICE(246, 192),
      /**
       * <code>MYFIBER = 194;</code>
       *
       * <pre>
       * Logs for Google Voice (go/googlevoice).
       * </pre>
       */
      MYFIBER(247, 194),
      /**
       * <code>RECORDED_PAGES = 195;</code>
       *
       * <pre>
       * Logs for My Fiber mobile applications (go/myfibernative)
       * </pre>
       */
      RECORDED_PAGES(248, 195),
      /**
       * <code>MOB_DOG = 197;</code>
       *
       * <pre>
       * Logs for RecordedPages (go/recorded-pages)
       * </pre>
       */
      MOB_DOG(249, 197),
      /**
       * <code>WALLET_APP = 198;</code>
       *
       * <pre>
       * Logs for MobDog (go/mobdog)
       * </pre>
       */
      WALLET_APP(250, 198),
      /**
       * <code>GBOARD = 199;</code>
       *
       * <pre>
       * Logs for the Wallet app (go/gmoney)
       * </pre>
       */
      GBOARD(251, 199),
      /**
       * <code>CRONET_GMM = 203;</code>
       *
       * <pre>
       * Logs for GBoard (go/gboard)
       * </pre>
       */
      CRONET_GMM(252, 203),
      /**
       * <code>TRUSTED_FACE = 204;</code>
       *
       * <pre>
       * Cronet UMA logs from GMM (go/cronet-uma)
       * </pre>
       */
      TRUSTED_FACE(253, 204),
      /**
       * <code>MATCHSTICK = 205;</code>
       *
       * <pre>
       * Logs for Trusted Face (go/smartlock)
       * </pre>
       */
      MATCHSTICK(254, 205),
      /**
       * <code>APP_CATALOG = 206;</code>
       *
       * <pre>
       * Logs for Matchstick library (go/matchstick)
       * </pre>
       */
      APP_CATALOG(255, 206),
      /**
       * <code>BLUETOOTH = 208;</code>
       *
       * <pre>
       * Logs for AppCatalog aka "Get My Google Apps" (go/growth)
       * </pre>
       */
      BLUETOOTH(256, 208),
      /**
       * <code>WIFI = 209;</code>
       *
       * <pre>
       * Logs for Bluetooth (go/fluoride)
       * </pre>
       */
      WIFI(257, 209),
      /**
       * <code>TELECOM = 210;</code>
       *
       * <pre>
       * Logs for WiFi (go/connectivity-site)
       * </pre>
       */
      TELECOM(258, 210),
      /**
       * <code>TELEPHONY = 211;</code>
       *
       * <pre>
       * Logs for Telcom (go/connectivity-site)
       * </pre>
       */
      TELEPHONY(259, 211),
      /**
       * <code>IDENTITY_FRONTEND = 212;</code>
       *
       * <pre>
       * Logs for Telephony (go/connectivity-site)
       * </pre>
       */
      IDENTITY_FRONTEND(260, 212),
      /**
       * <code>SESAME = 216;</code>
       *
       * <pre>
       * Logs for the Identity frontend (go/ifus-readme)
       * </pre>
       */
      SESAME(261, 216),
      /**
       * <code>GOOGLE_KEYBOARD_CONTENT = 217;</code>
       *
       * <pre>
       * Logs for Sesame (go/sesame-logging)
       * </pre>
       */
      GOOGLE_KEYBOARD_CONTENT(262, 217),
      /**
       * <code>MADDEN = 218;</code>
       *
       * <pre>
       * Google Keyboard's Latin IME content logs (go/google-keyboard)
       * </pre>
       */
      MADDEN(263, 218),
      /**
       * <code>INK = 219;</code>
       *
       * <pre>
       * Logs for Madden (go/madden)
       * </pre>
       */
      INK(264, 219),
      /**
       * <code>ANDROID_CONTACTS = 220;</code>
       *
       * <pre>
       * Logs for Ink (go/ink)
       * </pre>
       */
      ANDROID_CONTACTS(265, 220),
      /**
       * <code>GOOGLE_KEYBOARD_COUNTERS = 221;</code>
       *
       * <pre>
       * Logs for Android Contacts (go/android-contacts)
       * </pre>
       */
      GOOGLE_KEYBOARD_COUNTERS(266, 221),
      /**
       * <code>CLEARCUT_PROBER = 225;</code>
       *
       * <pre>
       * Google Keyboard histogram counters (go/google-keyboard)
       * </pre>
       */
      CLEARCUT_PROBER(267, 225),
      /**
       * <code>PLAY_CONSOLE_APP = 226;</code>
       *
       * <pre>
       * Clearcut prober (go/clearcut-prober)
       * </pre>
       */
      PLAY_CONSOLE_APP(268, 226),
      /**
       * <code>PLAY_CONSOLE_APP_PRIMES = 264;</code>
       *
       * <pre>
       * Logs for the Google Play Developer Console app
       * </pre>
       */
      PLAY_CONSOLE_APP_PRIMES(269, 264),
      /**
       * <code>SPECTRUM = 230;</code>
       *
       * <pre>
       * Log for system health metrics for the Google Play Developer Console app
       * </pre>
       */
      SPECTRUM(270, 230),
      /**
       * <code>SPECTRUM_COUNTERS = 231;</code>
       *
       * <pre>
       * Spectrum (go/spectrum-site)
       * </pre>
       */
      SPECTRUM_COUNTERS(271, 231),
      /**
       * <code>SPECTRUM_ANDROID_PRIMES = 267;</code>
       *
       * <pre>
       * Spectrum (go/spectrum-site)
       * </pre>
       */
      SPECTRUM_ANDROID_PRIMES(272, 267),
      /**
       * <code>IOS_SPOTLIGHT_SEARCH_LIBRARY = 234;</code>
       *
       * <pre>
       * Spectrum (go/spectrum-site)
       * </pre>
       */
      IOS_SPOTLIGHT_SEARCH_LIBRARY(273, 234),
      /**
       * <code>BOQ_WEB = 241;</code>
       *
       * <pre>
       * Logs for the iOS Spotlight Search Library (go/tempeh-dd)
       * </pre>
       */
      BOQ_WEB(274, 241),
      /**
       * <code>ORCHESTRATION_CLIENT = 245;</code>
       *
       * <pre>
       * Logs for client-side analytics of Boq Web (go/boq-web)
       * </pre>
       */
      ORCHESTRATION_CLIENT(275, 245),
      /**
       * <code>ORCHESTRATION_CLIENT_DEV = 246;</code>
       *
       * <pre>
       * Orchestration client logs for prod environment (go/megalogs-design)
       * </pre>
       */
      ORCHESTRATION_CLIENT_DEV(276, 246),
      /**
       * <code>GOOGLE_NOW_LAUNCHER = 247;</code>
       *
       * <pre>
       * Orchestration client logs for dev environment (go/megalogs-design)
       * </pre>
       */
      GOOGLE_NOW_LAUNCHER(277, 247),
      /**
       * <code>SCOOBY_SPAM_REPORT_LOG = 250;</code>
       *
       * <pre>
       * Logs for Google Now Launcher (go/gnl-logging)
       * </pre>
       */
      SCOOBY_SPAM_REPORT_LOG(278, 250),
      /**
       * <code>IOS_GROWTH = 251;</code>
       *
       * <pre>
       * Logs of spam reports by scooby clients. (go/scooby)
       * </pre>
       */
      IOS_GROWTH(279, 251),
      /**
       * <code>APPS_NOTIFY = 252;</code>
       *
       * <pre>
       * go/growthkit-metrics
       * </pre>
       */
      APPS_NOTIFY(280, 252),
      /**
       * <code>SMARTKEY_APP = 269;</code>
       *
       * <pre>
       * Drive web push notifications (go/apps-notify)
       * </pre>
       */
      SMARTKEY_APP(281, 269),
      /**
       * <code>CLINICAL_STUDIES = 270;</code>
       *
       * <pre>
       * Smart Key App for project Bolt (go/smartlock)
       * </pre>
       */
      CLINICAL_STUDIES(282, 270),
      /**
       * <code>FITNESS_ANDROID_PRIMES = 271;</code>
       *
       * <pre>
       * Lifescience Clinical Studies logs (go/apollox)
       * </pre>
       */
      FITNESS_ANDROID_PRIMES(283, 271),
      /**
       * <code>IMPROV_APPS = 272;</code>
       *
       * <pre>
       * System health metric for Google Fit Android App (go/heart, go/primes)
       * </pre>
       */
      IMPROV_APPS(284, 272),
      /**
       * <code>FAMILYLINK = 273;</code>
       *
       * <pre>
       * Logs for Improv apps (go/improvlogging)
       * </pre>
       */
      FAMILYLINK(285, 273),
      /**
       * <code>FAMILYLINK_COUNTERS = 274;</code>
       *
       * <pre>
       * Family Link (go/familylink-dd)
       * </pre>
       */
      FAMILYLINK_COUNTERS(286, 274),
      /**
       * <code>SOCIETY = 275;</code>
       *
       * <pre>
       * Family Link counters (go/familylink-dd)
       * </pre>
       */
      SOCIETY(287, 275),
      /**
       * <code>DIALER_ANDROID_PRIMES = 277;</code>
       *
       * <pre>
       * NBU Society app (go/society)
       * </pre>
       */
      DIALER_ANDROID_PRIMES(288, 277),
      /**
       * <code>YOUTUBE_DIRECTOR_APP = 278;</code>
       *
       * <pre>
       * Android Dialer Primes (go/dialer)
       * </pre>
       */
      YOUTUBE_DIRECTOR_APP(289, 278),
      /**
       * <code>TACHYON_ANDROID_PRIMES = 279;</code>
       *
       * <pre>
       * YouTube Director App (go/youtube-director)
       * </pre>
       */
      TACHYON_ANDROID_PRIMES(290, 279),
      /**
       * <code>DRIVE_FS = 280;</code>
       *
       * <pre>
       * Android Tachyon Client
       * </pre>
       */
      DRIVE_FS(291, 280),
      /**
       * <code>YT_MAIN = 281;</code>
       *
       * <pre>
       * DriveFS (go/drive-fs)
       * </pre>
       */
      YT_MAIN(292, 281),
      /**
       * <code>WING_MARKETPLACE_ANDROID_PRIMES = 282;</code>
       *
       * <pre>
       * Logs for YT's main application
       * </pre>
       */
      WING_MARKETPLACE_ANDROID_PRIMES(293, 282),
      /**
       * <code>DYNAMITE = 283;</code>
       *
       * <pre>
       * Primes for Wing Marketplace Android app (go/wing-marketplace-android, go/primes)
       * </pre>
       */
      DYNAMITE(294, 283),
      /**
       * <code>CORP_ANDROID_FOOD = 284;</code>
       *
       * <pre>
       * Logs for Dynamite (go/dynamite)
       * </pre>
       */
      CORP_ANDROID_FOOD(295, 284),
      /**
       * <code>ANDROID_MESSAGING_PRIMES = 285;</code>
       *
       * <pre>
       * Logs for the internal Android Food app (g3doc/java/com/google/corp/bizapps/rews/food/android)
       * </pre>
       */
      ANDROID_MESSAGING_PRIMES(296, 285),
      /**
       * <code>GPLUS_IOS_PRIMES = 286;</code>
       *
       * <pre>
       * Primes for Android Messenger (go/bugledev, go/primes)
       * </pre>
       */
      GPLUS_IOS_PRIMES(297, 286),
      /**
       * <code>CHROMECAST_ANDROID_PRIMES = 288;</code>
       *
       * <pre>
       * Primes for Google+ iOS app (go/gplus-ios, go/primes)
       * </pre>
       */
      CHROMECAST_ANDROID_PRIMES(298, 288),
      /**
       * <code>APPSTREAMING = 289;</code>
       *
       * <pre>
       * Primes for Chromecast Android app (go/cast-apps)
       * </pre>
       */
      APPSTREAMING(299, 289),
      /**
       * <code>GMB_ANDROID = 290;</code>
       *
       * <pre>
       * Logs for AppStreaming Client Framework Side (go/piccard)
       * </pre>
       */
      GMB_ANDROID(300, 290),
      /**
       * <code>VOICE_IOS_PRIMES = 292;</code>
       *
       * <pre>
       * Logs for GMB Android app (go/gmb-android).
       * </pre>
       */
      VOICE_IOS_PRIMES(301, 292),
      /**
       * <code>VOICE_ANDROID_PRIMES = 293;</code>
       *
       * <pre>
       * Primes for iOS Google Voice (go/googlevoice).
       * </pre>
       */
      VOICE_ANDROID_PRIMES(302, 293),
      /**
       * <code>PAISA = 294;</code>
       *
       * <pre>
       * Primes for Android Google Voice (go/googlevoice).
       * </pre>
       */
      PAISA(303, 294),
      /**
       * <code>GMB_IOS = 295;</code>
       *
       * <pre>
       * NBU Paisa app (go/paisa)
       * </pre>
       */
      GMB_IOS(304, 295),
      /**
       * <code>SCOOBY_EVENTS = 296;</code>
       *
       * <pre>
       * Logs for GMB iOS App (go/gmb-ios).
       * </pre>
       */
      SCOOBY_EVENTS(305, 296),
      /**
       * <code>SNAPSEED_IOS_PRIMES = 297;</code>
       *
       * <pre>
       * Call logs events by scooby clients. (go/scooby)
       * </pre>
       */
      SNAPSEED_IOS_PRIMES(306, 297),
      /**
       * <code>YOUTUBE_DIRECTOR_IOS_PRIMES = 298;</code>
       *
       * <pre>
       * Primes for Snapseed IOS (go/Snapseed)
       * </pre>
       */
      YOUTUBE_DIRECTOR_IOS_PRIMES(307, 298),
      /**
       * <code>WALLPAPER_PICKER = 299;</code>
       *
       * <pre>
       * YouTube Director App (go/youtube-director)
       * </pre>
       */
      WALLPAPER_PICKER(308, 299),
      /**
       * <code>CHIME = 300;</code>
       *
       * <pre>
       * Android wallpaper picker (go/magic-wallpapers)
       * </pre>
       */
      CHIME(309, 300),
      /**
       * <code>BEACON_GCORE = 301;</code>
       *
       * <pre>
       * Chime (go/chime)
       * </pre>
       */
      BEACON_GCORE(310, 301),
      /**
       * <code>ANDROID_STUDIO = 302;</code>
       *
       * <pre>
       * Logs for debugging beacon module (go/beacons)
       * </pre>
       */
      ANDROID_STUDIO(311, 302),
      /**
       * <code>DOCS_OFFLINE = 306;</code>
       *
       * <pre>
       * Android Studio (go/android-studio)
       * </pre>
       */
      DOCS_OFFLINE(312, 306),
      /**
       * <code>FREIGHTER = 307;</code>
       *
       * <pre>
       * Logs for Docs Offline on Desktop  (go/jetpax)
       * </pre>
       */
      FREIGHTER(313, 307),
      /**
       * <code>DOCS_IOS_PRIMES = 308;</code>
       *
       * <pre>
       * Logs for Freighter (http://go/freighter)
       * </pre>
       */
      DOCS_IOS_PRIMES(314, 308),
      /**
       * <code>SLIDES_IOS_PRIMES = 309;</code>
       *
       * <pre>
       * Logs for the Google Docs iOS application
       * </pre>
       */
      SLIDES_IOS_PRIMES(315, 309),
      /**
       * <code>SHEETS_IOS_PRIMES = 310;</code>
       *
       * <pre>
       * Logs for the Google Docs iOS application
       * </pre>
       */
      SHEETS_IOS_PRIMES(316, 310),
      /**
       * <code>IPCONNECTIVITY = 311;</code>
       *
       * <pre>
       * Logs for the Google Docs iOS application
       * </pre>
       */
      IPCONNECTIVITY(317, 311),
      /**
       * <code>CURATOR = 312;</code>
       *
       * <pre>
       * Logs for Networking (go/connectivity-site)
       * </pre>
       */
      CURATOR(318, 312),
      ;

      /**
       * <code>GPLUS_ANDROID_SYSTEM_HEALTH = 140;</code>
       *
       * <pre>
       * Logs for system health metric for Gplus (go/primes)
       * </pre>
       */
      public static final LogSource GPLUS_ANDROID_SYSTEM_HEALTH = GPLUS_ANDROID_PRIMES;
      /**
       * <code>GMAIL_ANDROID_SYSTEM_HEALTH = 150;</code>
       *
       * <pre>
       * Logs for system health metric for GMail (go/primes)
       * </pre>
       */
      public static final LogSource GMAIL_ANDROID_SYSTEM_HEALTH = GMAIL_ANDROID_PRIMES;
      /**
       * <code>CALENDAR_ANDROID_SYSTEM_HEALTH = 151;</code>
       *
       * <pre>
       * Logs for system health metric for Calendar (go/primes)
       * </pre>
       */
      public static final LogSource CALENDAR_ANDROID_SYSTEM_HEALTH = CALENDAR_ANDROID_PRIMES;
      /**
       * <code>DOCS_ANDROID_SYSTEM_HEALTH = 152;</code>
       *
       * <pre>
       * Logs for system health metric for Docs (go/primes)
       * </pre>
       */
      public static final LogSource DOCS_ANDROID_SYSTEM_HEALTH = DOCS_ANDROID_PRIMES;
      /**
       * <code>UNKNOWN = -1;</code>
       */
      public static final int UNKNOWN_VALUE = -1;
      /**
       * <code>STORE = 0;</code>
       */
      public static final int STORE_VALUE = 0;
      /**
       * <code>WEB_STORE = 65;</code>
       *
       * <pre>
       * Google Play Store Android App
       * </pre>
       */
      public static final int WEB_STORE_VALUE = 65;
      /**
       * <code>WORK_STORE = 132;</code>
       *
       * <pre>
       * Google Play Web Store (https://play.google.com/store)
       * </pre>
       */
      public static final int WORK_STORE_VALUE = 132;
      /**
       * <code>WORK_STORE_APP = 261;</code>
       *
       * <pre>
       * Play for Work on the web client (Worksky)
       * </pre>
       */
      public static final int WORK_STORE_APP_VALUE = 261;
      /**
       * <code>EDU_STORE = 15;</code>
       *
       * <pre>
       * Play for Work on the Google Play Store Android App
       * </pre>
       */
      public static final int EDU_STORE_VALUE = 15;
      /**
       * <code>MUSIC = 1;</code>
       *
       * <pre>
       * for collecting stats on Play for Education
       * </pre>
       */
      public static final int MUSIC_VALUE = 1;
      /**
       * <code>BOOKS = 2;</code>
       */
      public static final int BOOKS_VALUE = 2;
      /**
       * <code>VIDEO = 3;</code>
       */
      public static final int VIDEO_VALUE = 3;
      /**
       * <code>MOVIES = 74;</code>
       *
       * <pre>
       * Android Video (go/avi, android-video-oncall@)
       * </pre>
       */
      public static final int MOVIES_VALUE = 74;
      /**
       * <code>MAGAZINES = 4;</code>
       */
      public static final int MAGAZINES_VALUE = 4;
      /**
       * <code>GAMES = 5;</code>
       */
      public static final int GAMES_VALUE = 5;
      /**
       * <code>LB_A = 6;</code>
       */
      public static final int LB_A_VALUE = 6;
      /**
       * <code>ANDROID_IDE = 7;</code>
       *
       * <pre>
       * for collecting app usage stats (Lockbox project)
       * </pre>
       */
      public static final int ANDROID_IDE_VALUE = 7;
      /**
       * <code>LB_P = 8;</code>
       *
       * <pre>
       * Android IDE (deprecated, see ANDROID_STUDIO below)
       * </pre>
       */
      public static final int LB_P_VALUE = 8;
      /**
       * <code>LB_S = 9;</code>
       *
       * <pre>
       * for collecting phone call events and stats (Lockbox project)
       * </pre>
       */
      public static final int LB_S_VALUE = 9;
      /**
       * <code>GMS_CORE = 10;</code>
       *
       * <pre>
       * for collecting SMS events and stats (Lockbox project)
       * </pre>
       */
      public static final int GMS_CORE_VALUE = 10;
      /**
       * <code>APP_USAGE_1P = 11;</code>
       *
       * <pre>
       * Usage of GMS Core itself and its internal stats
       * </pre>
       */
      public static final int APP_USAGE_1P_VALUE = 11;
      /**
       * <code>ICING = 12;</code>
       *
       * <pre>
       * First-party app usage tracking.
       * </pre>
       */
      public static final int ICING_VALUE = 12;
      /**
       * <code>HERREVAD = 13;</code>
       *
       * <pre>
       * Icing stats (AppDataSearch go/icing)
       * </pre>
       */
      public static final int HERREVAD_VALUE = 13;
      /**
       * <code>GOOGLE_TV = 14;</code>
       *
       * <pre>
       * for collecting Nova Network quality data
       * </pre>
       */
      public static final int GOOGLE_TV_VALUE = 14;
      /**
       * <code>GMS_CORE_PEOPLE = 16;</code>
       *
       * <pre>
       * Google TV, not Eureka.
       * </pre>
       */
      public static final int GMS_CORE_PEOPLE_VALUE = 16;
      /**
       * <code>LE = 17;</code>
       *
       * <pre>
       * GMS core people (aka menagerie, zhengfu@, android-contacts@)
       * </pre>
       */
      public static final int LE_VALUE = 17;
      /**
       * <code>GOOGLE_ANALYTICS = 18;</code>
       *
       * <pre>
       * Location Engine statistics
       * </pre>
       */
      public static final int GOOGLE_ANALYTICS_VALUE = 18;
      /**
       * <code>LB_D = 19;</code>
       *
       * <pre>
       * Google Analytics SDK health monitoring
       * </pre>
       */
      public static final int LB_D_VALUE = 19;
      /**
       * <code>ANDROID_GSA = 20;</code>
       *
       * <pre>
       * for collecting device state changes (Lockbox project)
       * </pre>
       */
      public static final int ANDROID_GSA_VALUE = 20;
      /**
       * <code>LB_T = 21;</code>
       *
       * <pre>
       * Android GSA (Google Search App) stats
       * </pre>
       */
      public static final int LB_T_VALUE = 21;
      /**
       * <code>PERSONAL_LOGGER = 22;</code>
       *
       * <pre>
       * for collecting Android RunningTaskInfo (Lockbox project)
       * </pre>
       */
      public static final int PERSONAL_LOGGER_VALUE = 22;
      /**
       * <code>PERSONAL_BROWSER_LOGGER = 37;</code>
       *
       * <pre>
       * PixelPerfect activity logger
       * </pre>
       */
      public static final int PERSONAL_BROWSER_LOGGER_VALUE = 37;
      /**
       * <code>GMS_CORE_WALLET_MERCHANT_ERROR = 23;</code>
       *
       * <pre>
       * PixelPerfect Chrome extension logger
       * </pre>
       */
      public static final int GMS_CORE_WALLET_MERCHANT_ERROR_VALUE = 23;
      /**
       * <code>LB_C = 24;</code>
       *
       * <pre>
       * GMS core wallet merchant errors
       * </pre>
       */
      public static final int LB_C_VALUE = 24;
      /**
       * <code>LB_IA = 52;</code>
       *
       * <pre>
       * Android contacts going from Now to HappyHour.log_event_extension_test
       * </pre>
       */
      public static final int LB_IA_VALUE = 52;
      /**
       * <code>LB_CB = 237;</code>
       *
       * <pre>
       * Android installed apps going from Now to HappyHour.
       * </pre>
       */
      public static final int LB_CB_VALUE = 237;
      /**
       * <code>LB_DM = 268;</code>
       *
       * <pre>
       * Android contacts for backup/restore purpose.
       * </pre>
       */
      public static final int LB_DM_VALUE = 268;
      /**
       * <code>ANDROID_AUTH = 25;</code>
       *
       * <pre>
       * Android device metadata used for contacts backup/restore
       * purpose.
       * </pre>
       */
      public static final int ANDROID_AUTH_VALUE = 25;
      /**
       * <code>ANDROID_CAMERA = 26;</code>
       *
       * <pre>
       * for collecting GMS core android auth data
       * </pre>
       */
      public static final int ANDROID_CAMERA_VALUE = 26;
      /**
       * <code>CW = 27;</code>
       *
       * <pre>
       * Android camera usage statistics
       * </pre>
       */
      public static final int CW_VALUE = 27;
      /**
       * <code>CW_COUNTERS = 243;</code>
       *
       * <pre>
       * Clockwork interaction logs
       * </pre>
       */
      public static final int CW_COUNTERS_VALUE = 243;
      /**
       * <code>GEL = 28;</code>
       *
       * <pre>
       * Clockwork counters
       * </pre>
       */
      public static final int GEL_VALUE = 28;
      /**
       * <code>DNA_PROBER = 29;</code>
       *
       * <pre>
       * Google experience launcher logs (http://go/signac).
       * </pre>
       */
      public static final int DNA_PROBER_VALUE = 29;
      /**
       * <code>UDR = 30;</code>
       *
       * <pre>
       * DNA logger (for internal research), go/dna2014.
       * </pre>
       */
      public static final int UDR_VALUE = 30;
      /**
       * <code>GMS_CORE_WALLET = 31;</code>
       *
       * <pre>
       * For collecting Android app usage data.
       * </pre>
       */
      public static final int GMS_CORE_WALLET_VALUE = 31;
      /**
       * <code>SOCIAL = 32;</code>
       *
       * <pre>
       * GMS core wallet analytics
       * </pre>
       */
      public static final int SOCIAL_VALUE = 32;
      /**
       * <code>INSTORE_WALLET = 33;</code>
       *
       * <pre>
       * Traffic from Social clients: gplus-log-quality@
       * </pre>
       */
      public static final int INSTORE_WALLET_VALUE = 33;
      /**
       * <code>NOVA = 34;</code>
       *
       * <pre>
       * Instore play payments
       * </pre>
       */
      public static final int NOVA_VALUE = 34;
      /**
       * <code>LB_CA = 35;</code>
       *
       * <pre>
       * Nova client logs.
       * </pre>
       */
      public static final int LB_CA_VALUE = 35;
      /**
       * <code>LATIN_IME = 36;</code>
       *
       * <pre>
       * DEPRECATED: Android contact account data going from Now to Footprints.
       * </pre>
       */
      public static final int LATIN_IME_VALUE = 36;
      /**
       * <code>NEWS_WEATHER = 38;</code>
       *
       * <pre>
       * Google Keyboard (http://go/google-keyboard)
       * </pre>
       */
      public static final int NEWS_WEATHER_VALUE = 38;
      /**
       * <code>HANGOUT = 39;</code>
       *
       * <pre>
       * News &amp; Weather Android/iOS apps
       * </pre>
       */
      public static final int HANGOUT_VALUE = 39;
      /**
       * <code>HANGOUT_LOG_REQUEST = 50;</code>
       *
       * <pre>
       * Deprecated source for HangoutLogEntry (rtc-analytics-eng@)
       * </pre>
       */
      public static final int HANGOUT_LOG_REQUEST_VALUE = 50;
      /**
       * <code>COPRESENCE = 40;</code>
       *
       * <pre>
       * Hangouts data using HangoutLogRequest (rtc-analytics-eng@)
       * </pre>
       */
      public static final int COPRESENCE_VALUE = 40;
      /**
       * <code>SOCIAL_AFFINITY = 41;</code>
       *
       * <pre>
       * Copresence (http://go/whisper)
       * </pre>
       */
      public static final int SOCIAL_AFFINITY_VALUE = 41;
      /**
       * <code>PHOTOS = 42;</code>
       *
       * <pre>
       * Social Affinity logs (go/disco-logging-v2).
       * </pre>
       */
      public static final int PHOTOS_VALUE = 42;
      /**
       * <code>GCM = 43;</code>
       *
       * <pre>
       * Google Photos (go/photos).
       * </pre>
       */
      public static final int GCM_VALUE = 43;
      /**
       * <code>GOKART = 44;</code>
       *
       * <pre>
       * Google Cloud Messaging logs (go/gcm).
       * </pre>
       */
      public static final int GOKART_VALUE = 44;
      /**
       * <code>FINDR = 45;</code>
       *
       * <pre>
       * GoKart (go/gokart, Drive Android API)
       * </pre>
       */
      public static final int FINDR_VALUE = 45;
      /**
       * <code>ANDROID_MESSAGING = 46;</code>
       *
       * <pre>
       * Findr app (go/findr).
       * </pre>
       */
      public static final int ANDROID_MESSAGING_VALUE = 46;
      /**
       * <code>SOCIAL_WEB = 47;</code>
       *
       * <pre>
       * Android messenger(Bugle).
       * </pre>
       */
      public static final int SOCIAL_WEB_VALUE = 47;
      /**
       * <code>BACKDROP = 48;</code>
       *
       * <pre>
       * Traffic from Social clients: gplus-log-quality@.
       * </pre>
       */
      public static final int BACKDROP_VALUE = 48;
      /**
       * <code>TELEMATICS = 49;</code>
       *
       * <pre>
       * Backdrop device logs (go/tv-imax).
       * </pre>
       */
      public static final int TELEMATICS_VALUE = 49;
      /**
       * <code>GVC_HARVESTER = 51;</code>
       *
       * <pre>
       * Telematics app (go/telematics).
       * </pre>
       */
      public static final int GVC_HARVESTER_VALUE = 51;
      /**
       * <code>CAR = 53;</code>
       *
       * <pre>
       * GVC Harvester (go/harvesterdesigndoc)
       * </pre>
       */
      public static final int CAR_VALUE = 53;
      /**
       * <code>PIXEL_PERFECT = 54;</code>
       *
       * <pre>
       * Android Automotive (go/gearhead).
       * </pre>
       */
      public static final int PIXEL_PERFECT_VALUE = 54;
      /**
       * <code>DRIVE = 55;</code>
       *
       * <pre>
       * PixelPerfect app client log (go/pixelperfect-analytics)
       * </pre>
       */
      public static final int DRIVE_VALUE = 55;
      /**
       * <code>DOCS = 56;</code>
       *
       * <pre>
       * Google Drive (go/cakemix, nickread@, cakemix-drive@)
       * </pre>
       */
      public static final int DOCS_VALUE = 56;
      /**
       * <code>SHEETS = 57;</code>
       *
       * <pre>
       * Google Docs (go/cakemix, haluk@, bulach@, tstrauss@)
       * </pre>
       */
      public static final int SHEETS_VALUE = 57;
      /**
       * <code>SLIDES = 58;</code>
       *
       * <pre>
       * Google Sheets (go/cakemix, tgleason@, bulach@, tstrauss@)
       * </pre>
       */
      public static final int SLIDES_VALUE = 58;
      /**
       * <code>IME = 59;</code>
       *
       * <pre>
       * Google Slides (go/cakemix, yugacohler@, bulach@, tstrauss@)
       * </pre>
       */
      public static final int IME_VALUE = 59;
      /**
       * <code>WARP = 60;</code>
       *
       * <pre>
       * Google Android IME logs (go/goopy).
       * </pre>
       */
      public static final int WARP_VALUE = 60;
      /**
       * <code>NFC_PROGRAMMER = 61;</code>
       *
       * <pre>
       * Warp (go/warp-project)
       * </pre>
       */
      public static final int NFC_PROGRAMMER_VALUE = 61;
      /**
       * <code>NETSTATS = 62;</code>
       *
       * <pre>
       * NfcProgrammer (go/aedu-platform-overview)
       * </pre>
       */
      public static final int NETSTATS_VALUE = 62;
      /**
       * <code>NEWSSTAND = 63;</code>
       *
       * <pre>
       * Collection of Network Statistics (go/n-s).
       * </pre>
       */
      public static final int NEWSSTAND_VALUE = 63;
      /**
       * <code>KIDS_COMMUNICATOR = 64;</code>
       *
       * <pre>
       * Google Play Newsstand.
       * </pre>
       */
      public static final int KIDS_COMMUNICATOR_VALUE = 64;
      /**
       * <code>WIFI_ASSISTANT = 66;</code>
       *
       * <pre>
       * Kids Communicator (http://goto/kidscommunicator_dd)
       * </pre>
       */
      public static final int WIFI_ASSISTANT_VALUE = 66;
      /**
       * <code>CAST_SENDER_SDK = 67;</code>
       *
       * <pre>
       * WiFi Assistant client logs.
       * </pre>
       */
      public static final int CAST_SENDER_SDK_VALUE = 67;
      /**
       * <code>CRONET_SOCIAL = 68;</code>
       *
       * <pre>
       * Cast Sender SDK (go/dongle)
       * </pre>
       */
      public static final int CRONET_SOCIAL_VALUE = 68;
      /**
       * <code>PHENOTYPE = 69;</code>
       *
       * <pre>
       * Social cronet metrics.
       * </pre>
       */
      public static final int PHENOTYPE_VALUE = 69;
      /**
       * <code>PHENOTYPE_COUNTERS = 70;</code>
       *
       * <pre>
       * The client side of experiment framework (go/ph, peiling@, phenotype-eng@).
       * </pre>
       */
      public static final int PHENOTYPE_COUNTERS_VALUE = 70;
      /**
       * <code>CHROME_INFRA = 71;</code>
       *
       * <pre>
       * The counters for Phenotype (go/ph, peiling@, phenotype-eng@).
       * </pre>
       */
      public static final int CHROME_INFRA_VALUE = 71;
      /**
       * <code>JUSTSPEAK = 72;</code>
       *
       * <pre>
       * Chrome Infrastructure events
       * </pre>
       */
      public static final int JUSTSPEAK_VALUE = 72;
      /**
       * <code>PERF_PROFILE = 73;</code>
       *
       * <pre>
       * JustSpeak (go/justspeak)
       * </pre>
       */
      public static final int PERF_PROFILE_VALUE = 73;
      /**
       * <code>KATNISS = 75;</code>
       *
       * <pre>
       * Android Wide Profiling (go/android-wide-profiling)
       * </pre>
       */
      public static final int KATNISS_VALUE = 75;
      /**
       * <code>SOCIAL_APPINVITE = 76;</code>
       *
       * <pre>
       * Android TV search (go/atv-search)
       * </pre>
       */
      public static final int SOCIAL_APPINVITE_VALUE = 76;
      /**
       * <code>GMM_COUNTERS = 77;</code>
       *
       * <pre>
       * Google Plus Platform App Invite (go/appinvite)
       * </pre>
       */
      public static final int GMM_COUNTERS_VALUE = 77;
      /**
       * <code>BOND_ONEGOOGLE = 78;</code>
       *
       * <pre>
       * Google Maps Mobile (go/gmm).
       * </pre>
       */
      public static final int BOND_ONEGOOGLE_VALUE = 78;
      /**
       * <code>MAPS_API = 79;</code>
       *
       * <pre>
       * Bond OneGoogleBar integration (go/bond-ogb)
       * </pre>
       */
      public static final int MAPS_API_VALUE = 79;
      /**
       * <code>CRONET_ANDROID_YT = 196;</code>
       *
       * <pre>
       * Android and iOS Maps API (go/mapview &amp; go/meridian)
       * </pre>
       */
      public static final int CRONET_ANDROID_YT_VALUE = 196;
      /**
       * <code>CRONET_ANDROID_GSA = 80;</code>
       *
       * <pre>
       * Cronet UMA logs from Android YT (go/cronet-uma)
       * </pre>
       */
      public static final int CRONET_ANDROID_GSA_VALUE = 80;
      /**
       * <code>GOOGLE_FIT_WEARABLE = 81;</code>
       *
       * <pre>
       * Cronet UMA logs from Android GSA (go/cronet-uma)
       * </pre>
       */
      public static final int GOOGLE_FIT_WEARABLE_VALUE = 81;
      /**
       * <code>FITNESS_ANDROID = 169;</code>
       *
       * <pre>
       * Google Fit Wearable App (go/heart)
       * </pre>
       */
      public static final int FITNESS_ANDROID_VALUE = 169;
      /**
       * <code>FITNESS_GMS_CORE = 170;</code>
       *
       * <pre>
       * Google Fit Android App (go/heart)
       * </pre>
       */
      public static final int FITNESS_GMS_CORE_VALUE = 170;
      /**
       * <code>GOOGLE_EXPRESS = 82;</code>
       *
       * <pre>
       * Google Fit GMSCore (go/heart)
       * </pre>
       */
      public static final int GOOGLE_EXPRESS_VALUE = 82;
      /**
       * <code>GOOGLE_EXPRESS_DEV = 215;</code>
       *
       * <pre>
       * Google Express (go/gsx)
       * </pre>
       */
      public static final int GOOGLE_EXPRESS_DEV_VALUE = 215;
      /**
       * <code>GOOGLE_EXPRESS_COURIER_ANDROID_PRIMES = 228;</code>
       *
       * <pre>
       * Google Express (go/gsx) For DEV mall server
       * </pre>
       */
      public static final int GOOGLE_EXPRESS_COURIER_ANDROID_PRIMES_VALUE = 228;
      /**
       * <code>GOOGLE_EXPRESS_ANDROID_PRIMES = 229;</code>
       *
       * <pre>
       * Google Express (go/gsx) Courier App metric logging (go/primes)
       * </pre>
       */
      public static final int GOOGLE_EXPRESS_ANDROID_PRIMES_VALUE = 229;
      /**
       * <code>GOOGLE_EXPRESS_STOREOMS_ANDROID_PRIMES = 240;</code>
       *
       * <pre>
       * Google Express (go/gsx) App metric logging (go/primes)
       * </pre>
       */
      public static final int GOOGLE_EXPRESS_STOREOMS_ANDROID_PRIMES_VALUE = 240;
      /**
       * <code>SENSE = 83;</code>
       *
       * <pre>
       * Google Express (go/gsx) Store OMS App metric logging (go/primes)
       * </pre>
       */
      public static final int SENSE_VALUE = 83;
      /**
       * <code>ANDROID_BACKUP = 84;</code>
       *
       * <pre>
       * Sense (go/sense)
       * </pre>
       */
      public static final int ANDROID_BACKUP_VALUE = 84;
      /**
       * <code>VR = 85;</code>
       *
       * <pre>
       * Android Backup Service.
       * </pre>
       */
      public static final int VR_VALUE = 85;
      /**
       * <code>IME_COUNTERS = 86;</code>
       *
       * <pre>
       * Virtual Reality and Google Cardboard (go/vr-team)
       * </pre>
       */
      public static final int IME_COUNTERS_VALUE = 86;
      /**
       * <code>SETUP_WIZARD = 87;</code>
       *
       * <pre>
       * The counters for Google Android IME (go/goopy).
       * </pre>
       */
      public static final int SETUP_WIZARD_VALUE = 87;
      /**
       * <code>EMERGENCY_ASSIST = 88;</code>
       *
       * <pre>
       * Setup Wizard (go/suw)
       * </pre>
       */
      public static final int EMERGENCY_ASSIST_VALUE = 88;
      /**
       * <code>TRON = 89;</code>
       *
       * <pre>
       * Barton (go/barton-deprecation)
       * </pre>
       */
      public static final int TRON_VALUE = 89;
      /**
       * <code>TRON_COUNTERS = 90;</code>
       *
       * <pre>
       * The event logs for Android Framework (go/tron, cwren@, khigaki@, tron-eng@).
       * </pre>
       */
      public static final int TRON_COUNTERS_VALUE = 90;
      /**
       * <code>BATTERY_STATS = 91;</code>
       *
       * <pre>
       * The counters for Android Framework (go/tron, cwren@, khigaki@, tron-eng@).
       * </pre>
       */
      public static final int BATTERY_STATS_VALUE = 91;
      /**
       * <code>DISK_STATS = 92;</code>
       *
       * <pre>
       * For collecting battery performance data from Android clients. (go/androidplatformstats, belland@, clearcut-eng@)
       * </pre>
       */
      public static final int DISK_STATS_VALUE = 92;
      /**
       * <code>GRAPHICS_STATS = 107;</code>
       *
       * <pre>
       * For collecting disk utilization stats from Android clients. (go/androidplatformstats, belland@, clearcut-eng@)
       * </pre>
       */
      public static final int GRAPHICS_STATS_VALUE = 107;
      /**
       * <code>PROC_STATS = 93;</code>
       *
       * <pre>
       * For collecting rendering performance stats from Android clients. (go/androidplatformstats, belland@, clearcut-eng@)
       * </pre>
       */
      public static final int PROC_STATS_VALUE = 93;
      /**
       * <code>DROP_BOX = 131;</code>
       *
       * <pre>
       * For collecting memory utilization stats from Android clients. (go/androidplatformstats, belland@, clearcut-eng@)
       * </pre>
       */
      public static final int DROP_BOX_VALUE = 131;
      /**
       * <code>FINGERPRINT_STATS = 181;</code>
       *
       * <pre>
       * For collecting DropBox logs from Android clients.
       * </pre>
       */
      public static final int FINGERPRINT_STATS_VALUE = 181;
      /**
       * <code>NOTIFICATION_STATS = 182;</code>
       *
       * <pre>
       * For collecting fingerprint stats from Android clients. (go/android-fingerprintstats)
       * </pre>
       */
      public static final int NOTIFICATION_STATS_VALUE = 182;
      /**
       * <code>TAP_AND_PAY_GCORE = 94;</code>
       *
       * <pre>
       * For collecting notification stats from Android clients. (go/android-notificationstats)
       * </pre>
       */
      public static final int TAP_AND_PAY_GCORE_VALUE = 94;
      /**
       * <code>A11YLOGGER = 95;</code>
       *
       * <pre>
       * Tap and Pay client service layer (go/tp2-eng)
       * </pre>
       */
      public static final int A11YLOGGER_VALUE = 95;
      /**
       * <code>GCM_COUNTERS = 96;</code>
       *
       * <pre>
       * Accessibility Settings Logger (go/a11ylogger)
       * </pre>
       */
      public static final int GCM_COUNTERS_VALUE = 96;
      /**
       * <code>PLACES_NO_GLS_CONSENT = 97;</code>
       *
       * <pre>
       * Google Cloud Messaging counters (go/gcm).
       * </pre>
       */
      public static final int PLACES_NO_GLS_CONSENT_VALUE = 97;
      /**
       * <code>TACHYON_LOG_REQUEST = 98;</code>
       *
       * <pre>
       * Mobile Places API logs without GLS consent (go/ios-places-api).
       * </pre>
       */
      public static final int TACHYON_LOG_REQUEST_VALUE = 98;
      /**
       * <code>TACHYON_COUNTERS = 99;</code>
       *
       * <pre>
       * WebRTC Tachyon (go/tachyon)
       * </pre>
       */
      public static final int TACHYON_COUNTERS_VALUE = 99;
      /**
       * <code>VISION = 100;</code>
       *
       * <pre>
       * WebRTC Tachyon (go/tachyon)
       * </pre>
       */
      public static final int VISION_VALUE = 100;
      /**
       * <code>SOCIAL_USER_LOCATION = 101;</code>
       *
       * <pre>
       * Vision (go/mobile-vision)
       * </pre>
       */
      public static final int SOCIAL_USER_LOCATION_VALUE = 101;
      /**
       * <code>LAUNCHPAD_TOYS = 102;</code>
       *
       * <pre>
       * Location Sharing (go/location-sharing)
       * </pre>
       */
      public static final int LAUNCHPAD_TOYS_VALUE = 102;
      /**
       * <code>METALOG_COUNTERS = 103;</code>
       *
       * <pre>
       * Launchpad Toys (go/launchpadtoys)
       * </pre>
       */
      public static final int METALOG_COUNTERS_VALUE = 103;
      /**
       * <code>MOBILESDK_CLIENT = 104;</code>
       *
       * <pre>
       * Counters for metalog (go/clearcut-metalog, iamawong@, clearcut-eng@)
       * </pre>
       */
      public static final int MOBILESDK_CLIENT_VALUE = 104;
      /**
       * <code>ANDROID_VERIFY_APPS = 105;</code>
       *
       * <pre>
       * go/greenhouse
       * </pre>
       */
      public static final int ANDROID_VERIFY_APPS_VALUE = 105;
      /**
       * <code>ADSHIELD = 106;</code>
       *
       * <pre>
       * go/safety-net
       * </pre>
       */
      public static final int ADSHIELD_VALUE = 106;
      /**
       * <code>SHERLOG = 108;</code>
       *
       * <pre>
       * go/adshield
       * </pre>
       */
      public static final int SHERLOG_VALUE = 108;
      /**
       * <code>LE_ULR_COUNTERS = 109;</code>
       *
       * <pre>
       * Sherlog data (go/sherlog)
       * </pre>
       */
      public static final int LE_ULR_COUNTERS_VALUE = 109;
      /**
       * <code>GMM_UE3 = 110;</code>
       *
       * <pre>
       * Counters for ULR (go/gcore-ulr). Location custom events use LE.
       * </pre>
       */
      public static final int GMM_UE3_VALUE = 110;
      /**
       * <code>CALENDAR = 111;</code>
       *
       * <pre>
       * Logs for GMM analytics and sessions (go/gca-analytics)
       * </pre>
       */
      public static final int CALENDAR_VALUE = 111;
      /**
       * <code>ENDER = 112;</code>
       *
       * <pre>
       * Google Android Calendar
       * </pre>
       */
      public static final int ENDER_VALUE = 112;
      /**
       * <code>FAMILY_COMPASS = 113;</code>
       *
       * <pre>
       * Logs for Ender (go/ender)
       * </pre>
       */
      public static final int FAMILY_COMPASS_VALUE = 113;
      /**
       * <code>TRANSOM = 114;</code>
       *
       * <pre>
       * go/familycompass
       * </pre>
       */
      public static final int TRANSOM_VALUE = 114;
      /**
       * <code>TRANSOM_COUNTERS = 115;</code>
       *
       * <pre>
       * Transom client-side metrics (go/transom)
       * </pre>
       */
      public static final int TRANSOM_COUNTERS_VALUE = 115;
      /**
       * <code>LB_AS = 116;</code>
       *
       * <pre>
       * Counters for transom metrics
       * </pre>
       */
      public static final int LB_AS_VALUE = 116;
      /**
       * <code>LB_CFG = 117;</code>
       *
       * <pre>
       * App usage collected by the new UsageStats API (Lockbox project).
       * </pre>
       */
      public static final int LB_CFG_VALUE = 117;
      /**
       * <code>IOS_GSA = 118;</code>
       *
       * <pre>
       * Device config collected by the new UsageStats API (Lockbox project).
       * </pre>
       */
      public static final int IOS_GSA_VALUE = 118;
      /**
       * <code>TAP_AND_PAY_APP = 119;</code>
       *
       * <pre>
       * iOS GSA (Google Search App) stats
       * </pre>
       */
      public static final int TAP_AND_PAY_APP_VALUE = 119;
      /**
       * <code>TAP_AND_PAY_APP_COUNTERS = 265;</code>
       *
       * <pre>
       * Tap and Pay android app, aka Android pay app (go/tp2)
       * </pre>
       */
      public static final int TAP_AND_PAY_APP_COUNTERS_VALUE = 265;
      /**
       * <code>FLYDROID = 120;</code>
       *
       * <pre>
       * Tap and Pay android app counters
       * </pre>
       */
      public static final int FLYDROID_VALUE = 120;
      /**
       * <code>CPANEL_APP = 121;</code>
       *
       * <pre>
       * Logs for Flydroid (go/flydroid).
       * </pre>
       */
      public static final int CPANEL_APP_VALUE = 121;
      /**
       * <code>ANDROID_SNET_GCORE = 122;</code>
       *
       * <pre>
       * CPanel latency on mobile.
       * </pre>
       */
      public static final int ANDROID_SNET_GCORE_VALUE = 122;
      /**
       * <code>ANDROID_SNET_IDLE = 123;</code>
       *
       * <pre>
       * go/safety-net
       * </pre>
       */
      public static final int ANDROID_SNET_IDLE_VALUE = 123;
      /**
       * <code>ANDROID_SNET_JAR = 124;</code>
       *
       * <pre>
       * go/safety-net
       * </pre>
       */
      public static final int ANDROID_SNET_JAR_VALUE = 124;
      /**
       * <code>CONTEXT_MANAGER = 125;</code>
       *
       * <pre>
       * go/safety-net
       * </pre>
       */
      public static final int CONTEXT_MANAGER_VALUE = 125;
      /**
       * <code>CLASSROOM = 126;</code>
       *
       * <pre>
       * Logs for Context Manager (go/context-manager)
       * </pre>
       */
      public static final int CLASSROOM_VALUE = 126;
      /**
       * <code>TAILORMADE = 127;</code>
       *
       * <pre>
       * App usage of the go/classroom app.
       * </pre>
       */
      public static final int TAILORMADE_VALUE = 127;
      /**
       * <code>KEEP = 128;</code>
       *
       * <pre>
       * Logs for Tailormade app (go/a1-tm)
       * </pre>
       */
      public static final int KEEP_VALUE = 128;
      /**
       * <code>GMM_BRIIM_COUNTERS = 129;</code>
       *
       * <pre>
       * Logs for Keep (go/keep).
       * </pre>
       */
      public static final int GMM_BRIIM_COUNTERS_VALUE = 129;
      /**
       * <code>CHROMECAST_APP_LOG = 130;</code>
       *
       * <pre>
       * GMM BRIIM counters (go/gmm-briim)
       * </pre>
       */
      public static final int CHROMECAST_APP_LOG_VALUE = 130;
      /**
       * <code>ADWORDS_MOBILE = 133;</code>
       *
       * <pre>
       * Logs for chromecast app (go/chromecastapplogs)
       * </pre>
       */
      public static final int ADWORDS_MOBILE_VALUE = 133;
      /**
       * <code>LEANBACK_EVENT = 134;</code>
       *
       * <pre>
       * Logs for AdWords mobile app (go/awm)
       * </pre>
       */
      public static final int LEANBACK_EVENT_VALUE = 134;
      /**
       * <code>ANDROID_GMAIL = 135;</code>
       *
       * <pre>
       * Logs for Android TV Leanback Launcher (go/android-tv)
       * </pre>
       */
      public static final int ANDROID_GMAIL_VALUE = 135;
      /**
       * <code>SAMPLE_SHM = 136;</code>
       *
       * <pre>
       * Logs for Gmail (go/android-gmail-clearcut, shahrk@, android-mail-team@)
       * </pre>
       */
      public static final int SAMPLE_SHM_VALUE = 136;
      /**
       * <code>GPLUS_ANDROID_PRIMES = 140;</code>
       *
       * <pre>
       * Logs for system health metric and memory metric sample app (go/primes)
       * </pre>
       */
      public static final int GPLUS_ANDROID_PRIMES_VALUE = 140;
      /**
       * <code>GPLUS_ANDROID_SYSTEM_HEALTH = 140;</code>
       *
       * <pre>
       * Logs for system health metric for Gplus (go/primes)
       * </pre>
       */
      public static final int GPLUS_ANDROID_SYSTEM_HEALTH_VALUE = 140;
      /**
       * <code>GMAIL_ANDROID_PRIMES = 150;</code>
       */
      public static final int GMAIL_ANDROID_PRIMES_VALUE = 150;
      /**
       * <code>GMAIL_ANDROID_SYSTEM_HEALTH = 150;</code>
       *
       * <pre>
       * Logs for system health metric for GMail (go/primes)
       * </pre>
       */
      public static final int GMAIL_ANDROID_SYSTEM_HEALTH_VALUE = 150;
      /**
       * <code>CALENDAR_ANDROID_PRIMES = 151;</code>
       */
      public static final int CALENDAR_ANDROID_PRIMES_VALUE = 151;
      /**
       * <code>CALENDAR_ANDROID_SYSTEM_HEALTH = 151;</code>
       *
       * <pre>
       * Logs for system health metric for Calendar (go/primes)
       * </pre>
       */
      public static final int CALENDAR_ANDROID_SYSTEM_HEALTH_VALUE = 151;
      /**
       * <code>DOCS_ANDROID_PRIMES = 152;</code>
       */
      public static final int DOCS_ANDROID_PRIMES_VALUE = 152;
      /**
       * <code>DOCS_ANDROID_SYSTEM_HEALTH = 152;</code>
       *
       * <pre>
       * Logs for system health metric for Docs (go/primes)
       * </pre>
       */
      public static final int DOCS_ANDROID_SYSTEM_HEALTH_VALUE = 152;
      /**
       * <code>YT_MAIN_APP_ANDROID_PRIMES = 154;</code>
       */
      public static final int YT_MAIN_APP_ANDROID_PRIMES_VALUE = 154;
      /**
       * <code>YT_KIDS_ANDROID_PRIMES = 155;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube main app (go/primes)
       * </pre>
       */
      public static final int YT_KIDS_ANDROID_PRIMES_VALUE = 155;
      /**
       * <code>YT_GAMING_ANDROID_PRIMES = 156;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube kids app (go/primes)
       * </pre>
       */
      public static final int YT_GAMING_ANDROID_PRIMES_VALUE = 156;
      /**
       * <code>YT_MUSIC_ANDROID_PRIMES = 157;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube gaming app (go/primes)
       * </pre>
       */
      public static final int YT_MUSIC_ANDROID_PRIMES_VALUE = 157;
      /**
       * <code>YT_LITE_ANDROID_PRIMES = 158;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube music app (go/primes)
       * </pre>
       */
      public static final int YT_LITE_ANDROID_PRIMES_VALUE = 158;
      /**
       * <code>YT_CREATOR_ANDROID_PRIMES = 171;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube lite app (go/primes)
       * </pre>
       */
      public static final int YT_CREATOR_ANDROID_PRIMES_VALUE = 171;
      /**
       * <code>JAM_ANDROID_PRIMES = 159;</code>
       *
       * <pre>
       * Logs for system health metric for the YouTube Creator Studio app (go/primes)
       * </pre>
       */
      public static final int JAM_ANDROID_PRIMES_VALUE = 159;
      /**
       * <code>JAM_KIOSK_ANDROID_PRIMES = 160;</code>
       *
       * <pre>
       * Logs for system health metric for Jam (go/jam, go/primes)
       * </pre>
       */
      public static final int JAM_KIOSK_ANDROID_PRIMES_VALUE = 160;
      /**
       * <code>PHOTOS_ANDROID_PRIMES = 165;</code>
       *
       * <pre>
       * Logs for system health metric for Jam Kiosk (go/jam, go/primes)
       * </pre>
       */
      public static final int PHOTOS_ANDROID_PRIMES_VALUE = 165;
      /**
       * <code>DRIVE_ANDROID_PRIMES = 166;</code>
       *
       * <pre>
       * Logs for system health metric for Photos (go/primes)
       * </pre>
       */
      public static final int DRIVE_ANDROID_PRIMES_VALUE = 166;
      /**
       * <code>SHEETS_ANDROID_PRIMES = 167;</code>
       *
       * <pre>
       * Logs for system health metric for Drive (go/primes)
       * </pre>
       */
      public static final int SHEETS_ANDROID_PRIMES_VALUE = 167;
      /**
       * <code>SLIDES_ANDROID_PRIMES = 168;</code>
       *
       * <pre>
       * Logs for system health metric for Sheets (go/primes)
       * </pre>
       */
      public static final int SLIDES_ANDROID_PRIMES_VALUE = 168;
      /**
       * <code>SNAPSEED_ANDROID_PRIMES = 178;</code>
       *
       * <pre>
       * Logs for system health metric for Slides (go/primes)
       * </pre>
       */
      public static final int SNAPSEED_ANDROID_PRIMES_VALUE = 178;
      /**
       * <code>HANGOUTS_ANDROID_PRIMES = 179;</code>
       *
       * <pre>
       * Logs for system health metric for Snapseed (go/primes, go/snapseed).
       * </pre>
       */
      public static final int HANGOUTS_ANDROID_PRIMES_VALUE = 179;
      /**
       * <code>INBOX_ANDROID_PRIMES = 180;</code>
       *
       * <pre>
       * Logs for system health metric for Shem (go/primes, go/rtc-shem).
       * </pre>
       */
      public static final int INBOX_ANDROID_PRIMES_VALUE = 180;
      /**
       * <code>INBOX_IOS_PRIMES = 262;</code>
       *
       * <pre>
       * Logs for system health metric for Inbox (go/primes, go/bt-speed)
       * </pre>
       */
      public static final int INBOX_IOS_PRIMES_VALUE = 262;
      /**
       * <code>SDP_IOS_PRIMES = 287;</code>
       *
       * <pre>
       * Logs for ios system health metric for Inbox (go/primes-ios, go/bt-speed)
       * </pre>
       */
      public static final int SDP_IOS_PRIMES_VALUE = 287;
      /**
       * <code>GMSCORE_ANDROID_PRIMES = 193;</code>
       *
       * <pre>
       * Logs for ios system health metric for sdp (go/primes-ios, go/bt-speed)
       * </pre>
       */
      public static final int GMSCORE_ANDROID_PRIMES_VALUE = 193;
      /**
       * <code>PLAY_MUSIC_ANDROID_WEAR_PRIMES = 200;</code>
       *
       * <pre>
       * Logs for system health metric for GmsCore (go/primes)
       * </pre>
       */
      public static final int PLAY_MUSIC_ANDROID_WEAR_PRIMES_VALUE = 200;
      /**
       * <code>GEARHEAD_ANDROID_PRIMES = 201;</code>
       *
       * <pre>
       * Logs for system health metric for Play Music for Android Wear (music-android-wear@, go/wear-play-music, go/primes)
       * </pre>
       */
      public static final int GEARHEAD_ANDROID_PRIMES_VALUE = 201;
      /**
       * <code>INSTORE_CONSUMER_PRIMES = 207;</code>
       *
       * <pre>
       * Logs for system health metric for the Android Auto (GearHead) app (go/primes, go/gearhead)
       * </pre>
       */
      public static final int INSTORE_CONSUMER_PRIMES_VALUE = 207;
      /**
       * <code>SAMPLE_IOS_PRIMES = 202;</code>
       *
       * <pre>
       * Logs for system health metric for Hands Free (go/primes, go/instore-wallet)
       * </pre>
       */
      public static final int SAMPLE_IOS_PRIMES_VALUE = 202;
      /**
       * <code>CPANEL_ANDROID_PRIMES = 213;</code>
       *
       * <pre>
       * Logs for ios system health metric and memory metric sample app (go/primes-ios)
       * </pre>
       */
      public static final int CPANEL_ANDROID_PRIMES_VALUE = 213;
      /**
       * <code>HUDDLE_ANDROID_PRIMES = 214;</code>
       *
       * <pre>
       * Logs for android system health metric (go/cpanel-mobile)
       * </pre>
       */
      public static final int HUDDLE_ANDROID_PRIMES_VALUE = 214;
      /**
       * <code>AWX_ANDROID_PRIMES = 222;</code>
       *
       * <pre>
       * Primes for Huddle (go/huddle)
       * </pre>
       */
      public static final int AWX_ANDROID_PRIMES_VALUE = 222;
      /**
       * <code>GHS_ANDROID_PRIMES = 223;</code>
       *
       * <pre>
       * Primes for Google AdWords Express android app (go/primes, go/awx-android)
       * </pre>
       */
      public static final int GHS_ANDROID_PRIMES_VALUE = 223;
      /**
       * <code>ADWORDS_MOBILE_ANDROID_PRIMES = 224;</code>
       *
       * <pre>
       * Primes for Google Home Services android app (go/primes, go/sab-awx-android)
       * </pre>
       */
      public static final int ADWORDS_MOBILE_ANDROID_PRIMES_VALUE = 224;
      /**
       * <code>TAP_AND_PAY_ANDROID_PRIMES = 227;</code>
       *
       * <pre>
       * AdWords system health (go/awm, go/primes)
       * </pre>
       */
      public static final int TAP_AND_PAY_ANDROID_PRIMES_VALUE = 227;
      /**
       * <code>WALLET_APP_ANDROID_PRIMES = 232;</code>
       *
       * <pre>
       * Primes for Tap and Pay android app, aka Android pay app (go/tp2)
       * </pre>
       */
      public static final int WALLET_APP_ANDROID_PRIMES_VALUE = 232;
      /**
       * <code>WALLET_APP_IOS_PRIMES = 233;</code>
       *
       * <pre>
       * Primes for Wallet android app (go/gmoney)
       * </pre>
       */
      public static final int WALLET_APP_IOS_PRIMES_VALUE = 233;
      /**
       * <code>ANALYTICS_ANDROID_PRIMES = 235;</code>
       *
       * <pre>
       * Primes for Wallet iOS app (go/gmoney)
       * </pre>
       */
      public static final int ANALYTICS_ANDROID_PRIMES_VALUE = 235;
      /**
       * <code>SPACES_ANDROID_PRIMES = 236;</code>
       *
       * <pre>
       * Logs for system health metric for Analytics Android app (go/primes)
       * </pre>
       */
      public static final int SPACES_ANDROID_PRIMES_VALUE = 236;
      /**
       * <code>SPACES_IOS_PRIMES = 276;</code>
       *
       * <pre>
       * Logs for the Spaces Android App (go/spaces)
       * </pre>
       */
      public static final int SPACES_IOS_PRIMES_VALUE = 276;
      /**
       * <code>SOCIETY_ANDROID_PRIMES = 238;</code>
       *
       * <pre>
       * Logs for the Spaces iOS App (go/spaces)
       * </pre>
       */
      public static final int SOCIETY_ANDROID_PRIMES_VALUE = 238;
      /**
       * <code>GMM_BRIIM_PRIMES = 239;</code>
       *
       * <pre>
       * Logs for system health metric for Society (go/primes, go/society)
       * </pre>
       */
      public static final int GMM_BRIIM_PRIMES_VALUE = 239;
      /**
       * <code>CW_PRIMES = 242;</code>
       *
       * <pre>
       * Logs for system health metric for GMM BRIIM (go/gmm-briim)
       * </pre>
       */
      public static final int CW_PRIMES_VALUE = 242;
      /**
       * <code>FAMILYLINK_ANDROID_PRIMES = 244;</code>
       *
       * <pre>
       * Clockwork go/primes logs
       * </pre>
       */
      public static final int FAMILYLINK_ANDROID_PRIMES_VALUE = 244;
      /**
       * <code>FAMILYLINK_IOS_PRIMES = 291;</code>
       *
       * <pre>
       * Logs for system health metric for FamilyLink (go/primes)
       * </pre>
       */
      public static final int FAMILYLINK_IOS_PRIMES_VALUE = 291;
      /**
       * <code>WH_PRIMES = 248;</code>
       *
       * <pre>
       * Logs for ios system health metric for FamilyLink (go/primes-ios, go/familylink-ios-app)
       * </pre>
       */
      public static final int WH_PRIMES_VALUE = 248;
      /**
       * <code>NOVA_ANDROID_PRIMES = 249;</code>
       *
       * <pre>
       * Primes for Westinghouse (go/westinghouse, go/primes)
       * </pre>
       */
      public static final int NOVA_ANDROID_PRIMES_VALUE = 249;
      /**
       * <code>PHOTOS_DRAPER_ANDROID_PRIMES = 253;</code>
       *
       * <pre>
       * Nova client app system health metrics (go/primes)
       * </pre>
       */
      public static final int PHOTOS_DRAPER_ANDROID_PRIMES_VALUE = 253;
      /**
       * <code>GMM_PRIMES = 254;</code>
       *
       * <pre>
       * Logs for system health metric for Photos Draper (go/primes, go/photos-draper)
       * </pre>
       */
      public static final int GMM_PRIMES_VALUE = 254;
      /**
       * <code>TRANSLATE_ANDROID_PRIMES = 255;</code>
       *
       * <pre>
       * Logs for system health metric for aGMM (go/gmm)
       * </pre>
       */
      public static final int TRANSLATE_ANDROID_PRIMES_VALUE = 255;
      /**
       * <code>TRANSLATE_IOS_PRIMES = 256;</code>
       *
       * <pre>
       * Logs for system health metric for Translate on Android (go/primes)
       * </pre>
       */
      public static final int TRANSLATE_IOS_PRIMES_VALUE = 256;
      /**
       * <code>FLYDROID_ANDROID_PRIMES = 259;</code>
       *
       * <pre>
       * Logs for system health metric for Translate on iOS (go/primes)
       * </pre>
       */
      public static final int FLYDROID_ANDROID_PRIMES_VALUE = 259;
      /**
       * <code>CONSUMERIQ_PRIMES = 260;</code>
       *
       * <pre>
       * Log for system health metric for Freighter (go/freighter)
       * </pre>
       */
      public static final int CONSUMERIQ_PRIMES_VALUE = 260;
      /**
       * <code>GMB_ANDROID_PRIMES = 263;</code>
       *
       * <pre>
       * Log for system health metric for Consumer IQ (go/primes)
       * </pre>
       */
      public static final int GMB_ANDROID_PRIMES_VALUE = 263;
      /**
       * <code>CLOUDDPC_PRIMES = 304;</code>
       *
       * <pre>
       * Primes for Google My Business android app (go/gmb-android, go/primes).
       * </pre>
       */
      public static final int CLOUDDPC_PRIMES_VALUE = 304;
      /**
       * <code>CLOUDDPC_ARC_PRIMES = 305;</code>
       *
       * <pre>
       * Primes for CloudDpc (go/clouddpc)
       * </pre>
       */
      public static final int CLOUDDPC_ARC_PRIMES_VALUE = 305;
      /**
       * <code>ICORE = 137;</code>
       *
       * <pre>
       * Primes for CloudDpc for ARC (go/clouddpc)
       * </pre>
       */
      public static final int ICORE_VALUE = 137;
      /**
       * <code>PANCETTA_MOBILE_HOST = 138;</code>
       *
       * <pre>
       * iOS logging (go/ios-logging)
       * </pre>
       */
      public static final int PANCETTA_MOBILE_HOST_VALUE = 138;
      /**
       * <code>PANCETTA_MOBILE_HOST_COUNTERS = 139;</code>
       *
       * <pre>
       * Logs for Pancetta mobile hosts (go/pancetta)
       * </pre>
       */
      public static final int PANCETTA_MOBILE_HOST_COUNTERS_VALUE = 139;
      /**
       * <code>CROSSDEVICENOTIFICATION = 141;</code>
       *
       * <pre>
       * Counters for Pancetta mobile hosts (go/pancetta)
       * </pre>
       */
      public static final int CROSSDEVICENOTIFICATION_VALUE = 141;
      /**
       * <code>CROSSDEVICENOTIFICATION_DEV = 142;</code>
       *
       * <pre>
       * Logs for cross device notification service (go/hotpocket)
       * </pre>
       */
      public static final int CROSSDEVICENOTIFICATION_DEV_VALUE = 142;
      /**
       * <code>MAPS_API_COUNTERS = 143;</code>
       *
       * <pre>
       * Dev logs for cross device notification service (go/hotpocket)
       * </pre>
       */
      public static final int MAPS_API_COUNTERS_VALUE = 143;
      /**
       * <code>GPU = 144;</code>
       *
       * <pre>
       * Android and iOS Maps API (go/mapview &amp; go/meridian)
       * </pre>
       */
      public static final int GPU_VALUE = 144;
      /**
       * <code>ON_THE_GO = 145;</code>
       *
       * <pre>
       * Logs for Geo Photo Uploader (go/gpu-site)
       * </pre>
       */
      public static final int ON_THE_GO_VALUE = 145;
      /**
       * <code>ON_THE_GO_COUNTERS = 146;</code>
       *
       * <pre>
       * Logs for OnTheGo (go/onthego)
       * </pre>
       */
      public static final int ON_THE_GO_COUNTERS_VALUE = 146;
      /**
       * <code>GMS_CORE_PEOPLE_AUTOCOMPLETE = 147;</code>
       *
       * <pre>
       * Counters for OnTheGo (go/onthego)
       * </pre>
       */
      public static final int GMS_CORE_PEOPLE_AUTOCOMPLETE_VALUE = 147;
      /**
       * <code>FLYDROID_COUNTERS = 148;</code>
       *
       * <pre>
       * Logs for Gcore People Autocomplete (go/yenta)
       * </pre>
       */
      public static final int FLYDROID_COUNTERS_VALUE = 148;
      /**
       * <code>FIREBALL = 149;</code>
       *
       * <pre>
       * Logs for Flydroid (go/flydroid).
       * </pre>
       */
      public static final int FIREBALL_VALUE = 149;
      /**
       * <code>FIREBALL_COUNTERS = 257;</code>
       *
       * <pre>
       * Logs for Fireball (go/fireballdev)
       * </pre>
       */
      public static final int FIREBALL_COUNTERS_VALUE = 257;
      /**
       * <code>CRONET_FIREBALL = 303;</code>
       *
       * <pre>
       * Fireball counters (go/fireballdev)
       * </pre>
       */
      public static final int CRONET_FIREBALL_VALUE = 303;
      /**
       * <code>FIREBALL_PRIMES = 266;</code>
       *
       * <pre>
       * Fireball cronet (go/fireballdev)
       * </pre>
       */
      public static final int FIREBALL_PRIMES_VALUE = 266;
      /**
       * <code>FIREBALL_IOS_PRIMES = 313;</code>
       *
       * <pre>
       * Logs for system health for Fireball (go/fireball-systemhealth-plan)
       * </pre>
       */
      public static final int FIREBALL_IOS_PRIMES_VALUE = 313;
      /**
       * <code>GOOGLE_HANDWRITING_INPUT_ANDROID_PRIMES = 314;</code>
       *
       * <pre>
       * Logs for system health for Fireball iOS (go/fireball-systemhealth-plan)
       * </pre>
       */
      public static final int GOOGLE_HANDWRITING_INPUT_ANDROID_PRIMES_VALUE = 314;
      /**
       * <code>PYROCLASM = 153;</code>
       *
       * <pre>
       * Primes for Google Handwriting Input (go/hwrime)
       * </pre>
       */
      public static final int PYROCLASM_VALUE = 153;
      /**
       * <code>ANDROID_GSA_COUNTERS = 161;</code>
       *
       * <pre>
       * Logs for Pyroclasm (go/pyroclasm)
       * </pre>
       */
      public static final int ANDROID_GSA_COUNTERS_VALUE = 161;
      /**
       * <code>JAM_IMPRESSIONS = 162;</code>
       *
       * <pre>
       * Logs for AGSA counters.
       * </pre>
       */
      public static final int JAM_IMPRESSIONS_VALUE = 162;
      /**
       * <code>JAM_KIOSK_IMPRESSIONS = 163;</code>
       *
       * <pre>
       * Impressions logs for Jam (go/jam).
       * </pre>
       */
      public static final int JAM_KIOSK_IMPRESSIONS_VALUE = 163;
      /**
       * <code>PAYMENTS_OCR = 164;</code>
       *
       * <pre>
       * Impressions logs for Jam Kiosk (go/jam).
       * </pre>
       */
      public static final int PAYMENTS_OCR_VALUE = 164;
      /**
       * <code>UNICORN_FAMILY_MANAGEMENT = 172;</code>
       *
       * <pre>
       * Logs for payments ocr (go/cc-ocr-metrics).
       * </pre>
       */
      public static final int UNICORN_FAMILY_MANAGEMENT_VALUE = 172;
      /**
       * <code>AUDITOR = 173;</code>
       *
       * <pre>
       * Logs for Family management (and onboarding) go/familymanagement
       * </pre>
       */
      public static final int AUDITOR_VALUE = 173;
      /**
       * <code>NQLOOKUP = 174;</code>
       *
       * <pre>
       * Logs for Accesssibility Auditor (go/a11y-checker)
       * </pre>
       */
      public static final int NQLOOKUP_VALUE = 174;
      /**
       * <code>ANDROID_GSA_HIGH_PRIORITY_EVENTS = 175;</code>
       *
       * <pre>
       * Logs for NQLookup (go/nqlookup, contact herrevad@google.com)
       * </pre>
       */
      public static final int ANDROID_GSA_HIGH_PRIORITY_EVENTS_VALUE = 175;
      /**
       * <code>ANDROID_DIALER = 176;</code>
       *
       * <pre>
       * Logs for high priority events in AGSA (go/click-tracking-agsa).
       * </pre>
       */
      public static final int ANDROID_DIALER_VALUE = 176;
      /**
       * <code>CLEARCUT_DEMO = 177;</code>
       *
       * <pre>
       * Logs for Android Dialer (go/android-dialer)
       * </pre>
       */
      public static final int CLEARCUT_DEMO_VALUE = 177;
      /**
       * <code>APPMANAGER = 183;</code>
       *
       * <pre>
       * Logs for Clearcut's demo application
       * </pre>
       */
      public static final int APPMANAGER_VALUE = 183;
      /**
       * <code>SMARTLOCK_COUNTERS = 184;</code>
       *
       * <pre>
       * Logs for Firebase App Manager (go/appmanager)
       * </pre>
       */
      public static final int SMARTLOCK_COUNTERS_VALUE = 184;
      /**
       * <code>EXPEDITIONS_GUIDE = 185;</code>
       *
       * <pre>
       * Counters for Smart Lock (go/smartlock)
       * </pre>
       */
      public static final int EXPEDITIONS_GUIDE_VALUE = 185;
      /**
       * <code>FUSE = 186;</code>
       *
       * <pre>
       * Guide-aggregated logs for go/expeditions .
       * </pre>
       */
      public static final int FUSE_VALUE = 186;
      /**
       * <code>PIXEL_PERFECT_CLIENT_STATE_LOGGER = 187;</code>
       *
       * <pre>
       * Logs for Fuse (go/fuse).
       * </pre>
       */
      public static final int PIXEL_PERFECT_CLIENT_STATE_LOGGER_VALUE = 187;
      /**
       * <code>PLATFORM_STATS_COUNTERS = 188;</code>
       *
       * <pre>
       * Logs for PixelPerfect client app (go/pxp-client)
       * </pre>
       */
      public static final int PLATFORM_STATS_COUNTERS_VALUE = 188;
      /**
       * <code>DRIVE_VIEWER = 189;</code>
       *
       * <pre>
       * Counters for platform stats.(go/androidplatformstats, clearcut-eng@)
       * </pre>
       */
      public static final int DRIVE_VIEWER_VALUE = 189;
      /**
       * <code>PDF_VIEWER = 190;</code>
       *
       * <pre>
       * Google Drive Viewer Android and iOS apps (go/picoprojector)
       * </pre>
       */
      public static final int PDF_VIEWER_VALUE = 190;
      /**
       * <code>BIGTOP = 191;</code>
       *
       * <pre>
       * Google PDF Viewer Android app (go/picoprojector)
       * </pre>
       */
      public static final int BIGTOP_VALUE = 191;
      /**
       * <code>VOICE = 192;</code>
       *
       * <pre>
       * Logs for Bigtop (externally known as Inbox, go/bigtop).
       * </pre>
       */
      public static final int VOICE_VALUE = 192;
      /**
       * <code>MYFIBER = 194;</code>
       *
       * <pre>
       * Logs for Google Voice (go/googlevoice).
       * </pre>
       */
      public static final int MYFIBER_VALUE = 194;
      /**
       * <code>RECORDED_PAGES = 195;</code>
       *
       * <pre>
       * Logs for My Fiber mobile applications (go/myfibernative)
       * </pre>
       */
      public static final int RECORDED_PAGES_VALUE = 195;
      /**
       * <code>MOB_DOG = 197;</code>
       *
       * <pre>
       * Logs for RecordedPages (go/recorded-pages)
       * </pre>
       */
      public static final int MOB_DOG_VALUE = 197;
      /**
       * <code>WALLET_APP = 198;</code>
       *
       * <pre>
       * Logs for MobDog (go/mobdog)
       * </pre>
       */
      public static final int WALLET_APP_VALUE = 198;
      /**
       * <code>GBOARD = 199;</code>
       *
       * <pre>
       * Logs for the Wallet app (go/gmoney)
       * </pre>
       */
      public static final int GBOARD_VALUE = 199;
      /**
       * <code>CRONET_GMM = 203;</code>
       *
       * <pre>
       * Logs for GBoard (go/gboard)
       * </pre>
       */
      public static final int CRONET_GMM_VALUE = 203;
      /**
       * <code>TRUSTED_FACE = 204;</code>
       *
       * <pre>
       * Cronet UMA logs from GMM (go/cronet-uma)
       * </pre>
       */
      public static final int TRUSTED_FACE_VALUE = 204;
      /**
       * <code>MATCHSTICK = 205;</code>
       *
       * <pre>
       * Logs for Trusted Face (go/smartlock)
       * </pre>
       */
      public static final int MATCHSTICK_VALUE = 205;
      /**
       * <code>APP_CATALOG = 206;</code>
       *
       * <pre>
       * Logs for Matchstick library (go/matchstick)
       * </pre>
       */
      public static final int APP_CATALOG_VALUE = 206;
      /**
       * <code>BLUETOOTH = 208;</code>
       *
       * <pre>
       * Logs for AppCatalog aka "Get My Google Apps" (go/growth)
       * </pre>
       */
      public static final int BLUETOOTH_VALUE = 208;
      /**
       * <code>WIFI = 209;</code>
       *
       * <pre>
       * Logs for Bluetooth (go/fluoride)
       * </pre>
       */
      public static final int WIFI_VALUE = 209;
      /**
       * <code>TELECOM = 210;</code>
       *
       * <pre>
       * Logs for WiFi (go/connectivity-site)
       * </pre>
       */
      public static final int TELECOM_VALUE = 210;
      /**
       * <code>TELEPHONY = 211;</code>
       *
       * <pre>
       * Logs for Telcom (go/connectivity-site)
       * </pre>
       */
      public static final int TELEPHONY_VALUE = 211;
      /**
       * <code>IDENTITY_FRONTEND = 212;</code>
       *
       * <pre>
       * Logs for Telephony (go/connectivity-site)
       * </pre>
       */
      public static final int IDENTITY_FRONTEND_VALUE = 212;
      /**
       * <code>SESAME = 216;</code>
       *
       * <pre>
       * Logs for the Identity frontend (go/ifus-readme)
       * </pre>
       */
      public static final int SESAME_VALUE = 216;
      /**
       * <code>GOOGLE_KEYBOARD_CONTENT = 217;</code>
       *
       * <pre>
       * Logs for Sesame (go/sesame-logging)
       * </pre>
       */
      public static final int GOOGLE_KEYBOARD_CONTENT_VALUE = 217;
      /**
       * <code>MADDEN = 218;</code>
       *
       * <pre>
       * Google Keyboard's Latin IME content logs (go/google-keyboard)
       * </pre>
       */
      public static final int MADDEN_VALUE = 218;
      /**
       * <code>INK = 219;</code>
       *
       * <pre>
       * Logs for Madden (go/madden)
       * </pre>
       */
      public static final int INK_VALUE = 219;
      /**
       * <code>ANDROID_CONTACTS = 220;</code>
       *
       * <pre>
       * Logs for Ink (go/ink)
       * </pre>
       */
      public static final int ANDROID_CONTACTS_VALUE = 220;
      /**
       * <code>GOOGLE_KEYBOARD_COUNTERS = 221;</code>
       *
       * <pre>
       * Logs for Android Contacts (go/android-contacts)
       * </pre>
       */
      public static final int GOOGLE_KEYBOARD_COUNTERS_VALUE = 221;
      /**
       * <code>CLEARCUT_PROBER = 225;</code>
       *
       * <pre>
       * Google Keyboard histogram counters (go/google-keyboard)
       * </pre>
       */
      public static final int CLEARCUT_PROBER_VALUE = 225;
      /**
       * <code>PLAY_CONSOLE_APP = 226;</code>
       *
       * <pre>
       * Clearcut prober (go/clearcut-prober)
       * </pre>
       */
      public static final int PLAY_CONSOLE_APP_VALUE = 226;
      /**
       * <code>PLAY_CONSOLE_APP_PRIMES = 264;</code>
       *
       * <pre>
       * Logs for the Google Play Developer Console app
       * </pre>
       */
      public static final int PLAY_CONSOLE_APP_PRIMES_VALUE = 264;
      /**
       * <code>SPECTRUM = 230;</code>
       *
       * <pre>
       * Log for system health metrics for the Google Play Developer Console app
       * </pre>
       */
      public static final int SPECTRUM_VALUE = 230;
      /**
       * <code>SPECTRUM_COUNTERS = 231;</code>
       *
       * <pre>
       * Spectrum (go/spectrum-site)
       * </pre>
       */
      public static final int SPECTRUM_COUNTERS_VALUE = 231;
      /**
       * <code>SPECTRUM_ANDROID_PRIMES = 267;</code>
       *
       * <pre>
       * Spectrum (go/spectrum-site)
       * </pre>
       */
      public static final int SPECTRUM_ANDROID_PRIMES_VALUE = 267;
      /**
       * <code>IOS_SPOTLIGHT_SEARCH_LIBRARY = 234;</code>
       *
       * <pre>
       * Spectrum (go/spectrum-site)
       * </pre>
       */
      public static final int IOS_SPOTLIGHT_SEARCH_LIBRARY_VALUE = 234;
      /**
       * <code>BOQ_WEB = 241;</code>
       *
       * <pre>
       * Logs for the iOS Spotlight Search Library (go/tempeh-dd)
       * </pre>
       */
      public static final int BOQ_WEB_VALUE = 241;
      /**
       * <code>ORCHESTRATION_CLIENT = 245;</code>
       *
       * <pre>
       * Logs for client-side analytics of Boq Web (go/boq-web)
       * </pre>
       */
      public static final int ORCHESTRATION_CLIENT_VALUE = 245;
      /**
       * <code>ORCHESTRATION_CLIENT_DEV = 246;</code>
       *
       * <pre>
       * Orchestration client logs for prod environment (go/megalogs-design)
       * </pre>
       */
      public static final int ORCHESTRATION_CLIENT_DEV_VALUE = 246;
      /**
       * <code>GOOGLE_NOW_LAUNCHER = 247;</code>
       *
       * <pre>
       * Orchestration client logs for dev environment (go/megalogs-design)
       * </pre>
       */
      public static final int GOOGLE_NOW_LAUNCHER_VALUE = 247;
      /**
       * <code>SCOOBY_SPAM_REPORT_LOG = 250;</code>
       *
       * <pre>
       * Logs for Google Now Launcher (go/gnl-logging)
       * </pre>
       */
      public static final int SCOOBY_SPAM_REPORT_LOG_VALUE = 250;
      /**
       * <code>IOS_GROWTH = 251;</code>
       *
       * <pre>
       * Logs of spam reports by scooby clients. (go/scooby)
       * </pre>
       */
      public static final int IOS_GROWTH_VALUE = 251;
      /**
       * <code>APPS_NOTIFY = 252;</code>
       *
       * <pre>
       * go/growthkit-metrics
       * </pre>
       */
      public static final int APPS_NOTIFY_VALUE = 252;
      /**
       * <code>SMARTKEY_APP = 269;</code>
       *
       * <pre>
       * Drive web push notifications (go/apps-notify)
       * </pre>
       */
      public static final int SMARTKEY_APP_VALUE = 269;
      /**
       * <code>CLINICAL_STUDIES = 270;</code>
       *
       * <pre>
       * Smart Key App for project Bolt (go/smartlock)
       * </pre>
       */
      public static final int CLINICAL_STUDIES_VALUE = 270;
      /**
       * <code>FITNESS_ANDROID_PRIMES = 271;</code>
       *
       * <pre>
       * Lifescience Clinical Studies logs (go/apollox)
       * </pre>
       */
      public static final int FITNESS_ANDROID_PRIMES_VALUE = 271;
      /**
       * <code>IMPROV_APPS = 272;</code>
       *
       * <pre>
       * System health metric for Google Fit Android App (go/heart, go/primes)
       * </pre>
       */
      public static final int IMPROV_APPS_VALUE = 272;
      /**
       * <code>FAMILYLINK = 273;</code>
       *
       * <pre>
       * Logs for Improv apps (go/improvlogging)
       * </pre>
       */
      public static final int FAMILYLINK_VALUE = 273;
      /**
       * <code>FAMILYLINK_COUNTERS = 274;</code>
       *
       * <pre>
       * Family Link (go/familylink-dd)
       * </pre>
       */
      public static final int FAMILYLINK_COUNTERS_VALUE = 274;
      /**
       * <code>SOCIETY = 275;</code>
       *
       * <pre>
       * Family Link counters (go/familylink-dd)
       * </pre>
       */
      public static final int SOCIETY_VALUE = 275;
      /**
       * <code>DIALER_ANDROID_PRIMES = 277;</code>
       *
       * <pre>
       * NBU Society app (go/society)
       * </pre>
       */
      public static final int DIALER_ANDROID_PRIMES_VALUE = 277;
      /**
       * <code>YOUTUBE_DIRECTOR_APP = 278;</code>
       *
       * <pre>
       * Android Dialer Primes (go/dialer)
       * </pre>
       */
      public static final int YOUTUBE_DIRECTOR_APP_VALUE = 278;
      /**
       * <code>TACHYON_ANDROID_PRIMES = 279;</code>
       *
       * <pre>
       * YouTube Director App (go/youtube-director)
       * </pre>
       */
      public static final int TACHYON_ANDROID_PRIMES_VALUE = 279;
      /**
       * <code>DRIVE_FS = 280;</code>
       *
       * <pre>
       * Android Tachyon Client
       * </pre>
       */
      public static final int DRIVE_FS_VALUE = 280;
      /**
       * <code>YT_MAIN = 281;</code>
       *
       * <pre>
       * DriveFS (go/drive-fs)
       * </pre>
       */
      public static final int YT_MAIN_VALUE = 281;
      /**
       * <code>WING_MARKETPLACE_ANDROID_PRIMES = 282;</code>
       *
       * <pre>
       * Logs for YT's main application
       * </pre>
       */
      public static final int WING_MARKETPLACE_ANDROID_PRIMES_VALUE = 282;
      /**
       * <code>DYNAMITE = 283;</code>
       *
       * <pre>
       * Primes for Wing Marketplace Android app (go/wing-marketplace-android, go/primes)
       * </pre>
       */
      public static final int DYNAMITE_VALUE = 283;
      /**
       * <code>CORP_ANDROID_FOOD = 284;</code>
       *
       * <pre>
       * Logs for Dynamite (go/dynamite)
       * </pre>
       */
      public static final int CORP_ANDROID_FOOD_VALUE = 284;
      /**
       * <code>ANDROID_MESSAGING_PRIMES = 285;</code>
       *
       * <pre>
       * Logs for the internal Android Food app (g3doc/java/com/google/corp/bizapps/rews/food/android)
       * </pre>
       */
      public static final int ANDROID_MESSAGING_PRIMES_VALUE = 285;
      /**
       * <code>GPLUS_IOS_PRIMES = 286;</code>
       *
       * <pre>
       * Primes for Android Messenger (go/bugledev, go/primes)
       * </pre>
       */
      public static final int GPLUS_IOS_PRIMES_VALUE = 286;
      /**
       * <code>CHROMECAST_ANDROID_PRIMES = 288;</code>
       *
       * <pre>
       * Primes for Google+ iOS app (go/gplus-ios, go/primes)
       * </pre>
       */
      public static final int CHROMECAST_ANDROID_PRIMES_VALUE = 288;
      /**
       * <code>APPSTREAMING = 289;</code>
       *
       * <pre>
       * Primes for Chromecast Android app (go/cast-apps)
       * </pre>
       */
      public static final int APPSTREAMING_VALUE = 289;
      /**
       * <code>GMB_ANDROID = 290;</code>
       *
       * <pre>
       * Logs for AppStreaming Client Framework Side (go/piccard)
       * </pre>
       */
      public static final int GMB_ANDROID_VALUE = 290;
      /**
       * <code>VOICE_IOS_PRIMES = 292;</code>
       *
       * <pre>
       * Logs for GMB Android app (go/gmb-android).
       * </pre>
       */
      public static final int VOICE_IOS_PRIMES_VALUE = 292;
      /**
       * <code>VOICE_ANDROID_PRIMES = 293;</code>
       *
       * <pre>
       * Primes for iOS Google Voice (go/googlevoice).
       * </pre>
       */
      public static final int VOICE_ANDROID_PRIMES_VALUE = 293;
      /**
       * <code>PAISA = 294;</code>
       *
       * <pre>
       * Primes for Android Google Voice (go/googlevoice).
       * </pre>
       */
      public static final int PAISA_VALUE = 294;
      /**
       * <code>GMB_IOS = 295;</code>
       *
       * <pre>
       * NBU Paisa app (go/paisa)
       * </pre>
       */
      public static final int GMB_IOS_VALUE = 295;
      /**
       * <code>SCOOBY_EVENTS = 296;</code>
       *
       * <pre>
       * Logs for GMB iOS App (go/gmb-ios).
       * </pre>
       */
      public static final int SCOOBY_EVENTS_VALUE = 296;
      /**
       * <code>SNAPSEED_IOS_PRIMES = 297;</code>
       *
       * <pre>
       * Call logs events by scooby clients. (go/scooby)
       * </pre>
       */
      public static final int SNAPSEED_IOS_PRIMES_VALUE = 297;
      /**
       * <code>YOUTUBE_DIRECTOR_IOS_PRIMES = 298;</code>
       *
       * <pre>
       * Primes for Snapseed IOS (go/Snapseed)
       * </pre>
       */
      public static final int YOUTUBE_DIRECTOR_IOS_PRIMES_VALUE = 298;
      /**
       * <code>WALLPAPER_PICKER = 299;</code>
       *
       * <pre>
       * YouTube Director App (go/youtube-director)
       * </pre>
       */
      public static final int WALLPAPER_PICKER_VALUE = 299;
      /**
       * <code>CHIME = 300;</code>
       *
       * <pre>
       * Android wallpaper picker (go/magic-wallpapers)
       * </pre>
       */
      public static final int CHIME_VALUE = 300;
      /**
       * <code>BEACON_GCORE = 301;</code>
       *
       * <pre>
       * Chime (go/chime)
       * </pre>
       */
      public static final int BEACON_GCORE_VALUE = 301;
      /**
       * <code>ANDROID_STUDIO = 302;</code>
       *
       * <pre>
       * Logs for debugging beacon module (go/beacons)
       * </pre>
       */
      public static final int ANDROID_STUDIO_VALUE = 302;
      /**
       * <code>DOCS_OFFLINE = 306;</code>
       *
       * <pre>
       * Android Studio (go/android-studio)
       * </pre>
       */
      public static final int DOCS_OFFLINE_VALUE = 306;
      /**
       * <code>FREIGHTER = 307;</code>
       *
       * <pre>
       * Logs for Docs Offline on Desktop  (go/jetpax)
       * </pre>
       */
      public static final int FREIGHTER_VALUE = 307;
      /**
       * <code>DOCS_IOS_PRIMES = 308;</code>
       *
       * <pre>
       * Logs for Freighter (http://go/freighter)
       * </pre>
       */
      public static final int DOCS_IOS_PRIMES_VALUE = 308;
      /**
       * <code>SLIDES_IOS_PRIMES = 309;</code>
       *
       * <pre>
       * Logs for the Google Docs iOS application
       * </pre>
       */
      public static final int SLIDES_IOS_PRIMES_VALUE = 309;
      /**
       * <code>SHEETS_IOS_PRIMES = 310;</code>
       *
       * <pre>
       * Logs for the Google Docs iOS application
       * </pre>
       */
      public static final int SHEETS_IOS_PRIMES_VALUE = 310;
      /**
       * <code>IPCONNECTIVITY = 311;</code>
       *
       * <pre>
       * Logs for the Google Docs iOS application
       * </pre>
       */
      public static final int IPCONNECTIVITY_VALUE = 311;
      /**
       * <code>CURATOR = 312;</code>
       *
       * <pre>
       * Logs for Networking (go/connectivity-site)
       * </pre>
       */
      public static final int CURATOR_VALUE = 312;


      public final int getNumber() { return value; }

      public static LogSource valueOf(int value) {
        switch (value) {
          case -1: return UNKNOWN;
          case 0: return STORE;
          case 65: return WEB_STORE;
          case 132: return WORK_STORE;
          case 261: return WORK_STORE_APP;
          case 15: return EDU_STORE;
          case 1: return MUSIC;
          case 2: return BOOKS;
          case 3: return VIDEO;
          case 74: return MOVIES;
          case 4: return MAGAZINES;
          case 5: return GAMES;
          case 6: return LB_A;
          case 7: return ANDROID_IDE;
          case 8: return LB_P;
          case 9: return LB_S;
          case 10: return GMS_CORE;
          case 11: return APP_USAGE_1P;
          case 12: return ICING;
          case 13: return HERREVAD;
          case 14: return GOOGLE_TV;
          case 16: return GMS_CORE_PEOPLE;
          case 17: return LE;
          case 18: return GOOGLE_ANALYTICS;
          case 19: return LB_D;
          case 20: return ANDROID_GSA;
          case 21: return LB_T;
          case 22: return PERSONAL_LOGGER;
          case 37: return PERSONAL_BROWSER_LOGGER;
          case 23: return GMS_CORE_WALLET_MERCHANT_ERROR;
          case 24: return LB_C;
          case 52: return LB_IA;
          case 237: return LB_CB;
          case 268: return LB_DM;
          case 25: return ANDROID_AUTH;
          case 26: return ANDROID_CAMERA;
          case 27: return CW;
          case 243: return CW_COUNTERS;
          case 28: return GEL;
          case 29: return DNA_PROBER;
          case 30: return UDR;
          case 31: return GMS_CORE_WALLET;
          case 32: return SOCIAL;
          case 33: return INSTORE_WALLET;
          case 34: return NOVA;
          case 35: return LB_CA;
          case 36: return LATIN_IME;
          case 38: return NEWS_WEATHER;
          case 39: return HANGOUT;
          case 50: return HANGOUT_LOG_REQUEST;
          case 40: return COPRESENCE;
          case 41: return SOCIAL_AFFINITY;
          case 42: return PHOTOS;
          case 43: return GCM;
          case 44: return GOKART;
          case 45: return FINDR;
          case 46: return ANDROID_MESSAGING;
          case 47: return SOCIAL_WEB;
          case 48: return BACKDROP;
          case 49: return TELEMATICS;
          case 51: return GVC_HARVESTER;
          case 53: return CAR;
          case 54: return PIXEL_PERFECT;
          case 55: return DRIVE;
          case 56: return DOCS;
          case 57: return SHEETS;
          case 58: return SLIDES;
          case 59: return IME;
          case 60: return WARP;
          case 61: return NFC_PROGRAMMER;
          case 62: return NETSTATS;
          case 63: return NEWSSTAND;
          case 64: return KIDS_COMMUNICATOR;
          case 66: return WIFI_ASSISTANT;
          case 67: return CAST_SENDER_SDK;
          case 68: return CRONET_SOCIAL;
          case 69: return PHENOTYPE;
          case 70: return PHENOTYPE_COUNTERS;
          case 71: return CHROME_INFRA;
          case 72: return JUSTSPEAK;
          case 73: return PERF_PROFILE;
          case 75: return KATNISS;
          case 76: return SOCIAL_APPINVITE;
          case 77: return GMM_COUNTERS;
          case 78: return BOND_ONEGOOGLE;
          case 79: return MAPS_API;
          case 196: return CRONET_ANDROID_YT;
          case 80: return CRONET_ANDROID_GSA;
          case 81: return GOOGLE_FIT_WEARABLE;
          case 169: return FITNESS_ANDROID;
          case 170: return FITNESS_GMS_CORE;
          case 82: return GOOGLE_EXPRESS;
          case 215: return GOOGLE_EXPRESS_DEV;
          case 228: return GOOGLE_EXPRESS_COURIER_ANDROID_PRIMES;
          case 229: return GOOGLE_EXPRESS_ANDROID_PRIMES;
          case 240: return GOOGLE_EXPRESS_STOREOMS_ANDROID_PRIMES;
          case 83: return SENSE;
          case 84: return ANDROID_BACKUP;
          case 85: return VR;
          case 86: return IME_COUNTERS;
          case 87: return SETUP_WIZARD;
          case 88: return EMERGENCY_ASSIST;
          case 89: return TRON;
          case 90: return TRON_COUNTERS;
          case 91: return BATTERY_STATS;
          case 92: return DISK_STATS;
          case 107: return GRAPHICS_STATS;
          case 93: return PROC_STATS;
          case 131: return DROP_BOX;
          case 181: return FINGERPRINT_STATS;
          case 182: return NOTIFICATION_STATS;
          case 94: return TAP_AND_PAY_GCORE;
          case 95: return A11YLOGGER;
          case 96: return GCM_COUNTERS;
          case 97: return PLACES_NO_GLS_CONSENT;
          case 98: return TACHYON_LOG_REQUEST;
          case 99: return TACHYON_COUNTERS;
          case 100: return VISION;
          case 101: return SOCIAL_USER_LOCATION;
          case 102: return LAUNCHPAD_TOYS;
          case 103: return METALOG_COUNTERS;
          case 104: return MOBILESDK_CLIENT;
          case 105: return ANDROID_VERIFY_APPS;
          case 106: return ADSHIELD;
          case 108: return SHERLOG;
          case 109: return LE_ULR_COUNTERS;
          case 110: return GMM_UE3;
          case 111: return CALENDAR;
          case 112: return ENDER;
          case 113: return FAMILY_COMPASS;
          case 114: return TRANSOM;
          case 115: return TRANSOM_COUNTERS;
          case 116: return LB_AS;
          case 117: return LB_CFG;
          case 118: return IOS_GSA;
          case 119: return TAP_AND_PAY_APP;
          case 265: return TAP_AND_PAY_APP_COUNTERS;
          case 120: return FLYDROID;
          case 121: return CPANEL_APP;
          case 122: return ANDROID_SNET_GCORE;
          case 123: return ANDROID_SNET_IDLE;
          case 124: return ANDROID_SNET_JAR;
          case 125: return CONTEXT_MANAGER;
          case 126: return CLASSROOM;
          case 127: return TAILORMADE;
          case 128: return KEEP;
          case 129: return GMM_BRIIM_COUNTERS;
          case 130: return CHROMECAST_APP_LOG;
          case 133: return ADWORDS_MOBILE;
          case 134: return LEANBACK_EVENT;
          case 135: return ANDROID_GMAIL;
          case 136: return SAMPLE_SHM;
          case 140: return GPLUS_ANDROID_PRIMES;
          case 150: return GMAIL_ANDROID_PRIMES;
          case 151: return CALENDAR_ANDROID_PRIMES;
          case 152: return DOCS_ANDROID_PRIMES;
          case 154: return YT_MAIN_APP_ANDROID_PRIMES;
          case 155: return YT_KIDS_ANDROID_PRIMES;
          case 156: return YT_GAMING_ANDROID_PRIMES;
          case 157: return YT_MUSIC_ANDROID_PRIMES;
          case 158: return YT_LITE_ANDROID_PRIMES;
          case 171: return YT_CREATOR_ANDROID_PRIMES;
          case 159: return JAM_ANDROID_PRIMES;
          case 160: return JAM_KIOSK_ANDROID_PRIMES;
          case 165: return PHOTOS_ANDROID_PRIMES;
          case 166: return DRIVE_ANDROID_PRIMES;
          case 167: return SHEETS_ANDROID_PRIMES;
          case 168: return SLIDES_ANDROID_PRIMES;
          case 178: return SNAPSEED_ANDROID_PRIMES;
          case 179: return HANGOUTS_ANDROID_PRIMES;
          case 180: return INBOX_ANDROID_PRIMES;
          case 262: return INBOX_IOS_PRIMES;
          case 287: return SDP_IOS_PRIMES;
          case 193: return GMSCORE_ANDROID_PRIMES;
          case 200: return PLAY_MUSIC_ANDROID_WEAR_PRIMES;
          case 201: return GEARHEAD_ANDROID_PRIMES;
          case 207: return INSTORE_CONSUMER_PRIMES;
          case 202: return SAMPLE_IOS_PRIMES;
          case 213: return CPANEL_ANDROID_PRIMES;
          case 214: return HUDDLE_ANDROID_PRIMES;
          case 222: return AWX_ANDROID_PRIMES;
          case 223: return GHS_ANDROID_PRIMES;
          case 224: return ADWORDS_MOBILE_ANDROID_PRIMES;
          case 227: return TAP_AND_PAY_ANDROID_PRIMES;
          case 232: return WALLET_APP_ANDROID_PRIMES;
          case 233: return WALLET_APP_IOS_PRIMES;
          case 235: return ANALYTICS_ANDROID_PRIMES;
          case 236: return SPACES_ANDROID_PRIMES;
          case 276: return SPACES_IOS_PRIMES;
          case 238: return SOCIETY_ANDROID_PRIMES;
          case 239: return GMM_BRIIM_PRIMES;
          case 242: return CW_PRIMES;
          case 244: return FAMILYLINK_ANDROID_PRIMES;
          case 291: return FAMILYLINK_IOS_PRIMES;
          case 248: return WH_PRIMES;
          case 249: return NOVA_ANDROID_PRIMES;
          case 253: return PHOTOS_DRAPER_ANDROID_PRIMES;
          case 254: return GMM_PRIMES;
          case 255: return TRANSLATE_ANDROID_PRIMES;
          case 256: return TRANSLATE_IOS_PRIMES;
          case 259: return FLYDROID_ANDROID_PRIMES;
          case 260: return CONSUMERIQ_PRIMES;
          case 263: return GMB_ANDROID_PRIMES;
          case 304: return CLOUDDPC_PRIMES;
          case 305: return CLOUDDPC_ARC_PRIMES;
          case 137: return ICORE;
          case 138: return PANCETTA_MOBILE_HOST;
          case 139: return PANCETTA_MOBILE_HOST_COUNTERS;
          case 141: return CROSSDEVICENOTIFICATION;
          case 142: return CROSSDEVICENOTIFICATION_DEV;
          case 143: return MAPS_API_COUNTERS;
          case 144: return GPU;
          case 145: return ON_THE_GO;
          case 146: return ON_THE_GO_COUNTERS;
          case 147: return GMS_CORE_PEOPLE_AUTOCOMPLETE;
          case 148: return FLYDROID_COUNTERS;
          case 149: return FIREBALL;
          case 257: return FIREBALL_COUNTERS;
          case 303: return CRONET_FIREBALL;
          case 266: return FIREBALL_PRIMES;
          case 313: return FIREBALL_IOS_PRIMES;
          case 314: return GOOGLE_HANDWRITING_INPUT_ANDROID_PRIMES;
          case 153: return PYROCLASM;
          case 161: return ANDROID_GSA_COUNTERS;
          case 162: return JAM_IMPRESSIONS;
          case 163: return JAM_KIOSK_IMPRESSIONS;
          case 164: return PAYMENTS_OCR;
          case 172: return UNICORN_FAMILY_MANAGEMENT;
          case 173: return AUDITOR;
          case 174: return NQLOOKUP;
          case 175: return ANDROID_GSA_HIGH_PRIORITY_EVENTS;
          case 176: return ANDROID_DIALER;
          case 177: return CLEARCUT_DEMO;
          case 183: return APPMANAGER;
          case 184: return SMARTLOCK_COUNTERS;
          case 185: return EXPEDITIONS_GUIDE;
          case 186: return FUSE;
          case 187: return PIXEL_PERFECT_CLIENT_STATE_LOGGER;
          case 188: return PLATFORM_STATS_COUNTERS;
          case 189: return DRIVE_VIEWER;
          case 190: return PDF_VIEWER;
          case 191: return BIGTOP;
          case 192: return VOICE;
          case 194: return MYFIBER;
          case 195: return RECORDED_PAGES;
          case 197: return MOB_DOG;
          case 198: return WALLET_APP;
          case 199: return GBOARD;
          case 203: return CRONET_GMM;
          case 204: return TRUSTED_FACE;
          case 205: return MATCHSTICK;
          case 206: return APP_CATALOG;
          case 208: return BLUETOOTH;
          case 209: return WIFI;
          case 210: return TELECOM;
          case 211: return TELEPHONY;
          case 212: return IDENTITY_FRONTEND;
          case 216: return SESAME;
          case 217: return GOOGLE_KEYBOARD_CONTENT;
          case 218: return MADDEN;
          case 219: return INK;
          case 220: return ANDROID_CONTACTS;
          case 221: return GOOGLE_KEYBOARD_COUNTERS;
          case 225: return CLEARCUT_PROBER;
          case 226: return PLAY_CONSOLE_APP;
          case 264: return PLAY_CONSOLE_APP_PRIMES;
          case 230: return SPECTRUM;
          case 231: return SPECTRUM_COUNTERS;
          case 267: return SPECTRUM_ANDROID_PRIMES;
          case 234: return IOS_SPOTLIGHT_SEARCH_LIBRARY;
          case 241: return BOQ_WEB;
          case 245: return ORCHESTRATION_CLIENT;
          case 246: return ORCHESTRATION_CLIENT_DEV;
          case 247: return GOOGLE_NOW_LAUNCHER;
          case 250: return SCOOBY_SPAM_REPORT_LOG;
          case 251: return IOS_GROWTH;
          case 252: return APPS_NOTIFY;
          case 269: return SMARTKEY_APP;
          case 270: return CLINICAL_STUDIES;
          case 271: return FITNESS_ANDROID_PRIMES;
          case 272: return IMPROV_APPS;
          case 273: return FAMILYLINK;
          case 274: return FAMILYLINK_COUNTERS;
          case 275: return SOCIETY;
          case 277: return DIALER_ANDROID_PRIMES;
          case 278: return YOUTUBE_DIRECTOR_APP;
          case 279: return TACHYON_ANDROID_PRIMES;
          case 280: return DRIVE_FS;
          case 281: return YT_MAIN;
          case 282: return WING_MARKETPLACE_ANDROID_PRIMES;
          case 283: return DYNAMITE;
          case 284: return CORP_ANDROID_FOOD;
          case 285: return ANDROID_MESSAGING_PRIMES;
          case 286: return GPLUS_IOS_PRIMES;
          case 288: return CHROMECAST_ANDROID_PRIMES;
          case 289: return APPSTREAMING;
          case 290: return GMB_ANDROID;
          case 292: return VOICE_IOS_PRIMES;
          case 293: return VOICE_ANDROID_PRIMES;
          case 294: return PAISA;
          case 295: return GMB_IOS;
          case 296: return SCOOBY_EVENTS;
          case 297: return SNAPSEED_IOS_PRIMES;
          case 298: return YOUTUBE_DIRECTOR_IOS_PRIMES;
          case 299: return WALLPAPER_PICKER;
          case 300: return CHIME;
          case 301: return BEACON_GCORE;
          case 302: return ANDROID_STUDIO;
          case 306: return DOCS_OFFLINE;
          case 307: return FREIGHTER;
          case 308: return DOCS_IOS_PRIMES;
          case 309: return SLIDES_IOS_PRIMES;
          case 310: return SHEETS_IOS_PRIMES;
          case 311: return IPCONNECTIVITY;
          case 312: return CURATOR;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<LogSource>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<LogSource>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<LogSource>() {
              public LogSource findValueByNumber(int number) {
                return LogSource.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.getDescriptor().getEnumTypes().get(0);
      }

      private static final LogSource[] VALUES = {
        UNKNOWN, STORE, WEB_STORE, WORK_STORE, WORK_STORE_APP, EDU_STORE, MUSIC, BOOKS, VIDEO, MOVIES, MAGAZINES, GAMES, LB_A, ANDROID_IDE, LB_P, LB_S, GMS_CORE, APP_USAGE_1P, ICING, HERREVAD, GOOGLE_TV, GMS_CORE_PEOPLE, LE, GOOGLE_ANALYTICS, LB_D, ANDROID_GSA, LB_T, PERSONAL_LOGGER, PERSONAL_BROWSER_LOGGER, GMS_CORE_WALLET_MERCHANT_ERROR, LB_C, LB_IA, LB_CB, LB_DM, ANDROID_AUTH, ANDROID_CAMERA, CW, CW_COUNTERS, GEL, DNA_PROBER, UDR, GMS_CORE_WALLET, SOCIAL, INSTORE_WALLET, NOVA, LB_CA, LATIN_IME, NEWS_WEATHER, HANGOUT, HANGOUT_LOG_REQUEST, COPRESENCE, SOCIAL_AFFINITY, PHOTOS, GCM, GOKART, FINDR, ANDROID_MESSAGING, SOCIAL_WEB, BACKDROP, TELEMATICS, GVC_HARVESTER, CAR, PIXEL_PERFECT, DRIVE, DOCS, SHEETS, SLIDES, IME, WARP, NFC_PROGRAMMER, NETSTATS, NEWSSTAND, KIDS_COMMUNICATOR, WIFI_ASSISTANT, CAST_SENDER_SDK, CRONET_SOCIAL, PHENOTYPE, PHENOTYPE_COUNTERS, CHROME_INFRA, JUSTSPEAK, PERF_PROFILE, KATNISS, SOCIAL_APPINVITE, GMM_COUNTERS, BOND_ONEGOOGLE, MAPS_API, CRONET_ANDROID_YT, CRONET_ANDROID_GSA, GOOGLE_FIT_WEARABLE, FITNESS_ANDROID, FITNESS_GMS_CORE, GOOGLE_EXPRESS, GOOGLE_EXPRESS_DEV, GOOGLE_EXPRESS_COURIER_ANDROID_PRIMES, GOOGLE_EXPRESS_ANDROID_PRIMES, GOOGLE_EXPRESS_STOREOMS_ANDROID_PRIMES, SENSE, ANDROID_BACKUP, VR, IME_COUNTERS, SETUP_WIZARD, EMERGENCY_ASSIST, TRON, TRON_COUNTERS, BATTERY_STATS, DISK_STATS, GRAPHICS_STATS, PROC_STATS, DROP_BOX, FINGERPRINT_STATS, NOTIFICATION_STATS, TAP_AND_PAY_GCORE, A11YLOGGER, GCM_COUNTERS, PLACES_NO_GLS_CONSENT, TACHYON_LOG_REQUEST, TACHYON_COUNTERS, VISION, SOCIAL_USER_LOCATION, LAUNCHPAD_TOYS, METALOG_COUNTERS, MOBILESDK_CLIENT, ANDROID_VERIFY_APPS, ADSHIELD, SHERLOG, LE_ULR_COUNTERS, GMM_UE3, CALENDAR, ENDER, FAMILY_COMPASS, TRANSOM, TRANSOM_COUNTERS, LB_AS, LB_CFG, IOS_GSA, TAP_AND_PAY_APP, TAP_AND_PAY_APP_COUNTERS, FLYDROID, CPANEL_APP, ANDROID_SNET_GCORE, ANDROID_SNET_IDLE, ANDROID_SNET_JAR, CONTEXT_MANAGER, CLASSROOM, TAILORMADE, KEEP, GMM_BRIIM_COUNTERS, CHROMECAST_APP_LOG, ADWORDS_MOBILE, LEANBACK_EVENT, ANDROID_GMAIL, SAMPLE_SHM, GPLUS_ANDROID_PRIMES, GPLUS_ANDROID_SYSTEM_HEALTH, GMAIL_ANDROID_PRIMES, GMAIL_ANDROID_SYSTEM_HEALTH, CALENDAR_ANDROID_PRIMES, CALENDAR_ANDROID_SYSTEM_HEALTH, DOCS_ANDROID_PRIMES, DOCS_ANDROID_SYSTEM_HEALTH, YT_MAIN_APP_ANDROID_PRIMES, YT_KIDS_ANDROID_PRIMES, YT_GAMING_ANDROID_PRIMES, YT_MUSIC_ANDROID_PRIMES, YT_LITE_ANDROID_PRIMES, YT_CREATOR_ANDROID_PRIMES, JAM_ANDROID_PRIMES, JAM_KIOSK_ANDROID_PRIMES, PHOTOS_ANDROID_PRIMES, DRIVE_ANDROID_PRIMES, SHEETS_ANDROID_PRIMES, SLIDES_ANDROID_PRIMES, SNAPSEED_ANDROID_PRIMES, HANGOUTS_ANDROID_PRIMES, INBOX_ANDROID_PRIMES, INBOX_IOS_PRIMES, SDP_IOS_PRIMES, GMSCORE_ANDROID_PRIMES, PLAY_MUSIC_ANDROID_WEAR_PRIMES, GEARHEAD_ANDROID_PRIMES, INSTORE_CONSUMER_PRIMES, SAMPLE_IOS_PRIMES, CPANEL_ANDROID_PRIMES, HUDDLE_ANDROID_PRIMES, AWX_ANDROID_PRIMES, GHS_ANDROID_PRIMES, ADWORDS_MOBILE_ANDROID_PRIMES, TAP_AND_PAY_ANDROID_PRIMES, WALLET_APP_ANDROID_PRIMES, WALLET_APP_IOS_PRIMES, ANALYTICS_ANDROID_PRIMES, SPACES_ANDROID_PRIMES, SPACES_IOS_PRIMES, SOCIETY_ANDROID_PRIMES, GMM_BRIIM_PRIMES, CW_PRIMES, FAMILYLINK_ANDROID_PRIMES, FAMILYLINK_IOS_PRIMES, WH_PRIMES, NOVA_ANDROID_PRIMES, PHOTOS_DRAPER_ANDROID_PRIMES, GMM_PRIMES, TRANSLATE_ANDROID_PRIMES, TRANSLATE_IOS_PRIMES, FLYDROID_ANDROID_PRIMES, CONSUMERIQ_PRIMES, GMB_ANDROID_PRIMES, CLOUDDPC_PRIMES, CLOUDDPC_ARC_PRIMES, ICORE, PANCETTA_MOBILE_HOST, PANCETTA_MOBILE_HOST_COUNTERS, CROSSDEVICENOTIFICATION, CROSSDEVICENOTIFICATION_DEV, MAPS_API_COUNTERS, GPU, ON_THE_GO, ON_THE_GO_COUNTERS, GMS_CORE_PEOPLE_AUTOCOMPLETE, FLYDROID_COUNTERS, FIREBALL, FIREBALL_COUNTERS, CRONET_FIREBALL, FIREBALL_PRIMES, FIREBALL_IOS_PRIMES, GOOGLE_HANDWRITING_INPUT_ANDROID_PRIMES, PYROCLASM, ANDROID_GSA_COUNTERS, JAM_IMPRESSIONS, JAM_KIOSK_IMPRESSIONS, PAYMENTS_OCR, UNICORN_FAMILY_MANAGEMENT, AUDITOR, NQLOOKUP, ANDROID_GSA_HIGH_PRIORITY_EVENTS, ANDROID_DIALER, CLEARCUT_DEMO, APPMANAGER, SMARTLOCK_COUNTERS, EXPEDITIONS_GUIDE, FUSE, PIXEL_PERFECT_CLIENT_STATE_LOGGER, PLATFORM_STATS_COUNTERS, DRIVE_VIEWER, PDF_VIEWER, BIGTOP, VOICE, MYFIBER, RECORDED_PAGES, MOB_DOG, WALLET_APP, GBOARD, CRONET_GMM, TRUSTED_FACE, MATCHSTICK, APP_CATALOG, BLUETOOTH, WIFI, TELECOM, TELEPHONY, IDENTITY_FRONTEND, SESAME, GOOGLE_KEYBOARD_CONTENT, MADDEN, INK, ANDROID_CONTACTS, GOOGLE_KEYBOARD_COUNTERS, CLEARCUT_PROBER, PLAY_CONSOLE_APP, PLAY_CONSOLE_APP_PRIMES, SPECTRUM, SPECTRUM_COUNTERS, SPECTRUM_ANDROID_PRIMES, IOS_SPOTLIGHT_SEARCH_LIBRARY, BOQ_WEB, ORCHESTRATION_CLIENT, ORCHESTRATION_CLIENT_DEV, GOOGLE_NOW_LAUNCHER, SCOOBY_SPAM_REPORT_LOG, IOS_GROWTH, APPS_NOTIFY, SMARTKEY_APP, CLINICAL_STUDIES, FITNESS_ANDROID_PRIMES, IMPROV_APPS, FAMILYLINK, FAMILYLINK_COUNTERS, SOCIETY, DIALER_ANDROID_PRIMES, YOUTUBE_DIRECTOR_APP, TACHYON_ANDROID_PRIMES, DRIVE_FS, YT_MAIN, WING_MARKETPLACE_ANDROID_PRIMES, DYNAMITE, CORP_ANDROID_FOOD, ANDROID_MESSAGING_PRIMES, GPLUS_IOS_PRIMES, CHROMECAST_ANDROID_PRIMES, APPSTREAMING, GMB_ANDROID, VOICE_IOS_PRIMES, VOICE_ANDROID_PRIMES, PAISA, GMB_IOS, SCOOBY_EVENTS, SNAPSEED_IOS_PRIMES, YOUTUBE_DIRECTOR_IOS_PRIMES, WALLPAPER_PICKER, CHIME, BEACON_GCORE, ANDROID_STUDIO, DOCS_OFFLINE, FREIGHTER, DOCS_IOS_PRIMES, SLIDES_IOS_PRIMES, SHEETS_IOS_PRIMES, IPCONNECTIVITY, CURATOR, 
      };

      public static LogSource valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private LogSource(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.LogRequest.LogSource)
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.LogRequest.SchedulerType}
     *
     * <pre>
     * Different types schedulers for log upload.
     * </pre>
     */
    public enum SchedulerType
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>UNKNOWN_SCHEDULER = 0;</code>
       */
      UNKNOWN_SCHEDULER(0, 0),
      /**
       * <code>ASAP = 1;</code>
       */
      ASAP(1, 1),
      /**
       * <code>DEFAULT_PERIODIC = 2;</code>
       *
       * <pre>
       * As soon as possible used when log store is full.
       * </pre>
       */
      DEFAULT_PERIODIC(2, 2),
      /**
       * <code>QOS_FAST_ONEOFF = 3;</code>
       */
      QOS_FAST_ONEOFF(3, 3),
      /**
       * <code>QOS_DEFAULT_PERIODIC = 4;</code>
       */
      QOS_DEFAULT_PERIODIC(4, 4),
      /**
       * <code>QOS_UNMETERED_PERIODIC = 5;</code>
       */
      QOS_UNMETERED_PERIODIC(5, 5),
      ;

      /**
       * <code>UNKNOWN_SCHEDULER = 0;</code>
       */
      public static final int UNKNOWN_SCHEDULER_VALUE = 0;
      /**
       * <code>ASAP = 1;</code>
       */
      public static final int ASAP_VALUE = 1;
      /**
       * <code>DEFAULT_PERIODIC = 2;</code>
       *
       * <pre>
       * As soon as possible used when log store is full.
       * </pre>
       */
      public static final int DEFAULT_PERIODIC_VALUE = 2;
      /**
       * <code>QOS_FAST_ONEOFF = 3;</code>
       */
      public static final int QOS_FAST_ONEOFF_VALUE = 3;
      /**
       * <code>QOS_DEFAULT_PERIODIC = 4;</code>
       */
      public static final int QOS_DEFAULT_PERIODIC_VALUE = 4;
      /**
       * <code>QOS_UNMETERED_PERIODIC = 5;</code>
       */
      public static final int QOS_UNMETERED_PERIODIC_VALUE = 5;


      public final int getNumber() { return value; }

      public static SchedulerType valueOf(int value) {
        switch (value) {
          case 0: return UNKNOWN_SCHEDULER;
          case 1: return ASAP;
          case 2: return DEFAULT_PERIODIC;
          case 3: return QOS_FAST_ONEOFF;
          case 4: return QOS_DEFAULT_PERIODIC;
          case 5: return QOS_UNMETERED_PERIODIC;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<SchedulerType>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<SchedulerType>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<SchedulerType>() {
              public SchedulerType findValueByNumber(int number) {
                return SchedulerType.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.getDescriptor().getEnumTypes().get(1);
      }

      private static final SchedulerType[] VALUES = values();

      public static SchedulerType valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private SchedulerType(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.LogRequest.SchedulerType)
    }

    private int bitField0_;
    // optional int64 request_time_ms = 4;
    public static final int REQUEST_TIME_MS_FIELD_NUMBER = 4;
    private long requestTimeMs_;
    /**
     * <code>optional int64 request_time_ms = 4;</code>
     *
     * <pre>
     * "Now", in milliseconds, according to the same clock as the one used to set
     *  the 'event_time_ms' values in the LogEvent protos above.
     * </pre>
     */
    public boolean hasRequestTimeMs() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional int64 request_time_ms = 4;</code>
     *
     * <pre>
     * "Now", in milliseconds, according to the same clock as the one used to set
     *  the 'event_time_ms' values in the LogEvent protos above.
     * </pre>
     */
    public long getRequestTimeMs() {
      return requestTimeMs_;
    }

    // optional int64 request_uptime_ms = 8;
    public static final int REQUEST_UPTIME_MS_FIELD_NUMBER = 8;
    private long requestUptimeMs_;
    /**
     * <code>optional int64 request_uptime_ms = 8;</code>
     *
     * <pre>
     * Current time since boot in milliseconds, including time spent in sleep,
     *  according to the same clock as the one used to set
     *  the 'event_uptime_ms' values in the LogEvent protos above.
     * </pre>
     */
    public boolean hasRequestUptimeMs() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional int64 request_uptime_ms = 8;</code>
     *
     * <pre>
     * Current time since boot in milliseconds, including time spent in sleep,
     *  according to the same clock as the one used to set
     *  the 'event_uptime_ms' values in the LogEvent protos above.
     * </pre>
     */
    public long getRequestUptimeMs() {
      return requestUptimeMs_;
    }

    // optional .wireless_android_play_playlog.ClientInfo client_info = 1;
    public static final int CLIENT_INFO_FIELD_NUMBER = 1;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo clientInfo_;
    /**
     * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
     */
    public boolean hasClientInfo() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo getClientInfo() {
      return clientInfo_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfoOrBuilder getClientInfoOrBuilder() {
      return clientInfo_;
    }

    // optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];
    public static final int LOG_SOURCE_FIELD_NUMBER = 2;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource logSource_;
    /**
     * <code>optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];</code>
     */
    public boolean hasLogSource() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource getLogSource() {
      return logSource_;
    }

    // optional string log_source_name = 6;
    public static final int LOG_SOURCE_NAME_FIELD_NUMBER = 6;
    private java.lang.Object logSourceName_;
    /**
     * <code>optional string log_source_name = 6;</code>
     *
     * <pre>
     * If log_source is not present and log_source_name is present, the value of
     *  log_source_name is parsed as a LogSource value and set to log_source.
     * </pre>
     */
    public boolean hasLogSourceName() {
      return ((bitField0_ & 0x00000010) == 0x00000010);
    }
    /**
     * <code>optional string log_source_name = 6;</code>
     *
     * <pre>
     * If log_source is not present and log_source_name is present, the value of
     *  log_source_name is parsed as a LogSource value and set to log_source.
     * </pre>
     */
    public java.lang.String getLogSourceName() {
      java.lang.Object ref = logSourceName_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          logSourceName_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string log_source_name = 6;</code>
     *
     * <pre>
     * If log_source is not present and log_source_name is present, the value of
     *  log_source_name is parsed as a LogSource value and set to log_source.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getLogSourceNameBytes() {
      java.lang.Object ref = logSourceName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        logSourceName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional string zwieback_cookie = 7;
    public static final int ZWIEBACK_COOKIE_FIELD_NUMBER = 7;
    private java.lang.Object zwiebackCookie_;
    /**
     * <code>optional string zwieback_cookie = 7;</code>
     *
     * <pre>
     * cookie from pseudonymous id service at the time the event was posted
     * </pre>
     */
    public boolean hasZwiebackCookie() {
      return ((bitField0_ & 0x00000020) == 0x00000020);
    }
    /**
     * <code>optional string zwieback_cookie = 7;</code>
     *
     * <pre>
     * cookie from pseudonymous id service at the time the event was posted
     * </pre>
     */
    public java.lang.String getZwiebackCookie() {
      java.lang.Object ref = zwiebackCookie_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          zwiebackCookie_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string zwieback_cookie = 7;</code>
     *
     * <pre>
     * cookie from pseudonymous id service at the time the event was posted
     * </pre>
     */
    public com.google.protobuf.ByteString
        getZwiebackCookieBytes() {
      java.lang.Object ref = zwiebackCookie_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        zwiebackCookie_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // repeated .wireless_android_play_playlog.LogEvent log_event = 3;
    public static final int LOG_EVENT_FIELD_NUMBER = 3;
    private java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent> logEvent_;
    /**
     * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
     */
    public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent> getLogEventList() {
      return logEvent_;
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
     */
    public java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventOrBuilder> 
        getLogEventOrBuilderList() {
      return logEvent_;
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
     */
    public int getLogEventCount() {
      return logEvent_.size();
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent getLogEvent(int index) {
      return logEvent_.get(index);
    }
    /**
     * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventOrBuilder getLogEventOrBuilder(
        int index) {
      return logEvent_.get(index);
    }

    // repeated bytes serialized_log_events = 5;
    public static final int SERIALIZED_LOG_EVENTS_FIELD_NUMBER = 5;
    private java.util.List<com.google.protobuf.ByteString> serializedLogEvents_;
    /**
     * <code>repeated bytes serialized_log_events = 5;</code>
     *
     * <pre>
     * Can be used instead of 'log_event' in order to save battery in cases where
     *  LogEvent protos are already serialized, and deserializing is undesirable.
     *  If used, this is a collection of byte streams each produced using a
     *  CodedOutputStream.
     * </pre>
     */
    public java.util.List<com.google.protobuf.ByteString>
        getSerializedLogEventsList() {
      return serializedLogEvents_;
    }
    /**
     * <code>repeated bytes serialized_log_events = 5;</code>
     *
     * <pre>
     * Can be used instead of 'log_event' in order to save battery in cases where
     *  LogEvent protos are already serialized, and deserializing is undesirable.
     *  If used, this is a collection of byte streams each produced using a
     *  CodedOutputStream.
     * </pre>
     */
    public int getSerializedLogEventsCount() {
      return serializedLogEvents_.size();
    }
    /**
     * <code>repeated bytes serialized_log_events = 5;</code>
     *
     * <pre>
     * Can be used instead of 'log_event' in order to save battery in cases where
     *  LogEvent protos are already serialized, and deserializing is undesirable.
     *  If used, this is a collection of byte streams each produced using a
     *  CodedOutputStream.
     * </pre>
     */
    public com.google.protobuf.ByteString getSerializedLogEvents(int index) {
      return serializedLogEvents_.get(index);
    }

    // optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];
    public static final int QOS_TIER_FIELD_NUMBER = 9;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier qosTier_;
    /**
     * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];</code>
     *
     * <pre>
     * Quality of Service tier for log upload.
     * </pre>
     */
    public boolean hasQosTier() {
      return ((bitField0_ & 0x00000040) == 0x00000040);
    }
    /**
     * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];</code>
     *
     * <pre>
     * Quality of Service tier for log upload.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier getQosTier() {
      return qosTier_;
    }

    // optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;
    public static final int SCHEDULER_FIELD_NUMBER = 10;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType scheduler_;
    /**
     * <code>optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;</code>
     *
     * <pre>
     * The type of log upload scheduler.
     * </pre>
     */
    public boolean hasScheduler() {
      return ((bitField0_ & 0x00000080) == 0x00000080);
    }
    /**
     * <code>optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;</code>
     *
     * <pre>
     * The type of log upload scheduler.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType getScheduler() {
      return scheduler_;
    }

    // optional .wireless_android_play_playlog.DeviceStatus device_status = 11;
    public static final int DEVICE_STATUS_FIELD_NUMBER = 11;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus deviceStatus_;
    /**
     * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
     *
     * <pre>
     * Device status.
     * </pre>
     */
    public boolean hasDeviceStatus() {
      return ((bitField0_ & 0x00000100) == 0x00000100);
    }
    /**
     * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
     *
     * <pre>
     * Device status.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus getDeviceStatus() {
      return deviceStatus_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
     *
     * <pre>
     * Device status.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatusOrBuilder getDeviceStatusOrBuilder() {
      return deviceStatus_;
    }

    // optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;
    public static final int EXTERNAL_TIMESTAMP_FIELD_NUMBER = 12;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp externalTimestamp_;
    /**
     * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
     *
     * <pre>
     * A timestamp taken from a source external to the device. For example, a GPS
     *  timestamp. This can be more accurate than the device wall clock, but is not
     *  guaranteed to be. That will depend on the source, and on the device
     *  hardware and software that obtains the timestamp.
     * </pre>
     */
    public boolean hasExternalTimestamp() {
      return ((bitField0_ & 0x00000200) == 0x00000200);
    }
    /**
     * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
     *
     * <pre>
     * A timestamp taken from a source external to the device. For example, a GPS
     *  timestamp. This can be more accurate than the device wall clock, but is not
     *  guaranteed to be. That will depend on the source, and on the device
     *  hardware and software that obtains the timestamp.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp getExternalTimestamp() {
      return externalTimestamp_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
     *
     * <pre>
     * A timestamp taken from a source external to the device. For example, a GPS
     *  timestamp. This can be more accurate than the device wall clock, but is not
     *  guaranteed to be. That will depend on the source, and on the device
     *  hardware and software that obtains the timestamp.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestampOrBuilder getExternalTimestampOrBuilder() {
      return externalTimestamp_;
    }

    private void initFields() {
      requestTimeMs_ = 0L;
      requestUptimeMs_ = 0L;
      clientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.getDefaultInstance();
      logSource_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource.UNKNOWN;
      logSourceName_ = "";
      zwiebackCookie_ = "";
      logEvent_ = java.util.Collections.emptyList();
      serializedLogEvents_ = java.util.Collections.emptyList();
      qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier.DEFAULT;
      scheduler_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType.UNKNOWN_SCHEDULER;
      deviceStatus_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.getDefaultInstance();
      externalTimestamp_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.getDefaultInstance();
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      for (int i = 0; i < getLogEventCount(); i++) {
        if (!getLogEvent(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (!extensionsAreInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      com.google.protobuf.GeneratedMessage
        .ExtendableMessage<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest>.ExtensionWriter extensionWriter =
          newExtensionWriter();
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeMessage(1, clientInfo_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeEnum(2, logSource_.getNumber());
      }
      for (int i = 0; i < logEvent_.size(); i++) {
        output.writeMessage(3, logEvent_.get(i));
      }
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt64(4, requestTimeMs_);
      }
      for (int i = 0; i < serializedLogEvents_.size(); i++) {
        output.writeBytes(5, serializedLogEvents_.get(i));
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        output.writeBytes(6, getLogSourceNameBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        output.writeBytes(7, getZwiebackCookieBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeInt64(8, requestUptimeMs_);
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        output.writeEnum(9, qosTier_.getNumber());
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        output.writeEnum(10, scheduler_.getNumber());
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        output.writeMessage(11, deviceStatus_);
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        output.writeMessage(12, externalTimestamp_);
      }
      extensionWriter.writeUntil(536870912, output);
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(1, clientInfo_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(2, logSource_.getNumber());
      }
      for (int i = 0; i < logEvent_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, logEvent_.get(i));
      }
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(4, requestTimeMs_);
      }
      {
        int dataSize = 0;
        for (int i = 0; i < serializedLogEvents_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeBytesSizeNoTag(serializedLogEvents_.get(i));
        }
        size += dataSize;
        size += 1 * getSerializedLogEventsList().size();
      }
      if (((bitField0_ & 0x00000010) == 0x00000010)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(6, getLogSourceNameBytes());
      }
      if (((bitField0_ & 0x00000020) == 0x00000020)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(7, getZwiebackCookieBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(8, requestUptimeMs_);
      }
      if (((bitField0_ & 0x00000040) == 0x00000040)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(9, qosTier_.getNumber());
      }
      if (((bitField0_ & 0x00000080) == 0x00000080)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(10, scheduler_.getNumber());
      }
      if (((bitField0_ & 0x00000100) == 0x00000100)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(11, deviceStatus_);
      }
      if (((bitField0_ & 0x00000200) == 0x00000200)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(12, externalTimestamp_);
      }
      size += extensionsSerializedSize();
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.LogRequest}
     *
     * <pre>
     * A LogRequest represents a batched collection of loggable events, each event
     *  to be processed and sent to zero or more destinations (e.g. Sawmill log types
     *  or Footprints) by the Clearcut server.
     *
     *  Next tag: 13
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest, Builder> implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequestOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogRequest_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogRequest_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          getClientInfoFieldBuilder();
          getLogEventFieldBuilder();
          getDeviceStatusFieldBuilder();
          getExternalTimestampFieldBuilder();
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        requestTimeMs_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000001);
        requestUptimeMs_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000002);
        if (clientInfoBuilder_ == null) {
          clientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.getDefaultInstance();
        } else {
          clientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        logSource_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource.UNKNOWN;
        bitField0_ = (bitField0_ & ~0x00000008);
        logSourceName_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        zwiebackCookie_ = "";
        bitField0_ = (bitField0_ & ~0x00000020);
        if (logEventBuilder_ == null) {
          logEvent_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000040);
        } else {
          logEventBuilder_.clear();
        }
        serializedLogEvents_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000080);
        qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier.DEFAULT;
        bitField0_ = (bitField0_ & ~0x00000100);
        scheduler_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType.UNKNOWN_SCHEDULER;
        bitField0_ = (bitField0_ & ~0x00000200);
        if (deviceStatusBuilder_ == null) {
          deviceStatus_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.getDefaultInstance();
        } else {
          deviceStatusBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000400);
        if (externalTimestampBuilder_ == null) {
          externalTimestamp_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.getDefaultInstance();
        } else {
          externalTimestampBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000800);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogRequest_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.requestTimeMs_ = requestTimeMs_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.requestUptimeMs_ = requestUptimeMs_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        if (clientInfoBuilder_ == null) {
          result.clientInfo_ = clientInfo_;
        } else {
          result.clientInfo_ = clientInfoBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.logSource_ = logSource_;
        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
          to_bitField0_ |= 0x00000010;
        }
        result.logSourceName_ = logSourceName_;
        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
          to_bitField0_ |= 0x00000020;
        }
        result.zwiebackCookie_ = zwiebackCookie_;
        if (logEventBuilder_ == null) {
          if (((bitField0_ & 0x00000040) == 0x00000040)) {
            logEvent_ = java.util.Collections.unmodifiableList(logEvent_);
            bitField0_ = (bitField0_ & ~0x00000040);
          }
          result.logEvent_ = logEvent_;
        } else {
          result.logEvent_ = logEventBuilder_.build();
        }
        if (((bitField0_ & 0x00000080) == 0x00000080)) {
          serializedLogEvents_ = java.util.Collections.unmodifiableList(serializedLogEvents_);
          bitField0_ = (bitField0_ & ~0x00000080);
        }
        result.serializedLogEvents_ = serializedLogEvents_;
        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
          to_bitField0_ |= 0x00000040;
        }
        result.qosTier_ = qosTier_;
        if (((from_bitField0_ & 0x00000200) == 0x00000200)) {
          to_bitField0_ |= 0x00000080;
        }
        result.scheduler_ = scheduler_;
        if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
          to_bitField0_ |= 0x00000100;
        }
        if (deviceStatusBuilder_ == null) {
          result.deviceStatus_ = deviceStatus_;
        } else {
          result.deviceStatus_ = deviceStatusBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000800) == 0x00000800)) {
          to_bitField0_ |= 0x00000200;
        }
        if (externalTimestampBuilder_ == null) {
          result.externalTimestamp_ = externalTimestamp_;
        } else {
          result.externalTimestamp_ = externalTimestampBuilder_.build();
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.getDefaultInstance()) return this;
        if (other.hasRequestTimeMs()) {
          setRequestTimeMs(other.getRequestTimeMs());
        }
        if (other.hasRequestUptimeMs()) {
          setRequestUptimeMs(other.getRequestUptimeMs());
        }
        if (other.hasClientInfo()) {
          mergeClientInfo(other.getClientInfo());
        }
        if (other.hasLogSource()) {
          setLogSource(other.getLogSource());
        }
        if (other.hasLogSourceName()) {
          bitField0_ |= 0x00000010;
          logSourceName_ = other.logSourceName_;
          onChanged();
        }
        if (other.hasZwiebackCookie()) {
          bitField0_ |= 0x00000020;
          zwiebackCookie_ = other.zwiebackCookie_;
          onChanged();
        }
        if (logEventBuilder_ == null) {
          if (!other.logEvent_.isEmpty()) {
            if (logEvent_.isEmpty()) {
              logEvent_ = other.logEvent_;
              bitField0_ = (bitField0_ & ~0x00000040);
            } else {
              ensureLogEventIsMutable();
              logEvent_.addAll(other.logEvent_);
            }
            onChanged();
          }
        } else {
          if (!other.logEvent_.isEmpty()) {
            if (logEventBuilder_.isEmpty()) {
              logEventBuilder_.dispose();
              logEventBuilder_ = null;
              logEvent_ = other.logEvent_;
              bitField0_ = (bitField0_ & ~0x00000040);
              logEventBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getLogEventFieldBuilder() : null;
            } else {
              logEventBuilder_.addAllMessages(other.logEvent_);
            }
          }
        }
        if (!other.serializedLogEvents_.isEmpty()) {
          if (serializedLogEvents_.isEmpty()) {
            serializedLogEvents_ = other.serializedLogEvents_;
            bitField0_ = (bitField0_ & ~0x00000080);
          } else {
            ensureSerializedLogEventsIsMutable();
            serializedLogEvents_.addAll(other.serializedLogEvents_);
          }
          onChanged();
        }
        if (other.hasQosTier()) {
          setQosTier(other.getQosTier());
        }
        if (other.hasScheduler()) {
          setScheduler(other.getScheduler());
        }
        if (other.hasDeviceStatus()) {
          mergeDeviceStatus(other.getDeviceStatus());
        }
        if (other.hasExternalTimestamp()) {
          mergeExternalTimestamp(other.getExternalTimestamp());
        }
        this.mergeExtensionFields(other);
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        for (int i = 0; i < getLogEventCount(); i++) {
          if (!getLogEvent(i).isInitialized()) {
            
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          
          return false;
        }
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional int64 request_time_ms = 4;
      private long requestTimeMs_ ;
      /**
       * <code>optional int64 request_time_ms = 4;</code>
       *
       * <pre>
       * "Now", in milliseconds, according to the same clock as the one used to set
       *  the 'event_time_ms' values in the LogEvent protos above.
       * </pre>
       */
      public boolean hasRequestTimeMs() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional int64 request_time_ms = 4;</code>
       *
       * <pre>
       * "Now", in milliseconds, according to the same clock as the one used to set
       *  the 'event_time_ms' values in the LogEvent protos above.
       * </pre>
       */
      public long getRequestTimeMs() {
        return requestTimeMs_;
      }
      /**
       * <code>optional int64 request_time_ms = 4;</code>
       *
       * <pre>
       * "Now", in milliseconds, according to the same clock as the one used to set
       *  the 'event_time_ms' values in the LogEvent protos above.
       * </pre>
       */
      public Builder setRequestTimeMs(long value) {
        bitField0_ |= 0x00000001;
        requestTimeMs_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 request_time_ms = 4;</code>
       *
       * <pre>
       * "Now", in milliseconds, according to the same clock as the one used to set
       *  the 'event_time_ms' values in the LogEvent protos above.
       * </pre>
       */
      public Builder clearRequestTimeMs() {
        bitField0_ = (bitField0_ & ~0x00000001);
        requestTimeMs_ = 0L;
        onChanged();
        return this;
      }

      // optional int64 request_uptime_ms = 8;
      private long requestUptimeMs_ ;
      /**
       * <code>optional int64 request_uptime_ms = 8;</code>
       *
       * <pre>
       * Current time since boot in milliseconds, including time spent in sleep,
       *  according to the same clock as the one used to set
       *  the 'event_uptime_ms' values in the LogEvent protos above.
       * </pre>
       */
      public boolean hasRequestUptimeMs() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional int64 request_uptime_ms = 8;</code>
       *
       * <pre>
       * Current time since boot in milliseconds, including time spent in sleep,
       *  according to the same clock as the one used to set
       *  the 'event_uptime_ms' values in the LogEvent protos above.
       * </pre>
       */
      public long getRequestUptimeMs() {
        return requestUptimeMs_;
      }
      /**
       * <code>optional int64 request_uptime_ms = 8;</code>
       *
       * <pre>
       * Current time since boot in milliseconds, including time spent in sleep,
       *  according to the same clock as the one used to set
       *  the 'event_uptime_ms' values in the LogEvent protos above.
       * </pre>
       */
      public Builder setRequestUptimeMs(long value) {
        bitField0_ |= 0x00000002;
        requestUptimeMs_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 request_uptime_ms = 8;</code>
       *
       * <pre>
       * Current time since boot in milliseconds, including time spent in sleep,
       *  according to the same clock as the one used to set
       *  the 'event_uptime_ms' values in the LogEvent protos above.
       * </pre>
       */
      public Builder clearRequestUptimeMs() {
        bitField0_ = (bitField0_ & ~0x00000002);
        requestUptimeMs_ = 0L;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.ClientInfo client_info = 1;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo clientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfoOrBuilder> clientInfoBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
       */
      public boolean hasClientInfo() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo getClientInfo() {
        if (clientInfoBuilder_ == null) {
          return clientInfo_;
        } else {
          return clientInfoBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
       */
      public Builder setClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo value) {
        if (clientInfoBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          clientInfo_ = value;
          onChanged();
        } else {
          clientInfoBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
       */
      public Builder setClientInfo(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.Builder builderForValue) {
        if (clientInfoBuilder_ == null) {
          clientInfo_ = builderForValue.build();
          onChanged();
        } else {
          clientInfoBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
       */
      public Builder mergeClientInfo(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo value) {
        if (clientInfoBuilder_ == null) {
          if (((bitField0_ & 0x00000004) == 0x00000004) &&
              clientInfo_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.getDefaultInstance()) {
            clientInfo_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.newBuilder(clientInfo_).mergeFrom(value).buildPartial();
          } else {
            clientInfo_ = value;
          }
          onChanged();
        } else {
          clientInfoBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
       */
      public Builder clearClientInfo() {
        if (clientInfoBuilder_ == null) {
          clientInfo_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.getDefaultInstance();
          onChanged();
        } else {
          clientInfoBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.Builder getClientInfoBuilder() {
        bitField0_ |= 0x00000004;
        onChanged();
        return getClientInfoFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfoOrBuilder getClientInfoOrBuilder() {
        if (clientInfoBuilder_ != null) {
          return clientInfoBuilder_.getMessageOrBuilder();
        } else {
          return clientInfo_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.ClientInfo client_info = 1;</code>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfoOrBuilder> 
          getClientInfoFieldBuilder() {
        if (clientInfoBuilder_ == null) {
          clientInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfo.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ClientInfoOrBuilder>(
                  clientInfo_,
                  getParentForChildren(),
                  isClean());
          clientInfo_ = null;
        }
        return clientInfoBuilder_;
      }

      // optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource logSource_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource.UNKNOWN;
      /**
       * <code>optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];</code>
       */
      public boolean hasLogSource() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource getLogSource() {
        return logSource_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];</code>
       */
      public Builder setLogSource(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000008;
        logSource_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogRequest.LogSource log_source = 2 [default = UNKNOWN];</code>
       */
      public Builder clearLogSource() {
        bitField0_ = (bitField0_ & ~0x00000008);
        logSource_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.LogSource.UNKNOWN;
        onChanged();
        return this;
      }

      // optional string log_source_name = 6;
      private java.lang.Object logSourceName_ = "";
      /**
       * <code>optional string log_source_name = 6;</code>
       *
       * <pre>
       * If log_source is not present and log_source_name is present, the value of
       *  log_source_name is parsed as a LogSource value and set to log_source.
       * </pre>
       */
      public boolean hasLogSourceName() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      /**
       * <code>optional string log_source_name = 6;</code>
       *
       * <pre>
       * If log_source is not present and log_source_name is present, the value of
       *  log_source_name is parsed as a LogSource value and set to log_source.
       * </pre>
       */
      public java.lang.String getLogSourceName() {
        java.lang.Object ref = logSourceName_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          logSourceName_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string log_source_name = 6;</code>
       *
       * <pre>
       * If log_source is not present and log_source_name is present, the value of
       *  log_source_name is parsed as a LogSource value and set to log_source.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getLogSourceNameBytes() {
        java.lang.Object ref = logSourceName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          logSourceName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string log_source_name = 6;</code>
       *
       * <pre>
       * If log_source is not present and log_source_name is present, the value of
       *  log_source_name is parsed as a LogSource value and set to log_source.
       * </pre>
       */
      public Builder setLogSourceName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        logSourceName_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string log_source_name = 6;</code>
       *
       * <pre>
       * If log_source is not present and log_source_name is present, the value of
       *  log_source_name is parsed as a LogSource value and set to log_source.
       * </pre>
       */
      public Builder clearLogSourceName() {
        bitField0_ = (bitField0_ & ~0x00000010);
        logSourceName_ = getDefaultInstance().getLogSourceName();
        onChanged();
        return this;
      }
      /**
       * <code>optional string log_source_name = 6;</code>
       *
       * <pre>
       * If log_source is not present and log_source_name is present, the value of
       *  log_source_name is parsed as a LogSource value and set to log_source.
       * </pre>
       */
      public Builder setLogSourceNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        logSourceName_ = value;
        onChanged();
        return this;
      }

      // optional string zwieback_cookie = 7;
      private java.lang.Object zwiebackCookie_ = "";
      /**
       * <code>optional string zwieback_cookie = 7;</code>
       *
       * <pre>
       * cookie from pseudonymous id service at the time the event was posted
       * </pre>
       */
      public boolean hasZwiebackCookie() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      /**
       * <code>optional string zwieback_cookie = 7;</code>
       *
       * <pre>
       * cookie from pseudonymous id service at the time the event was posted
       * </pre>
       */
      public java.lang.String getZwiebackCookie() {
        java.lang.Object ref = zwiebackCookie_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          zwiebackCookie_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string zwieback_cookie = 7;</code>
       *
       * <pre>
       * cookie from pseudonymous id service at the time the event was posted
       * </pre>
       */
      public com.google.protobuf.ByteString
          getZwiebackCookieBytes() {
        java.lang.Object ref = zwiebackCookie_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          zwiebackCookie_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string zwieback_cookie = 7;</code>
       *
       * <pre>
       * cookie from pseudonymous id service at the time the event was posted
       * </pre>
       */
      public Builder setZwiebackCookie(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        zwiebackCookie_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string zwieback_cookie = 7;</code>
       *
       * <pre>
       * cookie from pseudonymous id service at the time the event was posted
       * </pre>
       */
      public Builder clearZwiebackCookie() {
        bitField0_ = (bitField0_ & ~0x00000020);
        zwiebackCookie_ = getDefaultInstance().getZwiebackCookie();
        onChanged();
        return this;
      }
      /**
       * <code>optional string zwieback_cookie = 7;</code>
       *
       * <pre>
       * cookie from pseudonymous id service at the time the event was posted
       * </pre>
       */
      public Builder setZwiebackCookieBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
        zwiebackCookie_ = value;
        onChanged();
        return this;
      }

      // repeated .wireless_android_play_playlog.LogEvent log_event = 3;
      private java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent> logEvent_ =
        java.util.Collections.emptyList();
      private void ensureLogEventIsMutable() {
        if (!((bitField0_ & 0x00000040) == 0x00000040)) {
          logEvent_ = new java.util.ArrayList<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent>(logEvent_);
          bitField0_ |= 0x00000040;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventOrBuilder> logEventBuilder_;

      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent> getLogEventList() {
        if (logEventBuilder_ == null) {
          return java.util.Collections.unmodifiableList(logEvent_);
        } else {
          return logEventBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public int getLogEventCount() {
        if (logEventBuilder_ == null) {
          return logEvent_.size();
        } else {
          return logEventBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent getLogEvent(int index) {
        if (logEventBuilder_ == null) {
          return logEvent_.get(index);
        } else {
          return logEventBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public Builder setLogEvent(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent value) {
        if (logEventBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureLogEventIsMutable();
          logEvent_.set(index, value);
          onChanged();
        } else {
          logEventBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public Builder setLogEvent(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder builderForValue) {
        if (logEventBuilder_ == null) {
          ensureLogEventIsMutable();
          logEvent_.set(index, builderForValue.build());
          onChanged();
        } else {
          logEventBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public Builder addLogEvent(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent value) {
        if (logEventBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureLogEventIsMutable();
          logEvent_.add(value);
          onChanged();
        } else {
          logEventBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public Builder addLogEvent(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent value) {
        if (logEventBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureLogEventIsMutable();
          logEvent_.add(index, value);
          onChanged();
        } else {
          logEventBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public Builder addLogEvent(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder builderForValue) {
        if (logEventBuilder_ == null) {
          ensureLogEventIsMutable();
          logEvent_.add(builderForValue.build());
          onChanged();
        } else {
          logEventBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public Builder addLogEvent(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder builderForValue) {
        if (logEventBuilder_ == null) {
          ensureLogEventIsMutable();
          logEvent_.add(index, builderForValue.build());
          onChanged();
        } else {
          logEventBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public Builder addAllLogEvent(
          java.lang.Iterable<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent> values) {
        if (logEventBuilder_ == null) {
          ensureLogEventIsMutable();
          super.addAll(values, logEvent_);
          onChanged();
        } else {
          logEventBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public Builder clearLogEvent() {
        if (logEventBuilder_ == null) {
          logEvent_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000040);
          onChanged();
        } else {
          logEventBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public Builder removeLogEvent(int index) {
        if (logEventBuilder_ == null) {
          ensureLogEventIsMutable();
          logEvent_.remove(index);
          onChanged();
        } else {
          logEventBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder getLogEventBuilder(
          int index) {
        return getLogEventFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventOrBuilder getLogEventOrBuilder(
          int index) {
        if (logEventBuilder_ == null) {
          return logEvent_.get(index);  } else {
          return logEventBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventOrBuilder> 
           getLogEventOrBuilderList() {
        if (logEventBuilder_ != null) {
          return logEventBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(logEvent_);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder addLogEventBuilder() {
        return getLogEventFieldBuilder().addBuilder(
            com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.getDefaultInstance());
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder addLogEventBuilder(
          int index) {
        return getLogEventFieldBuilder().addBuilder(
            index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.getDefaultInstance());
      }
      /**
       * <code>repeated .wireless_android_play_playlog.LogEvent log_event = 3;</code>
       */
      public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder> 
           getLogEventBuilderList() {
        return getLogEventFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventOrBuilder> 
          getLogEventFieldBuilder() {
        if (logEventBuilder_ == null) {
          logEventBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEvent.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogEventOrBuilder>(
                  logEvent_,
                  ((bitField0_ & 0x00000040) == 0x00000040),
                  getParentForChildren(),
                  isClean());
          logEvent_ = null;
        }
        return logEventBuilder_;
      }

      // repeated bytes serialized_log_events = 5;
      private java.util.List<com.google.protobuf.ByteString> serializedLogEvents_ = java.util.Collections.emptyList();
      private void ensureSerializedLogEventsIsMutable() {
        if (!((bitField0_ & 0x00000080) == 0x00000080)) {
          serializedLogEvents_ = new java.util.ArrayList<com.google.protobuf.ByteString>(serializedLogEvents_);
          bitField0_ |= 0x00000080;
         }
      }
      /**
       * <code>repeated bytes serialized_log_events = 5;</code>
       *
       * <pre>
       * Can be used instead of 'log_event' in order to save battery in cases where
       *  LogEvent protos are already serialized, and deserializing is undesirable.
       *  If used, this is a collection of byte streams each produced using a
       *  CodedOutputStream.
       * </pre>
       */
      public java.util.List<com.google.protobuf.ByteString>
          getSerializedLogEventsList() {
        return java.util.Collections.unmodifiableList(serializedLogEvents_);
      }
      /**
       * <code>repeated bytes serialized_log_events = 5;</code>
       *
       * <pre>
       * Can be used instead of 'log_event' in order to save battery in cases where
       *  LogEvent protos are already serialized, and deserializing is undesirable.
       *  If used, this is a collection of byte streams each produced using a
       *  CodedOutputStream.
       * </pre>
       */
      public int getSerializedLogEventsCount() {
        return serializedLogEvents_.size();
      }
      /**
       * <code>repeated bytes serialized_log_events = 5;</code>
       *
       * <pre>
       * Can be used instead of 'log_event' in order to save battery in cases where
       *  LogEvent protos are already serialized, and deserializing is undesirable.
       *  If used, this is a collection of byte streams each produced using a
       *  CodedOutputStream.
       * </pre>
       */
      public com.google.protobuf.ByteString getSerializedLogEvents(int index) {
        return serializedLogEvents_.get(index);
      }
      /**
       * <code>repeated bytes serialized_log_events = 5;</code>
       *
       * <pre>
       * Can be used instead of 'log_event' in order to save battery in cases where
       *  LogEvent protos are already serialized, and deserializing is undesirable.
       *  If used, this is a collection of byte streams each produced using a
       *  CodedOutputStream.
       * </pre>
       */
      public Builder setSerializedLogEvents(
          int index, com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureSerializedLogEventsIsMutable();
        serializedLogEvents_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated bytes serialized_log_events = 5;</code>
       *
       * <pre>
       * Can be used instead of 'log_event' in order to save battery in cases where
       *  LogEvent protos are already serialized, and deserializing is undesirable.
       *  If used, this is a collection of byte streams each produced using a
       *  CodedOutputStream.
       * </pre>
       */
      public Builder addSerializedLogEvents(com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureSerializedLogEventsIsMutable();
        serializedLogEvents_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated bytes serialized_log_events = 5;</code>
       *
       * <pre>
       * Can be used instead of 'log_event' in order to save battery in cases where
       *  LogEvent protos are already serialized, and deserializing is undesirable.
       *  If used, this is a collection of byte streams each produced using a
       *  CodedOutputStream.
       * </pre>
       */
      public Builder addAllSerializedLogEvents(
          java.lang.Iterable<? extends com.google.protobuf.ByteString> values) {
        ensureSerializedLogEventsIsMutable();
        super.addAll(values, serializedLogEvents_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated bytes serialized_log_events = 5;</code>
       *
       * <pre>
       * Can be used instead of 'log_event' in order to save battery in cases where
       *  LogEvent protos are already serialized, and deserializing is undesirable.
       *  If used, this is a collection of byte streams each produced using a
       *  CodedOutputStream.
       * </pre>
       */
      public Builder clearSerializedLogEvents() {
        serializedLogEvents_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000080);
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier.DEFAULT;
      /**
       * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];</code>
       *
       * <pre>
       * Quality of Service tier for log upload.
       * </pre>
       */
      public boolean hasQosTier() {
        return ((bitField0_ & 0x00000100) == 0x00000100);
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];</code>
       *
       * <pre>
       * Quality of Service tier for log upload.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier getQosTier() {
        return qosTier_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];</code>
       *
       * <pre>
       * Quality of Service tier for log upload.
       * </pre>
       */
      public Builder setQosTier(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000100;
        qosTier_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 9 [default = DEFAULT];</code>
       *
       * <pre>
       * Quality of Service tier for log upload.
       * </pre>
       */
      public Builder clearQosTier() {
        bitField0_ = (bitField0_ & ~0x00000100);
        qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier.DEFAULT;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType scheduler_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType.UNKNOWN_SCHEDULER;
      /**
       * <code>optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;</code>
       *
       * <pre>
       * The type of log upload scheduler.
       * </pre>
       */
      public boolean hasScheduler() {
        return ((bitField0_ & 0x00000200) == 0x00000200);
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;</code>
       *
       * <pre>
       * The type of log upload scheduler.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType getScheduler() {
        return scheduler_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;</code>
       *
       * <pre>
       * The type of log upload scheduler.
       * </pre>
       */
      public Builder setScheduler(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000200;
        scheduler_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogRequest.SchedulerType scheduler = 10;</code>
       *
       * <pre>
       * The type of log upload scheduler.
       * </pre>
       */
      public Builder clearScheduler() {
        bitField0_ = (bitField0_ & ~0x00000200);
        scheduler_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogRequest.SchedulerType.UNKNOWN_SCHEDULER;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.DeviceStatus device_status = 11;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus deviceStatus_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatusOrBuilder> deviceStatusBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
       *
       * <pre>
       * Device status.
       * </pre>
       */
      public boolean hasDeviceStatus() {
        return ((bitField0_ & 0x00000400) == 0x00000400);
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
       *
       * <pre>
       * Device status.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus getDeviceStatus() {
        if (deviceStatusBuilder_ == null) {
          return deviceStatus_;
        } else {
          return deviceStatusBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
       *
       * <pre>
       * Device status.
       * </pre>
       */
      public Builder setDeviceStatus(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus value) {
        if (deviceStatusBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          deviceStatus_ = value;
          onChanged();
        } else {
          deviceStatusBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
       *
       * <pre>
       * Device status.
       * </pre>
       */
      public Builder setDeviceStatus(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.Builder builderForValue) {
        if (deviceStatusBuilder_ == null) {
          deviceStatus_ = builderForValue.build();
          onChanged();
        } else {
          deviceStatusBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
       *
       * <pre>
       * Device status.
       * </pre>
       */
      public Builder mergeDeviceStatus(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus value) {
        if (deviceStatusBuilder_ == null) {
          if (((bitField0_ & 0x00000400) == 0x00000400) &&
              deviceStatus_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.getDefaultInstance()) {
            deviceStatus_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.newBuilder(deviceStatus_).mergeFrom(value).buildPartial();
          } else {
            deviceStatus_ = value;
          }
          onChanged();
        } else {
          deviceStatusBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000400;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
       *
       * <pre>
       * Device status.
       * </pre>
       */
      public Builder clearDeviceStatus() {
        if (deviceStatusBuilder_ == null) {
          deviceStatus_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.getDefaultInstance();
          onChanged();
        } else {
          deviceStatusBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000400);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
       *
       * <pre>
       * Device status.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.Builder getDeviceStatusBuilder() {
        bitField0_ |= 0x00000400;
        onChanged();
        return getDeviceStatusFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
       *
       * <pre>
       * Device status.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatusOrBuilder getDeviceStatusOrBuilder() {
        if (deviceStatusBuilder_ != null) {
          return deviceStatusBuilder_.getMessageOrBuilder();
        } else {
          return deviceStatus_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus device_status = 11;</code>
       *
       * <pre>
       * Device status.
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatusOrBuilder> 
          getDeviceStatusFieldBuilder() {
        if (deviceStatusBuilder_ == null) {
          deviceStatusBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatusOrBuilder>(
                  deviceStatus_,
                  getParentForChildren(),
                  isClean());
          deviceStatus_ = null;
        }
        return deviceStatusBuilder_;
      }

      // optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp externalTimestamp_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestampOrBuilder> externalTimestampBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
       *
       * <pre>
       * A timestamp taken from a source external to the device. For example, a GPS
       *  timestamp. This can be more accurate than the device wall clock, but is not
       *  guaranteed to be. That will depend on the source, and on the device
       *  hardware and software that obtains the timestamp.
       * </pre>
       */
      public boolean hasExternalTimestamp() {
        return ((bitField0_ & 0x00000800) == 0x00000800);
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
       *
       * <pre>
       * A timestamp taken from a source external to the device. For example, a GPS
       *  timestamp. This can be more accurate than the device wall clock, but is not
       *  guaranteed to be. That will depend on the source, and on the device
       *  hardware and software that obtains the timestamp.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp getExternalTimestamp() {
        if (externalTimestampBuilder_ == null) {
          return externalTimestamp_;
        } else {
          return externalTimestampBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
       *
       * <pre>
       * A timestamp taken from a source external to the device. For example, a GPS
       *  timestamp. This can be more accurate than the device wall clock, but is not
       *  guaranteed to be. That will depend on the source, and on the device
       *  hardware and software that obtains the timestamp.
       * </pre>
       */
      public Builder setExternalTimestamp(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp value) {
        if (externalTimestampBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          externalTimestamp_ = value;
          onChanged();
        } else {
          externalTimestampBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
       *
       * <pre>
       * A timestamp taken from a source external to the device. For example, a GPS
       *  timestamp. This can be more accurate than the device wall clock, but is not
       *  guaranteed to be. That will depend on the source, and on the device
       *  hardware and software that obtains the timestamp.
       * </pre>
       */
      public Builder setExternalTimestamp(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.Builder builderForValue) {
        if (externalTimestampBuilder_ == null) {
          externalTimestamp_ = builderForValue.build();
          onChanged();
        } else {
          externalTimestampBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
       *
       * <pre>
       * A timestamp taken from a source external to the device. For example, a GPS
       *  timestamp. This can be more accurate than the device wall clock, but is not
       *  guaranteed to be. That will depend on the source, and on the device
       *  hardware and software that obtains the timestamp.
       * </pre>
       */
      public Builder mergeExternalTimestamp(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp value) {
        if (externalTimestampBuilder_ == null) {
          if (((bitField0_ & 0x00000800) == 0x00000800) &&
              externalTimestamp_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.getDefaultInstance()) {
            externalTimestamp_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.newBuilder(externalTimestamp_).mergeFrom(value).buildPartial();
          } else {
            externalTimestamp_ = value;
          }
          onChanged();
        } else {
          externalTimestampBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000800;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
       *
       * <pre>
       * A timestamp taken from a source external to the device. For example, a GPS
       *  timestamp. This can be more accurate than the device wall clock, but is not
       *  guaranteed to be. That will depend on the source, and on the device
       *  hardware and software that obtains the timestamp.
       * </pre>
       */
      public Builder clearExternalTimestamp() {
        if (externalTimestampBuilder_ == null) {
          externalTimestamp_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.getDefaultInstance();
          onChanged();
        } else {
          externalTimestampBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000800);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
       *
       * <pre>
       * A timestamp taken from a source external to the device. For example, a GPS
       *  timestamp. This can be more accurate than the device wall clock, but is not
       *  guaranteed to be. That will depend on the source, and on the device
       *  hardware and software that obtains the timestamp.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.Builder getExternalTimestampBuilder() {
        bitField0_ |= 0x00000800;
        onChanged();
        return getExternalTimestampFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
       *
       * <pre>
       * A timestamp taken from a source external to the device. For example, a GPS
       *  timestamp. This can be more accurate than the device wall clock, but is not
       *  guaranteed to be. That will depend on the source, and on the device
       *  hardware and software that obtains the timestamp.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestampOrBuilder getExternalTimestampOrBuilder() {
        if (externalTimestampBuilder_ != null) {
          return externalTimestampBuilder_.getMessageOrBuilder();
        } else {
          return externalTimestamp_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExternalTimestamp external_timestamp = 12;</code>
       *
       * <pre>
       * A timestamp taken from a source external to the device. For example, a GPS
       *  timestamp. This can be more accurate than the device wall clock, but is not
       *  guaranteed to be. That will depend on the source, and on the device
       *  hardware and software that obtains the timestamp.
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestampOrBuilder> 
          getExternalTimestampFieldBuilder() {
        if (externalTimestampBuilder_ == null) {
          externalTimestampBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestampOrBuilder>(
                  externalTimestamp_,
                  getParentForChildren(),
                  isClean());
          externalTimestamp_ = null;
        }
        return externalTimestampBuilder_;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.LogRequest)
    }

    static {
      defaultInstance = new LogRequest(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.LogRequest)
  }

  public interface DeviceStatusOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional bool is_unmetered = 1;
    /**
     * <code>optional bool is_unmetered = 1;</code>
     *
     * <pre>
     * Whether device network connection is unmetered.
     * </pre>
     */
    boolean hasIsUnmetered();
    /**
     * <code>optional bool is_unmetered = 1;</code>
     *
     * <pre>
     * Whether device network connection is unmetered.
     * </pre>
     */
    boolean getIsUnmetered();

    // optional bool is_charging = 2;
    /**
     * <code>optional bool is_charging = 2;</code>
     *
     * <pre>
     * Whether device is under charge. See link
     *  http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
     *  This boolean returns true when status equals to
     *  BatteryManager.BATTERY_STATUS_CHARGING || BatteryManager.BATTERY_STATUS_FULL
     * </pre>
     */
    boolean hasIsCharging();
    /**
     * <code>optional bool is_charging = 2;</code>
     *
     * <pre>
     * Whether device is under charge. See link
     *  http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
     *  This boolean returns true when status equals to
     *  BatteryManager.BATTERY_STATUS_CHARGING || BatteryManager.BATTERY_STATUS_FULL
     * </pre>
     */
    boolean getIsCharging();

    // optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;
    /**
     * <code>optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;</code>
     *
     * <pre>
     * Whether automatic date and time is enabled on the device. See link
     *  http://developer.android.com/reference/android/provider/Settings.Global.html#AUTO_TIME
     *  Note, this does not guarantee correct device clock if NTP clock sync has
     *  not occurred.
     * </pre>
     */
    boolean hasAutoTimeStatus();
    /**
     * <code>optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;</code>
     *
     * <pre>
     * Whether automatic date and time is enabled on the device. See link
     *  http://developer.android.com/reference/android/provider/Settings.Global.html#AUTO_TIME
     *  Note, this does not guarantee correct device clock if NTP clock sync has
     *  not occurred.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime getAutoTimeStatus();

    // optional bool is_googler_device = 4;
    /**
     * <code>optional bool is_googler_device = 4;</code>
     *
     * <pre>
     * Is true if the device contains an account that has the @google.com domain.
     * </pre>
     */
    boolean hasIsGooglerDevice();
    /**
     * <code>optional bool is_googler_device = 4;</code>
     *
     * <pre>
     * Is true if the device contains an account that has the @google.com domain.
     * </pre>
     */
    boolean getIsGooglerDevice();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.DeviceStatus}
   *
   * <pre>
   * DeviceStatus captures device status including network connection status,
   *  battery status, and etc.
   *  Next tag: 5
   * </pre>
   */
  public static final class DeviceStatus extends
      com.google.protobuf.GeneratedMessage
      implements DeviceStatusOrBuilder {
    // Use DeviceStatus.newBuilder() to construct.
    private DeviceStatus(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private DeviceStatus(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final DeviceStatus defaultInstance;
    public static DeviceStatus getDefaultInstance() {
      return defaultInstance;
    }

    public DeviceStatus getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private DeviceStatus(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              bitField0_ |= 0x00000001;
              isUnmetered_ = input.readBool();
              break;
            }
            case 16: {
              bitField0_ |= 0x00000002;
              isCharging_ = input.readBool();
              break;
            }
            case 24: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(3, rawValue);
              } else {
                bitField0_ |= 0x00000004;
                autoTimeStatus_ = value;
              }
              break;
            }
            case 32: {
              bitField0_ |= 0x00000008;
              isGooglerDevice_ = input.readBool();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_DeviceStatus_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_DeviceStatus_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.Builder.class);
    }

    public static com.google.protobuf.Parser<DeviceStatus> PARSER =
        new com.google.protobuf.AbstractParser<DeviceStatus>() {
      public DeviceStatus parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new DeviceStatus(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<DeviceStatus> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.DeviceStatus.AutomaticTime}
     *
     * <pre>
     * Status of automatic date and time setting.
     * </pre>
     */
    public enum AutomaticTime
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>UNKNOWN = 0;</code>
       *
       * <pre>
       * Device is using an older version of GmsCore (before U), or there was a
       *  problem getting the setting.
       * </pre>
       */
      UNKNOWN(0, 0),
      /**
       * <code>AUTO_TIME_OFF = 1;</code>
       *
       * <pre>
       * Automatic date and time was not enabled.
       * </pre>
       */
      AUTO_TIME_OFF(1, 1),
      /**
       * <code>AUTO_TIME_ON = 2;</code>
       *
       * <pre>
       * Automatic date and time was enabled.
       * </pre>
       */
      AUTO_TIME_ON(2, 2),
      ;

      /**
       * <code>UNKNOWN = 0;</code>
       *
       * <pre>
       * Device is using an older version of GmsCore (before U), or there was a
       *  problem getting the setting.
       * </pre>
       */
      public static final int UNKNOWN_VALUE = 0;
      /**
       * <code>AUTO_TIME_OFF = 1;</code>
       *
       * <pre>
       * Automatic date and time was not enabled.
       * </pre>
       */
      public static final int AUTO_TIME_OFF_VALUE = 1;
      /**
       * <code>AUTO_TIME_ON = 2;</code>
       *
       * <pre>
       * Automatic date and time was enabled.
       * </pre>
       */
      public static final int AUTO_TIME_ON_VALUE = 2;


      public final int getNumber() { return value; }

      public static AutomaticTime valueOf(int value) {
        switch (value) {
          case 0: return UNKNOWN;
          case 1: return AUTO_TIME_OFF;
          case 2: return AUTO_TIME_ON;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<AutomaticTime>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<AutomaticTime>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<AutomaticTime>() {
              public AutomaticTime findValueByNumber(int number) {
                return AutomaticTime.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.getDescriptor().getEnumTypes().get(0);
      }

      private static final AutomaticTime[] VALUES = values();

      public static AutomaticTime valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private AutomaticTime(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.DeviceStatus.AutomaticTime)
    }

    private int bitField0_;
    // optional bool is_unmetered = 1;
    public static final int IS_UNMETERED_FIELD_NUMBER = 1;
    private boolean isUnmetered_;
    /**
     * <code>optional bool is_unmetered = 1;</code>
     *
     * <pre>
     * Whether device network connection is unmetered.
     * </pre>
     */
    public boolean hasIsUnmetered() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional bool is_unmetered = 1;</code>
     *
     * <pre>
     * Whether device network connection is unmetered.
     * </pre>
     */
    public boolean getIsUnmetered() {
      return isUnmetered_;
    }

    // optional bool is_charging = 2;
    public static final int IS_CHARGING_FIELD_NUMBER = 2;
    private boolean isCharging_;
    /**
     * <code>optional bool is_charging = 2;</code>
     *
     * <pre>
     * Whether device is under charge. See link
     *  http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
     *  This boolean returns true when status equals to
     *  BatteryManager.BATTERY_STATUS_CHARGING || BatteryManager.BATTERY_STATUS_FULL
     * </pre>
     */
    public boolean hasIsCharging() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional bool is_charging = 2;</code>
     *
     * <pre>
     * Whether device is under charge. See link
     *  http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
     *  This boolean returns true when status equals to
     *  BatteryManager.BATTERY_STATUS_CHARGING || BatteryManager.BATTERY_STATUS_FULL
     * </pre>
     */
    public boolean getIsCharging() {
      return isCharging_;
    }

    // optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;
    public static final int AUTO_TIME_STATUS_FIELD_NUMBER = 3;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime autoTimeStatus_;
    /**
     * <code>optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;</code>
     *
     * <pre>
     * Whether automatic date and time is enabled on the device. See link
     *  http://developer.android.com/reference/android/provider/Settings.Global.html#AUTO_TIME
     *  Note, this does not guarantee correct device clock if NTP clock sync has
     *  not occurred.
     * </pre>
     */
    public boolean hasAutoTimeStatus() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;</code>
     *
     * <pre>
     * Whether automatic date and time is enabled on the device. See link
     *  http://developer.android.com/reference/android/provider/Settings.Global.html#AUTO_TIME
     *  Note, this does not guarantee correct device clock if NTP clock sync has
     *  not occurred.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime getAutoTimeStatus() {
      return autoTimeStatus_;
    }

    // optional bool is_googler_device = 4;
    public static final int IS_GOOGLER_DEVICE_FIELD_NUMBER = 4;
    private boolean isGooglerDevice_;
    /**
     * <code>optional bool is_googler_device = 4;</code>
     *
     * <pre>
     * Is true if the device contains an account that has the @google.com domain.
     * </pre>
     */
    public boolean hasIsGooglerDevice() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional bool is_googler_device = 4;</code>
     *
     * <pre>
     * Is true if the device contains an account that has the @google.com domain.
     * </pre>
     */
    public boolean getIsGooglerDevice() {
      return isGooglerDevice_;
    }

    private void initFields() {
      isUnmetered_ = false;
      isCharging_ = false;
      autoTimeStatus_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime.UNKNOWN;
      isGooglerDevice_ = false;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBool(1, isUnmetered_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeBool(2, isCharging_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeEnum(3, autoTimeStatus_.getNumber());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeBool(4, isGooglerDevice_);
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(1, isUnmetered_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(2, isCharging_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(3, autoTimeStatus_.getNumber());
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(4, isGooglerDevice_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.DeviceStatus}
     *
     * <pre>
     * DeviceStatus captures device status including network connection status,
     *  battery status, and etc.
     *  Next tag: 5
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatusOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_DeviceStatus_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_DeviceStatus_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        isUnmetered_ = false;
        bitField0_ = (bitField0_ & ~0x00000001);
        isCharging_ = false;
        bitField0_ = (bitField0_ & ~0x00000002);
        autoTimeStatus_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime.UNKNOWN;
        bitField0_ = (bitField0_ & ~0x00000004);
        isGooglerDevice_ = false;
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_DeviceStatus_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.isUnmetered_ = isUnmetered_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.isCharging_ = isCharging_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.autoTimeStatus_ = autoTimeStatus_;
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        result.isGooglerDevice_ = isGooglerDevice_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.getDefaultInstance()) return this;
        if (other.hasIsUnmetered()) {
          setIsUnmetered(other.getIsUnmetered());
        }
        if (other.hasIsCharging()) {
          setIsCharging(other.getIsCharging());
        }
        if (other.hasAutoTimeStatus()) {
          setAutoTimeStatus(other.getAutoTimeStatus());
        }
        if (other.hasIsGooglerDevice()) {
          setIsGooglerDevice(other.getIsGooglerDevice());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional bool is_unmetered = 1;
      private boolean isUnmetered_ ;
      /**
       * <code>optional bool is_unmetered = 1;</code>
       *
       * <pre>
       * Whether device network connection is unmetered.
       * </pre>
       */
      public boolean hasIsUnmetered() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional bool is_unmetered = 1;</code>
       *
       * <pre>
       * Whether device network connection is unmetered.
       * </pre>
       */
      public boolean getIsUnmetered() {
        return isUnmetered_;
      }
      /**
       * <code>optional bool is_unmetered = 1;</code>
       *
       * <pre>
       * Whether device network connection is unmetered.
       * </pre>
       */
      public Builder setIsUnmetered(boolean value) {
        bitField0_ |= 0x00000001;
        isUnmetered_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool is_unmetered = 1;</code>
       *
       * <pre>
       * Whether device network connection is unmetered.
       * </pre>
       */
      public Builder clearIsUnmetered() {
        bitField0_ = (bitField0_ & ~0x00000001);
        isUnmetered_ = false;
        onChanged();
        return this;
      }

      // optional bool is_charging = 2;
      private boolean isCharging_ ;
      /**
       * <code>optional bool is_charging = 2;</code>
       *
       * <pre>
       * Whether device is under charge. See link
       *  http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
       *  This boolean returns true when status equals to
       *  BatteryManager.BATTERY_STATUS_CHARGING || BatteryManager.BATTERY_STATUS_FULL
       * </pre>
       */
      public boolean hasIsCharging() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional bool is_charging = 2;</code>
       *
       * <pre>
       * Whether device is under charge. See link
       *  http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
       *  This boolean returns true when status equals to
       *  BatteryManager.BATTERY_STATUS_CHARGING || BatteryManager.BATTERY_STATUS_FULL
       * </pre>
       */
      public boolean getIsCharging() {
        return isCharging_;
      }
      /**
       * <code>optional bool is_charging = 2;</code>
       *
       * <pre>
       * Whether device is under charge. See link
       *  http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
       *  This boolean returns true when status equals to
       *  BatteryManager.BATTERY_STATUS_CHARGING || BatteryManager.BATTERY_STATUS_FULL
       * </pre>
       */
      public Builder setIsCharging(boolean value) {
        bitField0_ |= 0x00000002;
        isCharging_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool is_charging = 2;</code>
       *
       * <pre>
       * Whether device is under charge. See link
       *  http://developer.android.com/training/monitoring-device-state/battery-monitoring.html
       *  This boolean returns true when status equals to
       *  BatteryManager.BATTERY_STATUS_CHARGING || BatteryManager.BATTERY_STATUS_FULL
       * </pre>
       */
      public Builder clearIsCharging() {
        bitField0_ = (bitField0_ & ~0x00000002);
        isCharging_ = false;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime autoTimeStatus_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime.UNKNOWN;
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;</code>
       *
       * <pre>
       * Whether automatic date and time is enabled on the device. See link
       *  http://developer.android.com/reference/android/provider/Settings.Global.html#AUTO_TIME
       *  Note, this does not guarantee correct device clock if NTP clock sync has
       *  not occurred.
       * </pre>
       */
      public boolean hasAutoTimeStatus() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;</code>
       *
       * <pre>
       * Whether automatic date and time is enabled on the device. See link
       *  http://developer.android.com/reference/android/provider/Settings.Global.html#AUTO_TIME
       *  Note, this does not guarantee correct device clock if NTP clock sync has
       *  not occurred.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime getAutoTimeStatus() {
        return autoTimeStatus_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;</code>
       *
       * <pre>
       * Whether automatic date and time is enabled on the device. See link
       *  http://developer.android.com/reference/android/provider/Settings.Global.html#AUTO_TIME
       *  Note, this does not guarantee correct device clock if NTP clock sync has
       *  not occurred.
       * </pre>
       */
      public Builder setAutoTimeStatus(com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000004;
        autoTimeStatus_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.DeviceStatus.AutomaticTime auto_time_status = 3;</code>
       *
       * <pre>
       * Whether automatic date and time is enabled on the device. See link
       *  http://developer.android.com/reference/android/provider/Settings.Global.html#AUTO_TIME
       *  Note, this does not guarantee correct device clock if NTP clock sync has
       *  not occurred.
       * </pre>
       */
      public Builder clearAutoTimeStatus() {
        bitField0_ = (bitField0_ & ~0x00000004);
        autoTimeStatus_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.DeviceStatus.AutomaticTime.UNKNOWN;
        onChanged();
        return this;
      }

      // optional bool is_googler_device = 4;
      private boolean isGooglerDevice_ ;
      /**
       * <code>optional bool is_googler_device = 4;</code>
       *
       * <pre>
       * Is true if the device contains an account that has the @google.com domain.
       * </pre>
       */
      public boolean hasIsGooglerDevice() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional bool is_googler_device = 4;</code>
       *
       * <pre>
       * Is true if the device contains an account that has the @google.com domain.
       * </pre>
       */
      public boolean getIsGooglerDevice() {
        return isGooglerDevice_;
      }
      /**
       * <code>optional bool is_googler_device = 4;</code>
       *
       * <pre>
       * Is true if the device contains an account that has the @google.com domain.
       * </pre>
       */
      public Builder setIsGooglerDevice(boolean value) {
        bitField0_ |= 0x00000008;
        isGooglerDevice_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional bool is_googler_device = 4;</code>
       *
       * <pre>
       * Is true if the device contains an account that has the @google.com domain.
       * </pre>
       */
      public Builder clearIsGooglerDevice() {
        bitField0_ = (bitField0_ & ~0x00000008);
        isGooglerDevice_ = false;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.DeviceStatus)
    }

    static {
      defaultInstance = new DeviceStatus(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.DeviceStatus)
  }

  public interface ExternalTimestampOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional int64 time_ms = 1;
    /**
     * <code>optional int64 time_ms = 1;</code>
     *
     * <pre>
     * A timestamp given by an external source.
     * </pre>
     */
    boolean hasTimeMs();
    /**
     * <code>optional int64 time_ms = 1;</code>
     *
     * <pre>
     * A timestamp given by an external source.
     * </pre>
     */
    long getTimeMs();

    // optional int64 uptime_ms = 2;
    /**
     * <code>optional int64 uptime_ms = 2;</code>
     *
     * <pre>
     * The device uptime when the timestamp was recorded.
     * </pre>
     */
    boolean hasUptimeMs();
    /**
     * <code>optional int64 uptime_ms = 2;</code>
     *
     * <pre>
     * The device uptime when the timestamp was recorded.
     * </pre>
     */
    long getUptimeMs();

    // optional string source = 3;
    /**
     * <code>optional string source = 3;</code>
     *
     * <pre>
     * The name of the source that provided the timestamp.
     * </pre>
     */
    boolean hasSource();
    /**
     * <code>optional string source = 3;</code>
     *
     * <pre>
     * The name of the source that provided the timestamp.
     * </pre>
     */
    java.lang.String getSource();
    /**
     * <code>optional string source = 3;</code>
     *
     * <pre>
     * The name of the source that provided the timestamp.
     * </pre>
     */
    com.google.protobuf.ByteString
        getSourceBytes();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.ExternalTimestamp}
   *
   * <pre>
   * ExternalTimestamp captures a timestamp obtained by an external source. This
   *  can be GPS or clock sync over the network. The timestamp is typically old, so
   *  the device uptime when the timestamp was obtained is also included. The
   *  source of this timestamp must guarantee that the timestamp is not older than
   *  the most recent device boot.
   *  Next tag: 4
   * </pre>
   */
  public static final class ExternalTimestamp extends
      com.google.protobuf.GeneratedMessage
      implements ExternalTimestampOrBuilder {
    // Use ExternalTimestamp.newBuilder() to construct.
    private ExternalTimestamp(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private ExternalTimestamp(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final ExternalTimestamp defaultInstance;
    public static ExternalTimestamp getDefaultInstance() {
      return defaultInstance;
    }

    public ExternalTimestamp getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private ExternalTimestamp(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              bitField0_ |= 0x00000001;
              timeMs_ = input.readInt64();
              break;
            }
            case 16: {
              bitField0_ |= 0x00000002;
              uptimeMs_ = input.readInt64();
              break;
            }
            case 26: {
              bitField0_ |= 0x00000004;
              source_ = input.readBytes();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExternalTimestamp_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExternalTimestamp_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.Builder.class);
    }

    public static com.google.protobuf.Parser<ExternalTimestamp> PARSER =
        new com.google.protobuf.AbstractParser<ExternalTimestamp>() {
      public ExternalTimestamp parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new ExternalTimestamp(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<ExternalTimestamp> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // optional int64 time_ms = 1;
    public static final int TIME_MS_FIELD_NUMBER = 1;
    private long timeMs_;
    /**
     * <code>optional int64 time_ms = 1;</code>
     *
     * <pre>
     * A timestamp given by an external source.
     * </pre>
     */
    public boolean hasTimeMs() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional int64 time_ms = 1;</code>
     *
     * <pre>
     * A timestamp given by an external source.
     * </pre>
     */
    public long getTimeMs() {
      return timeMs_;
    }

    // optional int64 uptime_ms = 2;
    public static final int UPTIME_MS_FIELD_NUMBER = 2;
    private long uptimeMs_;
    /**
     * <code>optional int64 uptime_ms = 2;</code>
     *
     * <pre>
     * The device uptime when the timestamp was recorded.
     * </pre>
     */
    public boolean hasUptimeMs() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional int64 uptime_ms = 2;</code>
     *
     * <pre>
     * The device uptime when the timestamp was recorded.
     * </pre>
     */
    public long getUptimeMs() {
      return uptimeMs_;
    }

    // optional string source = 3;
    public static final int SOURCE_FIELD_NUMBER = 3;
    private java.lang.Object source_;
    /**
     * <code>optional string source = 3;</code>
     *
     * <pre>
     * The name of the source that provided the timestamp.
     * </pre>
     */
    public boolean hasSource() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional string source = 3;</code>
     *
     * <pre>
     * The name of the source that provided the timestamp.
     * </pre>
     */
    public java.lang.String getSource() {
      java.lang.Object ref = source_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          source_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string source = 3;</code>
     *
     * <pre>
     * The name of the source that provided the timestamp.
     * </pre>
     */
    public com.google.protobuf.ByteString
        getSourceBytes() {
      java.lang.Object ref = source_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        source_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    private void initFields() {
      timeMs_ = 0L;
      uptimeMs_ = 0L;
      source_ = "";
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt64(1, timeMs_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeInt64(2, uptimeMs_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeBytes(3, getSourceBytes());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(1, timeMs_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(2, uptimeMs_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(3, getSourceBytes());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.ExternalTimestamp}
     *
     * <pre>
     * ExternalTimestamp captures a timestamp obtained by an external source. This
     *  can be GPS or clock sync over the network. The timestamp is typically old, so
     *  the device uptime when the timestamp was obtained is also included. The
     *  source of this timestamp must guarantee that the timestamp is not older than
     *  the most recent device boot.
     *  Next tag: 4
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestampOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExternalTimestamp_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExternalTimestamp_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        timeMs_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000001);
        uptimeMs_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000002);
        source_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_ExternalTimestamp_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.timeMs_ = timeMs_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.uptimeMs_ = uptimeMs_;
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        result.source_ = source_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp.getDefaultInstance()) return this;
        if (other.hasTimeMs()) {
          setTimeMs(other.getTimeMs());
        }
        if (other.hasUptimeMs()) {
          setUptimeMs(other.getUptimeMs());
        }
        if (other.hasSource()) {
          bitField0_ |= 0x00000004;
          source_ = other.source_;
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExternalTimestamp) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional int64 time_ms = 1;
      private long timeMs_ ;
      /**
       * <code>optional int64 time_ms = 1;</code>
       *
       * <pre>
       * A timestamp given by an external source.
       * </pre>
       */
      public boolean hasTimeMs() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional int64 time_ms = 1;</code>
       *
       * <pre>
       * A timestamp given by an external source.
       * </pre>
       */
      public long getTimeMs() {
        return timeMs_;
      }
      /**
       * <code>optional int64 time_ms = 1;</code>
       *
       * <pre>
       * A timestamp given by an external source.
       * </pre>
       */
      public Builder setTimeMs(long value) {
        bitField0_ |= 0x00000001;
        timeMs_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 time_ms = 1;</code>
       *
       * <pre>
       * A timestamp given by an external source.
       * </pre>
       */
      public Builder clearTimeMs() {
        bitField0_ = (bitField0_ & ~0x00000001);
        timeMs_ = 0L;
        onChanged();
        return this;
      }

      // optional int64 uptime_ms = 2;
      private long uptimeMs_ ;
      /**
       * <code>optional int64 uptime_ms = 2;</code>
       *
       * <pre>
       * The device uptime when the timestamp was recorded.
       * </pre>
       */
      public boolean hasUptimeMs() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional int64 uptime_ms = 2;</code>
       *
       * <pre>
       * The device uptime when the timestamp was recorded.
       * </pre>
       */
      public long getUptimeMs() {
        return uptimeMs_;
      }
      /**
       * <code>optional int64 uptime_ms = 2;</code>
       *
       * <pre>
       * The device uptime when the timestamp was recorded.
       * </pre>
       */
      public Builder setUptimeMs(long value) {
        bitField0_ |= 0x00000002;
        uptimeMs_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 uptime_ms = 2;</code>
       *
       * <pre>
       * The device uptime when the timestamp was recorded.
       * </pre>
       */
      public Builder clearUptimeMs() {
        bitField0_ = (bitField0_ & ~0x00000002);
        uptimeMs_ = 0L;
        onChanged();
        return this;
      }

      // optional string source = 3;
      private java.lang.Object source_ = "";
      /**
       * <code>optional string source = 3;</code>
       *
       * <pre>
       * The name of the source that provided the timestamp.
       * </pre>
       */
      public boolean hasSource() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional string source = 3;</code>
       *
       * <pre>
       * The name of the source that provided the timestamp.
       * </pre>
       */
      public java.lang.String getSource() {
        java.lang.Object ref = source_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          source_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string source = 3;</code>
       *
       * <pre>
       * The name of the source that provided the timestamp.
       * </pre>
       */
      public com.google.protobuf.ByteString
          getSourceBytes() {
        java.lang.Object ref = source_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          source_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string source = 3;</code>
       *
       * <pre>
       * The name of the source that provided the timestamp.
       * </pre>
       */
      public Builder setSource(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        source_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string source = 3;</code>
       *
       * <pre>
       * The name of the source that provided the timestamp.
       * </pre>
       */
      public Builder clearSource() {
        bitField0_ = (bitField0_ & ~0x00000004);
        source_ = getDefaultInstance().getSource();
        onChanged();
        return this;
      }
      /**
       * <code>optional string source = 3;</code>
       *
       * <pre>
       * The name of the source that provided the timestamp.
       * </pre>
       */
      public Builder setSourceBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        source_ = value;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.ExternalTimestamp)
    }

    static {
      defaultInstance = new ExternalTimestamp(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.ExternalTimestamp)
  }

  public interface QosTierConfigurationOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional string log_source_name = 1;
    /**
     * <code>optional string log_source_name = 1;</code>
     */
    boolean hasLogSourceName();
    /**
     * <code>optional string log_source_name = 1;</code>
     */
    java.lang.String getLogSourceName();
    /**
     * <code>optional string log_source_name = 1;</code>
     */
    com.google.protobuf.ByteString
        getLogSourceNameBytes();

    // optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;
    /**
     * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;</code>
     */
    boolean hasQosTier();
    /**
     * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;</code>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier getQosTier();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.QosTierConfiguration}
   *
   * <pre>
   * QosTierConfiguration configures what Quality of Service tier should be
   *  applied to a given log source.
   *
   *  Next tag: 3
   * </pre>
   */
  public static final class QosTierConfiguration extends
      com.google.protobuf.GeneratedMessage
      implements QosTierConfigurationOrBuilder {
    // Use QosTierConfiguration.newBuilder() to construct.
    private QosTierConfiguration(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private QosTierConfiguration(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final QosTierConfiguration defaultInstance;
    public static QosTierConfiguration getDefaultInstance() {
      return defaultInstance;
    }

    public QosTierConfiguration getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private QosTierConfiguration(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              bitField0_ |= 0x00000001;
              logSourceName_ = input.readBytes();
              break;
            }
            case 16: {
              int rawValue = input.readEnum();
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier value = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier.valueOf(rawValue);
              if (value == null) {
                unknownFields.mergeVarintField(2, rawValue);
              } else {
                bitField0_ |= 0x00000002;
                qosTier_ = value;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_QosTierConfiguration_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_QosTierConfiguration_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder.class);
    }

    public static com.google.protobuf.Parser<QosTierConfiguration> PARSER =
        new com.google.protobuf.AbstractParser<QosTierConfiguration>() {
      public QosTierConfiguration parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new QosTierConfiguration(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<QosTierConfiguration> getParserForType() {
      return PARSER;
    }

    /**
     * Protobuf enum {@code wireless_android_play_playlog.QosTierConfiguration.QosTier}
     *
     * <pre>
     * Quality of Service tiers for Clearcut log upload.
     * </pre>
     */
    public enum QosTier
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>DEFAULT = 0;</code>
       *
       * <pre>
       * Use GcmNetworkManager to schedule logs upload every hour.
       * </pre>
       */
      DEFAULT(0, 0),
      /**
       * <code>UNMETERED_ONLY = 1;</code>
       *
       * <pre>
       * Log will be uploaded when the device is on an unmetered network.
       *  Note that devices that rarely or never connect to unmetered networks
       *  will end up losing many or all of these messages.
       * </pre>
       */
      UNMETERED_ONLY(1, 1),
      /**
       * <code>UNMETERED_OR_DAILY = 2;</code>
       *
       * <pre>
       * Similar to the previous one, but if an upload opportunity does not arise
       *  near to the end of the day, Clearcut will upload the data as soon as
       *  the device is online (even if on a metered network).
       * </pre>
       */
      UNMETERED_OR_DAILY(2, 2),
      /**
       * <code>FAST_IF_RADIO_AWAKE = 3;</code>
       *
       * <pre>
       * Log will be uploaded as soon as the device is using the radio.
       *  If not, log will be uploaded at the next DEFAULT-tier upload time.
       * </pre>
       */
      FAST_IF_RADIO_AWAKE(3, 3),
      /**
       * <code>NEVER = 4;</code>
       *
       * <pre>
       * This is for server to override client QosTier setting.
       *  If a certain log source's QosTier is set to NEVER, then Clearcut will
       *  drop log events of that log source immediately and won't save them in
       *  log store.
       * </pre>
       */
      NEVER(4, 4),
      ;

      /**
       * <code>DEFAULT = 0;</code>
       *
       * <pre>
       * Use GcmNetworkManager to schedule logs upload every hour.
       * </pre>
       */
      public static final int DEFAULT_VALUE = 0;
      /**
       * <code>UNMETERED_ONLY = 1;</code>
       *
       * <pre>
       * Log will be uploaded when the device is on an unmetered network.
       *  Note that devices that rarely or never connect to unmetered networks
       *  will end up losing many or all of these messages.
       * </pre>
       */
      public static final int UNMETERED_ONLY_VALUE = 1;
      /**
       * <code>UNMETERED_OR_DAILY = 2;</code>
       *
       * <pre>
       * Similar to the previous one, but if an upload opportunity does not arise
       *  near to the end of the day, Clearcut will upload the data as soon as
       *  the device is online (even if on a metered network).
       * </pre>
       */
      public static final int UNMETERED_OR_DAILY_VALUE = 2;
      /**
       * <code>FAST_IF_RADIO_AWAKE = 3;</code>
       *
       * <pre>
       * Log will be uploaded as soon as the device is using the radio.
       *  If not, log will be uploaded at the next DEFAULT-tier upload time.
       * </pre>
       */
      public static final int FAST_IF_RADIO_AWAKE_VALUE = 3;
      /**
       * <code>NEVER = 4;</code>
       *
       * <pre>
       * This is for server to override client QosTier setting.
       *  If a certain log source's QosTier is set to NEVER, then Clearcut will
       *  drop log events of that log source immediately and won't save them in
       *  log store.
       * </pre>
       */
      public static final int NEVER_VALUE = 4;


      public final int getNumber() { return value; }

      public static QosTier valueOf(int value) {
        switch (value) {
          case 0: return DEFAULT;
          case 1: return UNMETERED_ONLY;
          case 2: return UNMETERED_OR_DAILY;
          case 3: return FAST_IF_RADIO_AWAKE;
          case 4: return NEVER;
          default: return null;
        }
      }

      public static com.google.protobuf.Internal.EnumLiteMap<QosTier>
          internalGetValueMap() {
        return internalValueMap;
      }
      private static com.google.protobuf.Internal.EnumLiteMap<QosTier>
          internalValueMap =
            new com.google.protobuf.Internal.EnumLiteMap<QosTier>() {
              public QosTier findValueByNumber(int number) {
                return QosTier.valueOf(number);
              }
            };

      public final com.google.protobuf.Descriptors.EnumValueDescriptor
          getValueDescriptor() {
        return getDescriptor().getValues().get(index);
      }
      public final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptorForType() {
        return getDescriptor();
      }
      public static final com.google.protobuf.Descriptors.EnumDescriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.getDescriptor().getEnumTypes().get(0);
      }

      private static final QosTier[] VALUES = values();

      public static QosTier valueOf(
          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
        if (desc.getType() != getDescriptor()) {
          throw new java.lang.IllegalArgumentException(
            "EnumValueDescriptor is not for this type.");
        }
        return VALUES[desc.getIndex()];
      }

      private final int index;
      private final int value;

      private QosTier(int index, int value) {
        this.index = index;
        this.value = value;
      }

      // @@protoc_insertion_point(enum_scope:wireless_android_play_playlog.QosTierConfiguration.QosTier)
    }

    private int bitField0_;
    // optional string log_source_name = 1;
    public static final int LOG_SOURCE_NAME_FIELD_NUMBER = 1;
    private java.lang.Object logSourceName_;
    /**
     * <code>optional string log_source_name = 1;</code>
     */
    public boolean hasLogSourceName() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional string log_source_name = 1;</code>
     */
    public java.lang.String getLogSourceName() {
      java.lang.Object ref = logSourceName_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          logSourceName_ = s;
        }
        return s;
      }
    }
    /**
     * <code>optional string log_source_name = 1;</code>
     */
    public com.google.protobuf.ByteString
        getLogSourceNameBytes() {
      java.lang.Object ref = logSourceName_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        logSourceName_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    // optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;
    public static final int QOS_TIER_FIELD_NUMBER = 2;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier qosTier_;
    /**
     * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;</code>
     */
    public boolean hasQosTier() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;</code>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier getQosTier() {
      return qosTier_;
    }

    private void initFields() {
      logSourceName_ = "";
      qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier.DEFAULT;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeBytes(1, getLogSourceNameBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeEnum(2, qosTier_.getNumber());
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBytesSize(1, getLogSourceNameBytes());
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeEnumSize(2, qosTier_.getNumber());
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.QosTierConfiguration}
     *
     * <pre>
     * QosTierConfiguration configures what Quality of Service tier should be
     *  applied to a given log source.
     *
     *  Next tag: 3
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfigurationOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_QosTierConfiguration_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_QosTierConfiguration_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        logSourceName_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier.DEFAULT;
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_QosTierConfiguration_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.logSourceName_ = logSourceName_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        result.qosTier_ = qosTier_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.getDefaultInstance()) return this;
        if (other.hasLogSourceName()) {
          bitField0_ |= 0x00000001;
          logSourceName_ = other.logSourceName_;
          onChanged();
        }
        if (other.hasQosTier()) {
          setQosTier(other.getQosTier());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional string log_source_name = 1;
      private java.lang.Object logSourceName_ = "";
      /**
       * <code>optional string log_source_name = 1;</code>
       */
      public boolean hasLogSourceName() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional string log_source_name = 1;</code>
       */
      public java.lang.String getLogSourceName() {
        java.lang.Object ref = logSourceName_;
        if (!(ref instanceof java.lang.String)) {
          java.lang.String s = ((com.google.protobuf.ByteString) ref)
              .toStringUtf8();
          logSourceName_ = s;
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <code>optional string log_source_name = 1;</code>
       */
      public com.google.protobuf.ByteString
          getLogSourceNameBytes() {
        java.lang.Object ref = logSourceName_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          logSourceName_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <code>optional string log_source_name = 1;</code>
       */
      public Builder setLogSourceName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        logSourceName_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional string log_source_name = 1;</code>
       */
      public Builder clearLogSourceName() {
        bitField0_ = (bitField0_ & ~0x00000001);
        logSourceName_ = getDefaultInstance().getLogSourceName();
        onChanged();
        return this;
      }
      /**
       * <code>optional string log_source_name = 1;</code>
       */
      public Builder setLogSourceNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        logSourceName_ = value;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier.DEFAULT;
      /**
       * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;</code>
       */
      public boolean hasQosTier() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;</code>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier getQosTier() {
        return qosTier_;
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;</code>
       */
      public Builder setQosTier(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier value) {
        if (value == null) {
          throw new NullPointerException();
        }
        bitField0_ |= 0x00000002;
        qosTier_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTierConfiguration.QosTier qos_tier = 2;</code>
       */
      public Builder clearQosTier() {
        bitField0_ = (bitField0_ & ~0x00000002);
        qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.QosTier.DEFAULT;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.QosTierConfiguration)
    }

    static {
      defaultInstance = new QosTierConfiguration(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.QosTierConfiguration)
  }

  public interface QosTiersOverrideOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;
    /**
     * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     *  This usually happens when server is burdened with fast qos tiers.
     * </pre>
     */
    java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration> 
        getQosTierConfigurationList();
    /**
     * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     *  This usually happens when server is burdened with fast qos tiers.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration getQosTierConfiguration(int index);
    /**
     * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     *  This usually happens when server is burdened with fast qos tiers.
     * </pre>
     */
    int getQosTierConfigurationCount();
    /**
     * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     *  This usually happens when server is burdened with fast qos tiers.
     * </pre>
     */
    java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfigurationOrBuilder> 
        getQosTierConfigurationOrBuilderList();
    /**
     * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     *  This usually happens when server is burdened with fast qos tiers.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfigurationOrBuilder getQosTierConfigurationOrBuilder(
        int index);

    // optional int64 qos_tier_fingerprint = 2;
    /**
     * <code>optional int64 qos_tier_fingerprint = 2;</code>
     *
     * <pre>
     * The fingerprint of the qos_tier_configuration field.
     * </pre>
     */
    boolean hasQosTierFingerprint();
    /**
     * <code>optional int64 qos_tier_fingerprint = 2;</code>
     *
     * <pre>
     * The fingerprint of the qos_tier_configuration field.
     * </pre>
     */
    long getQosTierFingerprint();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.QosTiersOverride}
   *
   * <pre>
   * Next tag: 3
   * </pre>
   */
  public static final class QosTiersOverride extends
      com.google.protobuf.GeneratedMessage
      implements QosTiersOverrideOrBuilder {
    // Use QosTiersOverride.newBuilder() to construct.
    private QosTiersOverride(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private QosTiersOverride(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final QosTiersOverride defaultInstance;
    public static QosTiersOverride getDefaultInstance() {
      return defaultInstance;
    }

    public QosTiersOverride getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private QosTiersOverride(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
                qosTierConfiguration_ = new java.util.ArrayList<com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration>();
                mutable_bitField0_ |= 0x00000001;
              }
              qosTierConfiguration_.add(input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.PARSER, extensionRegistry));
              break;
            }
            case 16: {
              bitField0_ |= 0x00000001;
              qosTierFingerprint_ = input.readInt64();
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
          qosTierConfiguration_ = java.util.Collections.unmodifiableList(qosTierConfiguration_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_QosTiersOverride_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_QosTiersOverride_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.Builder.class);
    }

    public static com.google.protobuf.Parser<QosTiersOverride> PARSER =
        new com.google.protobuf.AbstractParser<QosTiersOverride>() {
      public QosTiersOverride parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new QosTiersOverride(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<QosTiersOverride> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;
    public static final int QOS_TIER_CONFIGURATION_FIELD_NUMBER = 1;
    private java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration> qosTierConfiguration_;
    /**
     * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     *  This usually happens when server is burdened with fast qos tiers.
     * </pre>
     */
    public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration> getQosTierConfigurationList() {
      return qosTierConfiguration_;
    }
    /**
     * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     *  This usually happens when server is burdened with fast qos tiers.
     * </pre>
     */
    public java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfigurationOrBuilder> 
        getQosTierConfigurationOrBuilderList() {
      return qosTierConfiguration_;
    }
    /**
     * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     *  This usually happens when server is burdened with fast qos tiers.
     * </pre>
     */
    public int getQosTierConfigurationCount() {
      return qosTierConfiguration_.size();
    }
    /**
     * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     *  This usually happens when server is burdened with fast qos tiers.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration getQosTierConfiguration(int index) {
      return qosTierConfiguration_.get(index);
    }
    /**
     * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     *  This usually happens when server is burdened with fast qos tiers.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfigurationOrBuilder getQosTierConfigurationOrBuilder(
        int index) {
      return qosTierConfiguration_.get(index);
    }

    // optional int64 qos_tier_fingerprint = 2;
    public static final int QOS_TIER_FINGERPRINT_FIELD_NUMBER = 2;
    private long qosTierFingerprint_;
    /**
     * <code>optional int64 qos_tier_fingerprint = 2;</code>
     *
     * <pre>
     * The fingerprint of the qos_tier_configuration field.
     * </pre>
     */
    public boolean hasQosTierFingerprint() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional int64 qos_tier_fingerprint = 2;</code>
     *
     * <pre>
     * The fingerprint of the qos_tier_configuration field.
     * </pre>
     */
    public long getQosTierFingerprint() {
      return qosTierFingerprint_;
    }

    private void initFields() {
      qosTierConfiguration_ = java.util.Collections.emptyList();
      qosTierFingerprint_ = 0L;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      for (int i = 0; i < qosTierConfiguration_.size(); i++) {
        output.writeMessage(1, qosTierConfiguration_.get(i));
      }
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt64(2, qosTierFingerprint_);
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      for (int i = 0; i < qosTierConfiguration_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(1, qosTierConfiguration_.get(i));
      }
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(2, qosTierFingerprint_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.QosTiersOverride}
     *
     * <pre>
     * Next tag: 3
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverrideOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_QosTiersOverride_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_QosTiersOverride_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          getQosTierConfigurationFieldBuilder();
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        if (qosTierConfigurationBuilder_ == null) {
          qosTierConfiguration_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000001);
        } else {
          qosTierConfigurationBuilder_.clear();
        }
        qosTierFingerprint_ = 0L;
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_QosTiersOverride_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (qosTierConfigurationBuilder_ == null) {
          if (((bitField0_ & 0x00000001) == 0x00000001)) {
            qosTierConfiguration_ = java.util.Collections.unmodifiableList(qosTierConfiguration_);
            bitField0_ = (bitField0_ & ~0x00000001);
          }
          result.qosTierConfiguration_ = qosTierConfiguration_;
        } else {
          result.qosTierConfiguration_ = qosTierConfigurationBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000001;
        }
        result.qosTierFingerprint_ = qosTierFingerprint_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.getDefaultInstance()) return this;
        if (qosTierConfigurationBuilder_ == null) {
          if (!other.qosTierConfiguration_.isEmpty()) {
            if (qosTierConfiguration_.isEmpty()) {
              qosTierConfiguration_ = other.qosTierConfiguration_;
              bitField0_ = (bitField0_ & ~0x00000001);
            } else {
              ensureQosTierConfigurationIsMutable();
              qosTierConfiguration_.addAll(other.qosTierConfiguration_);
            }
            onChanged();
          }
        } else {
          if (!other.qosTierConfiguration_.isEmpty()) {
            if (qosTierConfigurationBuilder_.isEmpty()) {
              qosTierConfigurationBuilder_.dispose();
              qosTierConfigurationBuilder_ = null;
              qosTierConfiguration_ = other.qosTierConfiguration_;
              bitField0_ = (bitField0_ & ~0x00000001);
              qosTierConfigurationBuilder_ = 
                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
                   getQosTierConfigurationFieldBuilder() : null;
            } else {
              qosTierConfigurationBuilder_.addAllMessages(other.qosTierConfiguration_);
            }
          }
        }
        if (other.hasQosTierFingerprint()) {
          setQosTierFingerprint(other.getQosTierFingerprint());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;
      private java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration> qosTierConfiguration_ =
        java.util.Collections.emptyList();
      private void ensureQosTierConfigurationIsMutable() {
        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
          qosTierConfiguration_ = new java.util.ArrayList<com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration>(qosTierConfiguration_);
          bitField0_ |= 0x00000001;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfigurationOrBuilder> qosTierConfigurationBuilder_;

      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration> getQosTierConfigurationList() {
        if (qosTierConfigurationBuilder_ == null) {
          return java.util.Collections.unmodifiableList(qosTierConfiguration_);
        } else {
          return qosTierConfigurationBuilder_.getMessageList();
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public int getQosTierConfigurationCount() {
        if (qosTierConfigurationBuilder_ == null) {
          return qosTierConfiguration_.size();
        } else {
          return qosTierConfigurationBuilder_.getCount();
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration getQosTierConfiguration(int index) {
        if (qosTierConfigurationBuilder_ == null) {
          return qosTierConfiguration_.get(index);
        } else {
          return qosTierConfigurationBuilder_.getMessage(index);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public Builder setQosTierConfiguration(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration value) {
        if (qosTierConfigurationBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureQosTierConfigurationIsMutable();
          qosTierConfiguration_.set(index, value);
          onChanged();
        } else {
          qosTierConfigurationBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public Builder setQosTierConfiguration(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder builderForValue) {
        if (qosTierConfigurationBuilder_ == null) {
          ensureQosTierConfigurationIsMutable();
          qosTierConfiguration_.set(index, builderForValue.build());
          onChanged();
        } else {
          qosTierConfigurationBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public Builder addQosTierConfiguration(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration value) {
        if (qosTierConfigurationBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureQosTierConfigurationIsMutable();
          qosTierConfiguration_.add(value);
          onChanged();
        } else {
          qosTierConfigurationBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public Builder addQosTierConfiguration(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration value) {
        if (qosTierConfigurationBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureQosTierConfigurationIsMutable();
          qosTierConfiguration_.add(index, value);
          onChanged();
        } else {
          qosTierConfigurationBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public Builder addQosTierConfiguration(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder builderForValue) {
        if (qosTierConfigurationBuilder_ == null) {
          ensureQosTierConfigurationIsMutable();
          qosTierConfiguration_.add(builderForValue.build());
          onChanged();
        } else {
          qosTierConfigurationBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public Builder addQosTierConfiguration(
          int index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder builderForValue) {
        if (qosTierConfigurationBuilder_ == null) {
          ensureQosTierConfigurationIsMutable();
          qosTierConfiguration_.add(index, builderForValue.build());
          onChanged();
        } else {
          qosTierConfigurationBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public Builder addAllQosTierConfiguration(
          java.lang.Iterable<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration> values) {
        if (qosTierConfigurationBuilder_ == null) {
          ensureQosTierConfigurationIsMutable();
          super.addAll(values, qosTierConfiguration_);
          onChanged();
        } else {
          qosTierConfigurationBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public Builder clearQosTierConfiguration() {
        if (qosTierConfigurationBuilder_ == null) {
          qosTierConfiguration_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000001);
          onChanged();
        } else {
          qosTierConfigurationBuilder_.clear();
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public Builder removeQosTierConfiguration(int index) {
        if (qosTierConfigurationBuilder_ == null) {
          ensureQosTierConfigurationIsMutable();
          qosTierConfiguration_.remove(index);
          onChanged();
        } else {
          qosTierConfigurationBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder getQosTierConfigurationBuilder(
          int index) {
        return getQosTierConfigurationFieldBuilder().getBuilder(index);
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfigurationOrBuilder getQosTierConfigurationOrBuilder(
          int index) {
        if (qosTierConfigurationBuilder_ == null) {
          return qosTierConfiguration_.get(index);  } else {
          return qosTierConfigurationBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public java.util.List<? extends com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfigurationOrBuilder> 
           getQosTierConfigurationOrBuilderList() {
        if (qosTierConfigurationBuilder_ != null) {
          return qosTierConfigurationBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(qosTierConfiguration_);
        }
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder addQosTierConfigurationBuilder() {
        return getQosTierConfigurationFieldBuilder().addBuilder(
            com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.getDefaultInstance());
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder addQosTierConfigurationBuilder(
          int index) {
        return getQosTierConfigurationFieldBuilder().addBuilder(
            index, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.getDefaultInstance());
      }
      /**
       * <code>repeated .wireless_android_play_playlog.QosTierConfiguration qos_tier_configuration = 1;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       *  This usually happens when server is burdened with fast qos tiers.
       * </pre>
       */
      public java.util.List<com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder> 
           getQosTierConfigurationBuilderList() {
        return getQosTierConfigurationFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfigurationOrBuilder> 
          getQosTierConfigurationFieldBuilder() {
        if (qosTierConfigurationBuilder_ == null) {
          qosTierConfigurationBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfiguration.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTierConfigurationOrBuilder>(
                  qosTierConfiguration_,
                  ((bitField0_ & 0x00000001) == 0x00000001),
                  getParentForChildren(),
                  isClean());
          qosTierConfiguration_ = null;
        }
        return qosTierConfigurationBuilder_;
      }

      // optional int64 qos_tier_fingerprint = 2;
      private long qosTierFingerprint_ ;
      /**
       * <code>optional int64 qos_tier_fingerprint = 2;</code>
       *
       * <pre>
       * The fingerprint of the qos_tier_configuration field.
       * </pre>
       */
      public boolean hasQosTierFingerprint() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional int64 qos_tier_fingerprint = 2;</code>
       *
       * <pre>
       * The fingerprint of the qos_tier_configuration field.
       * </pre>
       */
      public long getQosTierFingerprint() {
        return qosTierFingerprint_;
      }
      /**
       * <code>optional int64 qos_tier_fingerprint = 2;</code>
       *
       * <pre>
       * The fingerprint of the qos_tier_configuration field.
       * </pre>
       */
      public Builder setQosTierFingerprint(long value) {
        bitField0_ |= 0x00000002;
        qosTierFingerprint_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 qos_tier_fingerprint = 2;</code>
       *
       * <pre>
       * The fingerprint of the qos_tier_configuration field.
       * </pre>
       */
      public Builder clearQosTierFingerprint() {
        bitField0_ = (bitField0_ & ~0x00000002);
        qosTierFingerprint_ = 0L;
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.QosTiersOverride)
    }

    static {
      defaultInstance = new QosTiersOverride(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.QosTiersOverride)
  }

  public interface LogSourceBatchingBlacklistOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // repeated string log_source_name = 1;
    /**
     * <code>repeated string log_source_name = 1;</code>
     */
    java.util.List<java.lang.String>
    getLogSourceNameList();
    /**
     * <code>repeated string log_source_name = 1;</code>
     */
    int getLogSourceNameCount();
    /**
     * <code>repeated string log_source_name = 1;</code>
     */
    java.lang.String getLogSourceName(int index);
    /**
     * <code>repeated string log_source_name = 1;</code>
     */
    com.google.protobuf.ByteString
        getLogSourceNameBytes(int index);
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.LogSourceBatchingBlacklist}
   *
   * <pre>
   * Next tag: 2
   * </pre>
   */
  public static final class LogSourceBatchingBlacklist extends
      com.google.protobuf.GeneratedMessage
      implements LogSourceBatchingBlacklistOrBuilder {
    // Use LogSourceBatchingBlacklist.newBuilder() to construct.
    private LogSourceBatchingBlacklist(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private LogSourceBatchingBlacklist(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final LogSourceBatchingBlacklist defaultInstance;
    public static LogSourceBatchingBlacklist getDefaultInstance() {
      return defaultInstance;
    }

    public LogSourceBatchingBlacklist getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private LogSourceBatchingBlacklist(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 10: {
              if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
                logSourceName_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00000001;
              }
              logSourceName_.add(input.readBytes());
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
          logSourceName_ = new com.google.protobuf.UnmodifiableLazyStringList(logSourceName_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogSourceBatchingBlacklist_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogSourceBatchingBlacklist_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.Builder.class);
    }

    public static com.google.protobuf.Parser<LogSourceBatchingBlacklist> PARSER =
        new com.google.protobuf.AbstractParser<LogSourceBatchingBlacklist>() {
      public LogSourceBatchingBlacklist parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LogSourceBatchingBlacklist(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<LogSourceBatchingBlacklist> getParserForType() {
      return PARSER;
    }

    // repeated string log_source_name = 1;
    public static final int LOG_SOURCE_NAME_FIELD_NUMBER = 1;
    private com.google.protobuf.LazyStringList logSourceName_;
    /**
     * <code>repeated string log_source_name = 1;</code>
     */
    public java.util.List<java.lang.String>
        getLogSourceNameList() {
      return logSourceName_;
    }
    /**
     * <code>repeated string log_source_name = 1;</code>
     */
    public int getLogSourceNameCount() {
      return logSourceName_.size();
    }
    /**
     * <code>repeated string log_source_name = 1;</code>
     */
    public java.lang.String getLogSourceName(int index) {
      return logSourceName_.get(index);
    }
    /**
     * <code>repeated string log_source_name = 1;</code>
     */
    public com.google.protobuf.ByteString
        getLogSourceNameBytes(int index) {
      return logSourceName_.getByteString(index);
    }

    private void initFields() {
      logSourceName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      for (int i = 0; i < logSourceName_.size(); i++) {
        output.writeBytes(1, logSourceName_.getByteString(i));
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      {
        int dataSize = 0;
        for (int i = 0; i < logSourceName_.size(); i++) {
          dataSize += com.google.protobuf.CodedOutputStream
            .computeBytesSizeNoTag(logSourceName_.getByteString(i));
        }
        size += dataSize;
        size += 1 * getLogSourceNameList().size();
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.LogSourceBatchingBlacklist}
     *
     * <pre>
     * Next tag: 2
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklistOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogSourceBatchingBlacklist_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogSourceBatchingBlacklist_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        logSourceName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogSourceBatchingBlacklist_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist(this);
        int from_bitField0_ = bitField0_;
        if (((bitField0_ & 0x00000001) == 0x00000001)) {
          logSourceName_ = new com.google.protobuf.UnmodifiableLazyStringList(
              logSourceName_);
          bitField0_ = (bitField0_ & ~0x00000001);
        }
        result.logSourceName_ = logSourceName_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.getDefaultInstance()) return this;
        if (!other.logSourceName_.isEmpty()) {
          if (logSourceName_.isEmpty()) {
            logSourceName_ = other.logSourceName_;
            bitField0_ = (bitField0_ & ~0x00000001);
          } else {
            ensureLogSourceNameIsMutable();
            logSourceName_.addAll(other.logSourceName_);
          }
          onChanged();
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // repeated string log_source_name = 1;
      private com.google.protobuf.LazyStringList logSourceName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureLogSourceNameIsMutable() {
        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
          logSourceName_ = new com.google.protobuf.LazyStringArrayList(logSourceName_);
          bitField0_ |= 0x00000001;
         }
      }
      /**
       * <code>repeated string log_source_name = 1;</code>
       */
      public java.util.List<java.lang.String>
          getLogSourceNameList() {
        return java.util.Collections.unmodifiableList(logSourceName_);
      }
      /**
       * <code>repeated string log_source_name = 1;</code>
       */
      public int getLogSourceNameCount() {
        return logSourceName_.size();
      }
      /**
       * <code>repeated string log_source_name = 1;</code>
       */
      public java.lang.String getLogSourceName(int index) {
        return logSourceName_.get(index);
      }
      /**
       * <code>repeated string log_source_name = 1;</code>
       */
      public com.google.protobuf.ByteString
          getLogSourceNameBytes(int index) {
        return logSourceName_.getByteString(index);
      }
      /**
       * <code>repeated string log_source_name = 1;</code>
       */
      public Builder setLogSourceName(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureLogSourceNameIsMutable();
        logSourceName_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string log_source_name = 1;</code>
       */
      public Builder addLogSourceName(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureLogSourceNameIsMutable();
        logSourceName_.add(value);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string log_source_name = 1;</code>
       */
      public Builder addAllLogSourceName(
          java.lang.Iterable<java.lang.String> values) {
        ensureLogSourceNameIsMutable();
        super.addAll(values, logSourceName_);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string log_source_name = 1;</code>
       */
      public Builder clearLogSourceName() {
        logSourceName_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000001);
        onChanged();
        return this;
      }
      /**
       * <code>repeated string log_source_name = 1;</code>
       */
      public Builder addLogSourceNameBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureLogSourceNameIsMutable();
        logSourceName_.add(value);
        onChanged();
        return this;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.LogSourceBatchingBlacklist)
    }

    static {
      defaultInstance = new LogSourceBatchingBlacklist(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.LogSourceBatchingBlacklist)
  }

  public interface LogResponseOrBuilder
      extends com.google.protobuf.MessageOrBuilder {

    // optional int64 next_request_wait_millis = 1 [default = -1];
    /**
     * <code>optional int64 next_request_wait_millis = 1 [default = -1];</code>
     *
     * <pre>
     * Client should wait for next_request_wait_millis before sending the next
     *  log request.
     * </pre>
     */
    boolean hasNextRequestWaitMillis();
    /**
     * <code>optional int64 next_request_wait_millis = 1 [default = -1];</code>
     *
     * <pre>
     * Client should wait for next_request_wait_millis before sending the next
     *  log request.
     * </pre>
     */
    long getNextRequestWaitMillis();

    // optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
     *
     * <pre>
     * If present, this is the new set of enabled experiments for this client.
     *  Otherwise, the client should assume that there has been no change in the
     *  set of enabled experiments.
     * </pre>
     */
    boolean hasExperiments();
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
     *
     * <pre>
     * If present, this is the new set of enabled experiments for this client.
     *  Otherwise, the client should assume that there has been no change in the
     *  set of enabled experiments.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList getExperiments();
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
     *
     * <pre>
     * If present, this is the new set of enabled experiments for this client.
     *  Otherwise, the client should assume that there has been no change in the
     *  set of enabled experiments.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdListOrBuilder getExperimentsOrBuilder();

    // optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;
    /**
     * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     * </pre>
     */
    boolean hasQosTier();
    /**
     * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride getQosTier();
    /**
     * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverrideOrBuilder getQosTierOrBuilder();

    // optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;
    /**
     * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
     *
     * <pre>
     * Enforced by server for telling Clearcut uploader not to group log events
     *  from certain log sources. If it is not set, client will try to group log
     *  events together with the same upload context without considering log
     *  sources restrictions. Upload context includes following info.
     *  1. PlayLoggerContext.isAnonymous
     *  2. PlayLoggerContext.uploadAccountName
     *  3. PlayLoggerContext.zwiebackCookie
     *  4. PlayLoggerContext.qosTier
     * </pre>
     */
    boolean hasLogSourceBatchingBlacklist();
    /**
     * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
     *
     * <pre>
     * Enforced by server for telling Clearcut uploader not to group log events
     *  from certain log sources. If it is not set, client will try to group log
     *  events together with the same upload context without considering log
     *  sources restrictions. Upload context includes following info.
     *  1. PlayLoggerContext.isAnonymous
     *  2. PlayLoggerContext.uploadAccountName
     *  3. PlayLoggerContext.zwiebackCookie
     *  4. PlayLoggerContext.qosTier
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist getLogSourceBatchingBlacklist();
    /**
     * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
     *
     * <pre>
     * Enforced by server for telling Clearcut uploader not to group log events
     *  from certain log sources. If it is not set, client will try to group log
     *  events together with the same upload context without considering log
     *  sources restrictions. Upload context includes following info.
     *  1. PlayLoggerContext.isAnonymous
     *  2. PlayLoggerContext.uploadAccountName
     *  3. PlayLoggerContext.zwiebackCookie
     *  4. PlayLoggerContext.qosTier
     * </pre>
     */
    com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklistOrBuilder getLogSourceBatchingBlacklistOrBuilder();
  }
  /**
   * Protobuf type {@code wireless_android_play_playlog.LogResponse}
   *
   * <pre>
   * Next tag: 5
   * </pre>
   */
  public static final class LogResponse extends
      com.google.protobuf.GeneratedMessage
      implements LogResponseOrBuilder {
    // Use LogResponse.newBuilder() to construct.
    private LogResponse(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
      super(builder);
      this.unknownFields = builder.getUnknownFields();
    }
    private LogResponse(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }

    private static final LogResponse defaultInstance;
    public static LogResponse getDefaultInstance() {
      return defaultInstance;
    }

    public LogResponse getDefaultInstanceForType() {
      return defaultInstance;
    }

    private final com.google.protobuf.UnknownFieldSet unknownFields;
    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
      return this.unknownFields;
    }
    private LogResponse(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      initFields();
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            default: {
              if (!parseUnknownField(input, unknownFields,
                                     extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
            case 8: {
              bitField0_ |= 0x00000001;
              nextRequestWaitMillis_ = input.readInt64();
              break;
            }
            case 18: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.Builder subBuilder = null;
              if (((bitField0_ & 0x00000002) == 0x00000002)) {
                subBuilder = experiments_.toBuilder();
              }
              experiments_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(experiments_);
                experiments_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000002;
              break;
            }
            case 26: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.Builder subBuilder = null;
              if (((bitField0_ & 0x00000004) == 0x00000004)) {
                subBuilder = qosTier_.toBuilder();
              }
              qosTier_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(qosTier_);
                qosTier_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000004;
              break;
            }
            case 34: {
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.Builder subBuilder = null;
              if (((bitField0_ & 0x00000008) == 0x00000008)) {
                subBuilder = logSourceBatchingBlacklist_.toBuilder();
              }
              logSourceBatchingBlacklist_ = input.readMessage(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(logSourceBatchingBlacklist_);
                logSourceBatchingBlacklist_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000008;
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e.getMessage()).setUnfinishedMessage(this);
      } finally {
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogResponse_descriptor;
    }

    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogResponse_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse.Builder.class);
    }

    public static com.google.protobuf.Parser<LogResponse> PARSER =
        new com.google.protobuf.AbstractParser<LogResponse>() {
      public LogResponse parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new LogResponse(input, extensionRegistry);
      }
    };

    @java.lang.Override
    public com.google.protobuf.Parser<LogResponse> getParserForType() {
      return PARSER;
    }

    private int bitField0_;
    // optional int64 next_request_wait_millis = 1 [default = -1];
    public static final int NEXT_REQUEST_WAIT_MILLIS_FIELD_NUMBER = 1;
    private long nextRequestWaitMillis_;
    /**
     * <code>optional int64 next_request_wait_millis = 1 [default = -1];</code>
     *
     * <pre>
     * Client should wait for next_request_wait_millis before sending the next
     *  log request.
     * </pre>
     */
    public boolean hasNextRequestWaitMillis() {
      return ((bitField0_ & 0x00000001) == 0x00000001);
    }
    /**
     * <code>optional int64 next_request_wait_millis = 1 [default = -1];</code>
     *
     * <pre>
     * Client should wait for next_request_wait_millis before sending the next
     *  log request.
     * </pre>
     */
    public long getNextRequestWaitMillis() {
      return nextRequestWaitMillis_;
    }

    // optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;
    public static final int EXPERIMENTS_FIELD_NUMBER = 2;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList experiments_;
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
     *
     * <pre>
     * If present, this is the new set of enabled experiments for this client.
     *  Otherwise, the client should assume that there has been no change in the
     *  set of enabled experiments.
     * </pre>
     */
    public boolean hasExperiments() {
      return ((bitField0_ & 0x00000002) == 0x00000002);
    }
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
     *
     * <pre>
     * If present, this is the new set of enabled experiments for this client.
     *  Otherwise, the client should assume that there has been no change in the
     *  set of enabled experiments.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList getExperiments() {
      return experiments_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
     *
     * <pre>
     * If present, this is the new set of enabled experiments for this client.
     *  Otherwise, the client should assume that there has been no change in the
     *  set of enabled experiments.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdListOrBuilder getExperimentsOrBuilder() {
      return experiments_;
    }

    // optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;
    public static final int QOS_TIER_FIELD_NUMBER = 3;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride qosTier_;
    /**
     * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     * </pre>
     */
    public boolean hasQosTier() {
      return ((bitField0_ & 0x00000004) == 0x00000004);
    }
    /**
     * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride getQosTier() {
      return qosTier_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
     *
     * <pre>
     * Quality of Service tiers enforced by server for overriding client
     *  qos_tier setting in event logging.
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverrideOrBuilder getQosTierOrBuilder() {
      return qosTier_;
    }

    // optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;
    public static final int LOG_SOURCE_BATCHING_BLACKLIST_FIELD_NUMBER = 4;
    private com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist logSourceBatchingBlacklist_;
    /**
     * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
     *
     * <pre>
     * Enforced by server for telling Clearcut uploader not to group log events
     *  from certain log sources. If it is not set, client will try to group log
     *  events together with the same upload context without considering log
     *  sources restrictions. Upload context includes following info.
     *  1. PlayLoggerContext.isAnonymous
     *  2. PlayLoggerContext.uploadAccountName
     *  3. PlayLoggerContext.zwiebackCookie
     *  4. PlayLoggerContext.qosTier
     * </pre>
     */
    public boolean hasLogSourceBatchingBlacklist() {
      return ((bitField0_ & 0x00000008) == 0x00000008);
    }
    /**
     * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
     *
     * <pre>
     * Enforced by server for telling Clearcut uploader not to group log events
     *  from certain log sources. If it is not set, client will try to group log
     *  events together with the same upload context without considering log
     *  sources restrictions. Upload context includes following info.
     *  1. PlayLoggerContext.isAnonymous
     *  2. PlayLoggerContext.uploadAccountName
     *  3. PlayLoggerContext.zwiebackCookie
     *  4. PlayLoggerContext.qosTier
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist getLogSourceBatchingBlacklist() {
      return logSourceBatchingBlacklist_;
    }
    /**
     * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
     *
     * <pre>
     * Enforced by server for telling Clearcut uploader not to group log events
     *  from certain log sources. If it is not set, client will try to group log
     *  events together with the same upload context without considering log
     *  sources restrictions. Upload context includes following info.
     *  1. PlayLoggerContext.isAnonymous
     *  2. PlayLoggerContext.uploadAccountName
     *  3. PlayLoggerContext.zwiebackCookie
     *  4. PlayLoggerContext.qosTier
     * </pre>
     */
    public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklistOrBuilder getLogSourceBatchingBlacklistOrBuilder() {
      return logSourceBatchingBlacklist_;
    }

    private void initFields() {
      nextRequestWaitMillis_ = -1L;
      experiments_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.getDefaultInstance();
      qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.getDefaultInstance();
      logSourceBatchingBlacklist_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.getDefaultInstance();
    }
    private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      getSerializedSize();
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        output.writeInt64(1, nextRequestWaitMillis_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        output.writeMessage(2, experiments_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        output.writeMessage(3, qosTier_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        output.writeMessage(4, logSourceBatchingBlacklist_);
      }
      getUnknownFields().writeTo(output);
    }

    private int memoizedSerializedSize = -1;
    public int getSerializedSize() {
      int size = memoizedSerializedSize;
      if (size != -1) return size;

      size = 0;
      if (((bitField0_ & 0x00000001) == 0x00000001)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt64Size(1, nextRequestWaitMillis_);
      }
      if (((bitField0_ & 0x00000002) == 0x00000002)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, experiments_);
      }
      if (((bitField0_ & 0x00000004) == 0x00000004)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, qosTier_);
      }
      if (((bitField0_ & 0x00000008) == 0x00000008)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, logSourceBatchingBlacklist_);
      }
      size += getUnknownFields().getSerializedSize();
      memoizedSerializedSize = size;
      return size;
    }

    private static final long serialVersionUID = 0L;
    @java.lang.Override
    protected java.lang.Object writeReplace()
        throws java.io.ObjectStreamException {
      return super.writeReplace();
    }

    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseDelimitedFrom(input, extensionRegistry);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return PARSER.parseFrom(input);
    }
    public static com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return PARSER.parseFrom(input, extensionRegistry);
    }

    public static Builder newBuilder() { return Builder.create(); }
    public Builder newBuilderForType() { return newBuilder(); }
    public static Builder newBuilder(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse prototype) {
      return newBuilder().mergeFrom(prototype);
    }
    public Builder toBuilder() { return newBuilder(this); }

    @java.lang.Override
    protected Builder newBuilderForType(
        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
      Builder builder = new Builder(parent);
      return builder;
    }
    /**
     * Protobuf type {@code wireless_android_play_playlog.LogResponse}
     *
     * <pre>
     * Next tag: 5
     * </pre>
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessage.Builder<Builder>
       implements com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponseOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogResponse_descriptor;
      }

      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogResponse_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse.class, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse.Builder.class);
      }

      // Construct using com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
          getExperimentsFieldBuilder();
          getQosTierFieldBuilder();
          getLogSourceBatchingBlacklistFieldBuilder();
        }
      }
      private static Builder create() {
        return new Builder();
      }

      public Builder clear() {
        super.clear();
        nextRequestWaitMillis_ = -1L;
        bitField0_ = (bitField0_ & ~0x00000001);
        if (experimentsBuilder_ == null) {
          experiments_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.getDefaultInstance();
        } else {
          experimentsBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        if (qosTierBuilder_ == null) {
          qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.getDefaultInstance();
        } else {
          qosTierBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        if (logSourceBatchingBlacklistBuilder_ == null) {
          logSourceBatchingBlacklist_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.getDefaultInstance();
        } else {
          logSourceBatchingBlacklistBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }

      public Builder clone() {
        return create().mergeFrom(buildPartial());
      }

      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.internal_static_wireless_android_play_playlog_LogResponse_descriptor;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse getDefaultInstanceForType() {
        return com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse.getDefaultInstance();
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse build() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse buildPartial() {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse result = new com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
          to_bitField0_ |= 0x00000001;
        }
        result.nextRequestWaitMillis_ = nextRequestWaitMillis_;
        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
          to_bitField0_ |= 0x00000002;
        }
        if (experimentsBuilder_ == null) {
          result.experiments_ = experiments_;
        } else {
          result.experiments_ = experimentsBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
          to_bitField0_ |= 0x00000004;
        }
        if (qosTierBuilder_ == null) {
          result.qosTier_ = qosTier_;
        } else {
          result.qosTier_ = qosTierBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
          to_bitField0_ |= 0x00000008;
        }
        if (logSourceBatchingBlacklistBuilder_ == null) {
          result.logSourceBatchingBlacklist_ = logSourceBatchingBlacklist_;
        } else {
          result.logSourceBatchingBlacklist_ = logSourceBatchingBlacklistBuilder_.build();
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse) {
          return mergeFrom((com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse other) {
        if (other == com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse.getDefaultInstance()) return this;
        if (other.hasNextRequestWaitMillis()) {
          setNextRequestWaitMillis(other.getNextRequestWaitMillis());
        }
        if (other.hasExperiments()) {
          mergeExperiments(other.getExperiments());
        }
        if (other.hasQosTier()) {
          mergeQosTier(other.getQosTier());
        }
        if (other.hasLogSourceBatchingBlacklist()) {
          mergeLogSourceBatchingBlacklist(other.getLogSourceBatchingBlacklist());
        }
        this.mergeUnknownFields(other.getUnknownFields());
        return this;
      }

      public final boolean isInitialized() {
        return true;
      }

      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogResponse) e.getUnfinishedMessage();
          throw e;
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      // optional int64 next_request_wait_millis = 1 [default = -1];
      private long nextRequestWaitMillis_ = -1L;
      /**
       * <code>optional int64 next_request_wait_millis = 1 [default = -1];</code>
       *
       * <pre>
       * Client should wait for next_request_wait_millis before sending the next
       *  log request.
       * </pre>
       */
      public boolean hasNextRequestWaitMillis() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      /**
       * <code>optional int64 next_request_wait_millis = 1 [default = -1];</code>
       *
       * <pre>
       * Client should wait for next_request_wait_millis before sending the next
       *  log request.
       * </pre>
       */
      public long getNextRequestWaitMillis() {
        return nextRequestWaitMillis_;
      }
      /**
       * <code>optional int64 next_request_wait_millis = 1 [default = -1];</code>
       *
       * <pre>
       * Client should wait for next_request_wait_millis before sending the next
       *  log request.
       * </pre>
       */
      public Builder setNextRequestWaitMillis(long value) {
        bitField0_ |= 0x00000001;
        nextRequestWaitMillis_ = value;
        onChanged();
        return this;
      }
      /**
       * <code>optional int64 next_request_wait_millis = 1 [default = -1];</code>
       *
       * <pre>
       * Client should wait for next_request_wait_millis before sending the next
       *  log request.
       * </pre>
       */
      public Builder clearNextRequestWaitMillis() {
        bitField0_ = (bitField0_ & ~0x00000001);
        nextRequestWaitMillis_ = -1L;
        onChanged();
        return this;
      }

      // optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList experiments_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdListOrBuilder> experimentsBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
       *
       * <pre>
       * If present, this is the new set of enabled experiments for this client.
       *  Otherwise, the client should assume that there has been no change in the
       *  set of enabled experiments.
       * </pre>
       */
      public boolean hasExperiments() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
       *
       * <pre>
       * If present, this is the new set of enabled experiments for this client.
       *  Otherwise, the client should assume that there has been no change in the
       *  set of enabled experiments.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList getExperiments() {
        if (experimentsBuilder_ == null) {
          return experiments_;
        } else {
          return experimentsBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
       *
       * <pre>
       * If present, this is the new set of enabled experiments for this client.
       *  Otherwise, the client should assume that there has been no change in the
       *  set of enabled experiments.
       * </pre>
       */
      public Builder setExperiments(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList value) {
        if (experimentsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          experiments_ = value;
          onChanged();
        } else {
          experimentsBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
       *
       * <pre>
       * If present, this is the new set of enabled experiments for this client.
       *  Otherwise, the client should assume that there has been no change in the
       *  set of enabled experiments.
       * </pre>
       */
      public Builder setExperiments(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.Builder builderForValue) {
        if (experimentsBuilder_ == null) {
          experiments_ = builderForValue.build();
          onChanged();
        } else {
          experimentsBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
       *
       * <pre>
       * If present, this is the new set of enabled experiments for this client.
       *  Otherwise, the client should assume that there has been no change in the
       *  set of enabled experiments.
       * </pre>
       */
      public Builder mergeExperiments(com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList value) {
        if (experimentsBuilder_ == null) {
          if (((bitField0_ & 0x00000002) == 0x00000002) &&
              experiments_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.getDefaultInstance()) {
            experiments_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.newBuilder(experiments_).mergeFrom(value).buildPartial();
          } else {
            experiments_ = value;
          }
          onChanged();
        } else {
          experimentsBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000002;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
       *
       * <pre>
       * If present, this is the new set of enabled experiments for this client.
       *  Otherwise, the client should assume that there has been no change in the
       *  set of enabled experiments.
       * </pre>
       */
      public Builder clearExperiments() {
        if (experimentsBuilder_ == null) {
          experiments_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.getDefaultInstance();
          onChanged();
        } else {
          experimentsBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000002);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
       *
       * <pre>
       * If present, this is the new set of enabled experiments for this client.
       *  Otherwise, the client should assume that there has been no change in the
       *  set of enabled experiments.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.Builder getExperimentsBuilder() {
        bitField0_ |= 0x00000002;
        onChanged();
        return getExperimentsFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
       *
       * <pre>
       * If present, this is the new set of enabled experiments for this client.
       *  Otherwise, the client should assume that there has been no change in the
       *  set of enabled experiments.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdListOrBuilder getExperimentsOrBuilder() {
        if (experimentsBuilder_ != null) {
          return experimentsBuilder_.getMessageOrBuilder();
        } else {
          return experiments_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.ExperimentIdList experiments = 2;</code>
       *
       * <pre>
       * If present, this is the new set of enabled experiments for this client.
       *  Otherwise, the client should assume that there has been no change in the
       *  set of enabled experiments.
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdListOrBuilder> 
          getExperimentsFieldBuilder() {
        if (experimentsBuilder_ == null) {
          experimentsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdList.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.ExperimentIdListOrBuilder>(
                  experiments_,
                  getParentForChildren(),
                  isClean());
          experiments_ = null;
        }
        return experimentsBuilder_;
      }

      // optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverrideOrBuilder> qosTierBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       * </pre>
       */
      public boolean hasQosTier() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride getQosTier() {
        if (qosTierBuilder_ == null) {
          return qosTier_;
        } else {
          return qosTierBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       * </pre>
       */
      public Builder setQosTier(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride value) {
        if (qosTierBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          qosTier_ = value;
          onChanged();
        } else {
          qosTierBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       * </pre>
       */
      public Builder setQosTier(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.Builder builderForValue) {
        if (qosTierBuilder_ == null) {
          qosTier_ = builderForValue.build();
          onChanged();
        } else {
          qosTierBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       * </pre>
       */
      public Builder mergeQosTier(com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride value) {
        if (qosTierBuilder_ == null) {
          if (((bitField0_ & 0x00000004) == 0x00000004) &&
              qosTier_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.getDefaultInstance()) {
            qosTier_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.newBuilder(qosTier_).mergeFrom(value).buildPartial();
          } else {
            qosTier_ = value;
          }
          onChanged();
        } else {
          qosTierBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000004;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       * </pre>
       */
      public Builder clearQosTier() {
        if (qosTierBuilder_ == null) {
          qosTier_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.getDefaultInstance();
          onChanged();
        } else {
          qosTierBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000004);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.Builder getQosTierBuilder() {
        bitField0_ |= 0x00000004;
        onChanged();
        return getQosTierFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverrideOrBuilder getQosTierOrBuilder() {
        if (qosTierBuilder_ != null) {
          return qosTierBuilder_.getMessageOrBuilder();
        } else {
          return qosTier_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.QosTiersOverride qos_tier = 3;</code>
       *
       * <pre>
       * Quality of Service tiers enforced by server for overriding client
       *  qos_tier setting in event logging.
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverrideOrBuilder> 
          getQosTierFieldBuilder() {
        if (qosTierBuilder_ == null) {
          qosTierBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverride.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.QosTiersOverrideOrBuilder>(
                  qosTier_,
                  getParentForChildren(),
                  isClean());
          qosTier_ = null;
        }
        return qosTierBuilder_;
      }

      // optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;
      private com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist logSourceBatchingBlacklist_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.getDefaultInstance();
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklistOrBuilder> logSourceBatchingBlacklistBuilder_;
      /**
       * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
       *
       * <pre>
       * Enforced by server for telling Clearcut uploader not to group log events
       *  from certain log sources. If it is not set, client will try to group log
       *  events together with the same upload context without considering log
       *  sources restrictions. Upload context includes following info.
       *  1. PlayLoggerContext.isAnonymous
       *  2. PlayLoggerContext.uploadAccountName
       *  3. PlayLoggerContext.zwiebackCookie
       *  4. PlayLoggerContext.qosTier
       * </pre>
       */
      public boolean hasLogSourceBatchingBlacklist() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
       *
       * <pre>
       * Enforced by server for telling Clearcut uploader not to group log events
       *  from certain log sources. If it is not set, client will try to group log
       *  events together with the same upload context without considering log
       *  sources restrictions. Upload context includes following info.
       *  1. PlayLoggerContext.isAnonymous
       *  2. PlayLoggerContext.uploadAccountName
       *  3. PlayLoggerContext.zwiebackCookie
       *  4. PlayLoggerContext.qosTier
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist getLogSourceBatchingBlacklist() {
        if (logSourceBatchingBlacklistBuilder_ == null) {
          return logSourceBatchingBlacklist_;
        } else {
          return logSourceBatchingBlacklistBuilder_.getMessage();
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
       *
       * <pre>
       * Enforced by server for telling Clearcut uploader not to group log events
       *  from certain log sources. If it is not set, client will try to group log
       *  events together with the same upload context without considering log
       *  sources restrictions. Upload context includes following info.
       *  1. PlayLoggerContext.isAnonymous
       *  2. PlayLoggerContext.uploadAccountName
       *  3. PlayLoggerContext.zwiebackCookie
       *  4. PlayLoggerContext.qosTier
       * </pre>
       */
      public Builder setLogSourceBatchingBlacklist(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist value) {
        if (logSourceBatchingBlacklistBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          logSourceBatchingBlacklist_ = value;
          onChanged();
        } else {
          logSourceBatchingBlacklistBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
       *
       * <pre>
       * Enforced by server for telling Clearcut uploader not to group log events
       *  from certain log sources. If it is not set, client will try to group log
       *  events together with the same upload context without considering log
       *  sources restrictions. Upload context includes following info.
       *  1. PlayLoggerContext.isAnonymous
       *  2. PlayLoggerContext.uploadAccountName
       *  3. PlayLoggerContext.zwiebackCookie
       *  4. PlayLoggerContext.qosTier
       * </pre>
       */
      public Builder setLogSourceBatchingBlacklist(
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.Builder builderForValue) {
        if (logSourceBatchingBlacklistBuilder_ == null) {
          logSourceBatchingBlacklist_ = builderForValue.build();
          onChanged();
        } else {
          logSourceBatchingBlacklistBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
       *
       * <pre>
       * Enforced by server for telling Clearcut uploader not to group log events
       *  from certain log sources. If it is not set, client will try to group log
       *  events together with the same upload context without considering log
       *  sources restrictions. Upload context includes following info.
       *  1. PlayLoggerContext.isAnonymous
       *  2. PlayLoggerContext.uploadAccountName
       *  3. PlayLoggerContext.zwiebackCookie
       *  4. PlayLoggerContext.qosTier
       * </pre>
       */
      public Builder mergeLogSourceBatchingBlacklist(com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist value) {
        if (logSourceBatchingBlacklistBuilder_ == null) {
          if (((bitField0_ & 0x00000008) == 0x00000008) &&
              logSourceBatchingBlacklist_ != com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.getDefaultInstance()) {
            logSourceBatchingBlacklist_ =
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.newBuilder(logSourceBatchingBlacklist_).mergeFrom(value).buildPartial();
          } else {
            logSourceBatchingBlacklist_ = value;
          }
          onChanged();
        } else {
          logSourceBatchingBlacklistBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000008;
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
       *
       * <pre>
       * Enforced by server for telling Clearcut uploader not to group log events
       *  from certain log sources. If it is not set, client will try to group log
       *  events together with the same upload context without considering log
       *  sources restrictions. Upload context includes following info.
       *  1. PlayLoggerContext.isAnonymous
       *  2. PlayLoggerContext.uploadAccountName
       *  3. PlayLoggerContext.zwiebackCookie
       *  4. PlayLoggerContext.qosTier
       * </pre>
       */
      public Builder clearLogSourceBatchingBlacklist() {
        if (logSourceBatchingBlacklistBuilder_ == null) {
          logSourceBatchingBlacklist_ = com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.getDefaultInstance();
          onChanged();
        } else {
          logSourceBatchingBlacklistBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000008);
        return this;
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
       *
       * <pre>
       * Enforced by server for telling Clearcut uploader not to group log events
       *  from certain log sources. If it is not set, client will try to group log
       *  events together with the same upload context without considering log
       *  sources restrictions. Upload context includes following info.
       *  1. PlayLoggerContext.isAnonymous
       *  2. PlayLoggerContext.uploadAccountName
       *  3. PlayLoggerContext.zwiebackCookie
       *  4. PlayLoggerContext.qosTier
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.Builder getLogSourceBatchingBlacklistBuilder() {
        bitField0_ |= 0x00000008;
        onChanged();
        return getLogSourceBatchingBlacklistFieldBuilder().getBuilder();
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
       *
       * <pre>
       * Enforced by server for telling Clearcut uploader not to group log events
       *  from certain log sources. If it is not set, client will try to group log
       *  events together with the same upload context without considering log
       *  sources restrictions. Upload context includes following info.
       *  1. PlayLoggerContext.isAnonymous
       *  2. PlayLoggerContext.uploadAccountName
       *  3. PlayLoggerContext.zwiebackCookie
       *  4. PlayLoggerContext.qosTier
       * </pre>
       */
      public com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklistOrBuilder getLogSourceBatchingBlacklistOrBuilder() {
        if (logSourceBatchingBlacklistBuilder_ != null) {
          return logSourceBatchingBlacklistBuilder_.getMessageOrBuilder();
        } else {
          return logSourceBatchingBlacklist_;
        }
      }
      /**
       * <code>optional .wireless_android_play_playlog.LogSourceBatchingBlacklist log_source_batching_blacklist = 4;</code>
       *
       * <pre>
       * Enforced by server for telling Clearcut uploader not to group log events
       *  from certain log sources. If it is not set, client will try to group log
       *  events together with the same upload context without considering log
       *  sources restrictions. Upload context includes following info.
       *  1. PlayLoggerContext.isAnonymous
       *  2. PlayLoggerContext.uploadAccountName
       *  3. PlayLoggerContext.zwiebackCookie
       *  4. PlayLoggerContext.qosTier
       * </pre>
       */
      private com.google.protobuf.SingleFieldBuilder<
          com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklistOrBuilder> 
          getLogSourceBatchingBlacklistFieldBuilder() {
        if (logSourceBatchingBlacklistBuilder_ == null) {
          logSourceBatchingBlacklistBuilder_ = new com.google.protobuf.SingleFieldBuilder<
              com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklist.Builder, com.google.wireless.android.play.playlog.proto.ClientAnalytics.LogSourceBatchingBlacklistOrBuilder>(
                  logSourceBatchingBlacklist_,
                  getParentForChildren(),
                  isClean());
          logSourceBatchingBlacklist_ = null;
        }
        return logSourceBatchingBlacklistBuilder_;
      }

      // @@protoc_insertion_point(builder_scope:wireless_android_play_playlog.LogResponse)
    }

    static {
      defaultInstance = new LogResponse(true);
      defaultInstance.initFields();
    }

    // @@protoc_insertion_point(class_scope:wireless_android_play_playlog.LogResponse)
  }

  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_LogEventKeyValues_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_LogEventKeyValues_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_ActiveExperiments_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_ActiveExperiments_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_LogEvent_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_LogEvent_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_NetworkConnectionInfo_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_NetworkConnectionInfo_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_ExperimentIds_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_ExperimentIds_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_AndroidClientInfo_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_AndroidClientInfo_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_BrowserInfo_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_BrowserInfo_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_DesktopClientInfo_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_DesktopClientInfo_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_IosClientInfo_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_IosClientInfo_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_PancettaClientInfo_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_PancettaClientInfo_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_PlayCeClientInfo_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_PlayCeClientInfo_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_VrClientInfo_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_VrClientInfo_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_JsClientInfo_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_JsClientInfo_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_ClientInfo_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_ClientInfo_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_ExperimentIdList_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_ExperimentIdList_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_AppUsage1pLogEvent_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_AppUsage1pLogEvent_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_BatchedLogRequest_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_BatchedLogRequest_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_LogRequest_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_LogRequest_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_DeviceStatus_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_DeviceStatus_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_ExternalTimestamp_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_ExternalTimestamp_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_QosTierConfiguration_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_QosTierConfiguration_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_QosTiersOverride_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_QosTiersOverride_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_LogSourceBatchingBlacklist_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_LogSourceBatchingBlacklist_fieldAccessorTable;
  private static com.google.protobuf.Descriptors.Descriptor
    internal_static_wireless_android_play_playlog_LogResponse_descriptor;
  private static
    com.google.protobuf.GeneratedMessage.FieldAccessorTable
      internal_static_wireless_android_play_playlog_LogResponse_fieldAccessorTable;

  public static com.google.protobuf.Descriptors.FileDescriptor
      getDescriptor() {
    return descriptor;
  }
  private static com.google.protobuf.Descriptors.FileDescriptor
      descriptor;
  static {
    java.lang.String[] descriptorData = {
      "\n\025clientanalytics.proto\022\035wireless_androi" +
      "d_play_playlog\"/\n\021LogEventKeyValues\022\013\n\003k" +
      "ey\030\001 \001(\t\022\r\n\005value\030\002 \001(\t\"\247\001\n\021ActiveExperi" +
      "ments\022\"\n\032client_altering_experiment\030\001 \003(" +
      "\t\022\030\n\020other_experiment\030\002 \003(\t\022\026\n\016gws_exper" +
      "iment\030\003 \003(\005\022\027\n\017play_experiment\030\004 \003(\003\022#\n\033" +
      "unsupported_play_experiment\030\005 \003(\003\"\227\007\n\010Lo" +
      "gEvent\022\025\n\revent_time_ms\030\001 \001(\003\022\027\n\017event_u" +
      "ptime_ms\030\021 \001(\003\022\031\n\021sequence_position\030\025 \001(" +
      "\003\022\013\n\003tag\030\002 \001(\t\022\022\n\nevent_code\030\013 \001(\005\022\025\n\rev",
      "ent_flow_id\030\014 \001(\005\022\031\n\021is_user_initiated\030\n" +
      " \001(\010\022?\n\005value\030\003 \003(\01320.wireless_android_p" +
      "lay_playlog.LogEventKeyValues\022\r\n\005store\030\004" +
      " \001(\014\022G\n\014app_usage_1p\030\t \001(\01321.wireless_an" +
      "droid_play_playlog.AppUsage1pLogEvent\022\030\n" +
      "\020source_extension\030\006 \001(\014\022\033\n\023source_extens" +
      "ion_js\030\010 \001(\t\022\035\n\025source_extension_json\030\r " +
      "\001(\t\022=\n\003exp\030\007 \001(\01320.wireless_android_play" +
      "_playlog.ActiveExperiments\022\017\n\007test_id\030\016 " +
      "\001(\t\022\'\n\027timezone_offset_seconds\030\017 \001(\022:\00618",
      "0000\022D\n\016experiment_ids\030\020 \001(\0132,.wireless_" +
      "android_play_playlog.ExperimentIds\022\021\n\tcl" +
      "ient_ve\030\022 \001(\014\022\024\n\014client_ve_js\030\030 \001(\t\022M\n\016i" +
      "nternal_event\030\023 \001(\01625.wireless_android_p" +
      "lay_playlog.LogEvent.InternalEvent\022\021\n\tte" +
      "st_code\030\024 \003(\005\022\022\n\nboot_count\030\026 \001(\003\022U\n\027net" +
      "work_connection_info\030\027 \001(\01324.wireless_an" +
      "droid_play_playlog.NetworkConnectionInfo" +
      "\">\n\rInternalEvent\022\010\n\004NONE\020\000\022\022\n\016WALL_CLOC" +
      "K_SET\020\001\022\017\n\013DEVICE_BOOT\020\002*\t\010\350\007\020\200\200\200\200\002\"\234\003\n\025",
      "NetworkConnectionInfo\022\\\n\014network_type\030\001 " +
      "\001(\0162@.wireless_android_play_playlog.Netw" +
      "orkConnectionInfo.NetworkType:\004NONE\"\244\002\n\013" +
      "NetworkType\022\021\n\004NONE\020\377\377\377\377\377\377\377\377\377\001\022\n\n\006MOBILE" +
      "\020\000\022\010\n\004WIFI\020\001\022\016\n\nMOBILE_MMS\020\002\022\017\n\013MOBILE_S" +
      "UPL\020\003\022\016\n\nMOBILE_DUN\020\004\022\020\n\014MOBILE_HIPRI\020\005\022" +
      "\t\n\005WIMAX\020\006\022\r\n\tBLUETOOTH\020\007\022\t\n\005DUMMY\020\010\022\014\n\010" +
      "ETHERNET\020\t\022\017\n\013MOBILE_FOTA\020\n\022\016\n\nMOBILE_IM" +
      "S\020\013\022\016\n\nMOBILE_CBS\020\014\022\014\n\010WIFI_P2P\020\r\022\r\n\tMOB" +
      "ILE_IA\020\016\022\024\n\020MOBILE_EMERGENCY\020\017\022\t\n\005PROXY\020",
      "\020\022\007\n\003VPN\020\021\"g\n\rExperimentIds\022\022\n\nclear_blo" +
      "b\030\001 \001(\014\022\025\n\rclear_blob_js\030\004 \001(\t\022\026\n\016encryp" +
      "ted_blob\030\002 \003(\014\022\023\n\013users_match\030\003 \001(\010\"\334\003\n\021" +
      "AndroidClientInfo\022\022\n\nandroid_id\030\001 \001(\003\022\022\n" +
      "\nlogging_id\030\002 \001(\t\022\021\n\tdevice_id\030\022 \001(\003\022\023\n\013" +
      "sdk_version\030\003 \001(\005\022\r\n\005model\030\004 \001(\t\022\017\n\007prod" +
      "uct\030\005 \001(\t\022\020\n\010hardware\030\010 \001(\t\022\016\n\006device\030\t " +
      "\001(\t\022\020\n\010os_build\030\006 \001(\t\022\031\n\021application_bui" +
      "ld\030\007 \001(\t\022\017\n\007mcc_mnc\030\n \001(\t\022\016\n\006locale\030\013 \001(" +
      "\t\022\017\n\007country\030\014 \001(\t\022\024\n\014manufacturer\030\r \001(\t",
      "\022\r\n\005brand\030\016 \001(\t\022\r\n\005board\030\017 \001(\t\022\025\n\rradio_" +
      "version\030\020 \001(\t\022\023\n\013fingerprint\030\021 \001(\t\022\035\n\025gm" +
      "s_core_version_code\030\023 \001(\005\022\034\n\024is_sidewind" +
      "er_device\030\024 \001(\010\022\033\n\023chimera_config_info\030\025" +
      " \001(\014\022\034\n\024using_log_source_int\030\026 \001(\010\"^\n\013Br" +
      "owserInfo\022\016\n\006locale\030\001 \001(\t\022\017\n\007browser\030\002 \001" +
      "(\t\022\027\n\017browser_version\030\003 \001(\t\022\025\n\rflash_ver" +
      "sion\030\004 \001(\t\"\245\001\n\021DesktopClientInfo\022\021\n\tclie" +
      "nt_id\030\001 \001(\t\022\022\n\nlogging_id\030\002 \001(\t\022\n\n\002os\030\003 " +
      "\001(\t\022\030\n\020os_major_version\030\004 \001(\t\022\027\n\017os_full",
      "_version\030\005 \001(\t\022\031\n\021application_build\030\006 \001(" +
      "\t\022\017\n\007country\030\007 \001(\t\"\273\001\n\rIosClientInfo\022\021\n\t" +
      "client_id\030\001 \001(\t\022\022\n\nlogging_id\030\002 \001(\t\022\030\n\020o" +
      "s_major_version\030\003 \001(\t\022\027\n\017os_full_version" +
      "\030\004 \001(\t\022\031\n\021application_build\030\005 \001(\t\022\017\n\007cou" +
      "ntry\030\006 \001(\t\022\r\n\005model\030\007 \001(\t\022\025\n\rlanguage_co" +
      "de\030\010 \001(\t\"\270\002\n\022PancettaClientInfo\022\021\n\tdevic" +
      "e_id\030\001 \001(\t\022D\n\002os\030\002 \001(\01628.wireless_androi" +
      "d_play_playlog.PancettaClientInfo.OsType" +
      "\022\016\n\006app_id\030\003 \001(\t\022\023\n\013app_version\030\004 \001(\t\022\017\n",
      "\007mcc_mnc\030\005 \001(\t\"\222\001\n\006OsType\022\023\n\017OS_TYPE_UNK" +
      "NOWN\020\000\022\017\n\013OS_TYPE_MAC\020\001\022\023\n\017OS_TYPE_WINDO" +
      "WS\020\002\022\023\n\017OS_TYPE_ANDROID\020\003\022\020\n\014OS_TYPE_CRO" +
      "S\020\004\022\021\n\rOS_TYPE_LINUX\020\005\022\023\n\017OS_TYPE_OPENBS" +
      "D\020\006\"\234\001\n\020PlayCeClientInfo\022\021\n\tclient_id\030\001 " +
      "\001(\t\022\022\n\nlogging_id\030\007 \001(\t\022\014\n\004make\030\003 \001(\t\022\r\n" +
      "\005model\030\004 \001(\t\022\031\n\021application_build\030\005 \001(\t\022" +
      "\030\n\020platform_version\030\006 \001(\t\022\017\n\007country\030\010 \001" +
      "(\t\"\240\003\n\014VrClientInfo\022P\n\016vr_client_type\030\001 " +
      "\001(\01628.wireless_android_play_playlog.VrCl",
      "ientInfo.VrClientType\022\023\n\013sdk_version\030\002 \001" +
      "(\t\022\023\n\013fingerprint\030\003 \001(\t\022\023\n\013gvr_version\030\004" +
      " \001(\t\022\024\n\014manufacturer\030\005 \001(\t\022\r\n\005model\030\006 \001(" +
      "\t\022\020\n\010language\030\007 \001(\t\022\017\n\007country\030\010 \001(\t\022\025\n\r" +
      "unity_version\030\t \001(\t\022\031\n\021unity_sdk_version" +
      "\030\n \001(\t\"\204\001\n\014VrClientType\022\013\n\007UNKNOWN\020\000\022\031\n\025" +
      "ANDROID_CARDBOARD_SDK\020\001\022\025\n\021IOS_CARDBOARD" +
      "_SDK\020\002\022\025\n\021ANDROID_UNITY_SDK\020\003\022\021\n\rIOS_UNI" +
      "TY_SDK\020\004\022\013\n\007WINDOWS\020\005\"\230\003\n\014JsClientInfo\022\n" +
      "\n\002os\030\001 \001(\t\022\022\n\nos_version\030\002 \001(\t\022K\n\013device",
      "_type\030\003 \001(\01626.wireless_android_play_play" +
      "log.JsClientInfo.DeviceType\022\017\n\007country\030\004" +
      " \001(\t\022\016\n\006locale\030\005 \001(\t\022C\n\007os_type\030\006 \001(\01622." +
      "wireless_android_play_playlog.JsClientIn" +
      "fo.OsType\"u\n\006OsType\022\016\n\nOS_UNKNOWN\020\000\022\007\n\003M" +
      "AC\020\001\022\013\n\007WINDOWS\020\002\022\013\n\007ANDROID\020\003\022\t\n\005LINUX\020" +
      "\004\022\r\n\tCHROME_OS\020\005\022\010\n\004IPAD\020\006\022\n\n\006IPHONE\020\007\022\010" +
      "\n\004IPOD\020\010\">\n\nDeviceType\022\013\n\007UNKNOWN\020\000\022\n\n\006M" +
      "OBILE\020\001\022\n\n\006TABLET\020\002\022\013\n\007DESKTOP\020\003\"\326\006\n\nCli" +
      "entInfo\022I\n\013client_type\030\001 \001(\01624.wireless_",
      "android_play_playlog.ClientInfo.ClientTy" +
      "pe\022\023\n\013remote_host\030\006 \001(\t\022\024\n\014remote_host6\030" +
      "\007 \001(\t\022M\n\023android_client_info\030\002 \001(\01320.wir" +
      "eless_android_play_playlog.AndroidClient" +
      "Info\022M\n\023desktop_client_info\030\003 \001(\01320.wire" +
      "less_android_play_playlog.DesktopClientI" +
      "nfo\022E\n\017ios_client_info\030\004 \001(\0132,.wireless_" +
      "android_play_playlog.IosClientInfo\022L\n\023pl" +
      "ay_ce_client_info\030\005 \001(\0132/.wireless_andro" +
      "id_play_playlog.PlayCeClientInfo\022C\n\016vr_c",
      "lient_info\030\010 \001(\0132+.wireless_android_play" +
      "_playlog.VrClientInfo\022O\n\024pancetta_client" +
      "_info\030\n \001(\01321.wireless_android_play_play" +
      "log.PancettaClientInfo\022@\n\014browser_info\030\t" +
      " \001(\0132*.wireless_android_play_playlog.Bro" +
      "wserInfo\022C\n\016js_client_info\030\013 \001(\0132+.wirel" +
      "ess_android_play_playlog.JsClientInfo\"\201\001" +
      "\n\nClientType\022\013\n\007UNKNOWN\020\000\022\006\n\002JS\020\001\022\013\n\007DES" +
      "KTOP\020\002\022\007\n\003IOS\020\003\022\013\n\007ANDROID\020\004\022\013\n\007PLAY_CE\020" +
      "\005\022\n\n\006PYTHON\020\006\022\006\n\002VR\020\007\022\014\n\010PANCETTA\020\010\022\014\n\010D",
      "RIVE_FS\020\t\"\036\n\020ExperimentIdList\022\n\n\002id\030\001 \003(" +
      "\t\"U\n\022AppUsage1pLogEvent\022\020\n\010app_type\030\001 \001(" +
      "\005\022\034\n\024android_package_name\030\002 \001(\t\022\017\n\007versi" +
      "on\030\003 \001(\t\"S\n\021BatchedLogRequest\022>\n\013log_req" +
      "uest\030\001 \003(\0132).wireless_android_play_playl" +
      "og.LogRequest\"\320:\n\nLogRequest\022\027\n\017request_" +
      "time_ms\030\004 \001(\003\022\031\n\021request_uptime_ms\030\010 \001(\003" +
      "\022>\n\013client_info\030\001 \001(\0132).wireless_android" +
      "_play_playlog.ClientInfo\022P\n\nlog_source\030\002" +
      " \001(\01623.wireless_android_play_playlog.Log",
      "Request.LogSource:\007UNKNOWN\022\027\n\017log_source" +
      "_name\030\006 \001(\t\022\027\n\017zwieback_cookie\030\007 \001(\t\022:\n\t" +
      "log_event\030\003 \003(\0132\'.wireless_android_play_" +
      "playlog.LogEvent\022\035\n\025serialized_log_event" +
      "s\030\005 \003(\014\022V\n\010qos_tier\030\t \001(\0162;.wireless_and" +
      "roid_play_playlog.QosTierConfiguration.Q" +
      "osTier:\007DEFAULT\022J\n\tscheduler\030\n \001(\01627.wir" +
      "eless_android_play_playlog.LogRequest.Sc" +
      "hedulerType\022B\n\rdevice_status\030\013 \001(\0132+.wir" +
      "eless_android_play_playlog.DeviceStatus\022",
      "L\n\022external_timestamp\030\014 \001(\01320.wireless_a" +
      "ndroid_play_playlog.ExternalTimestamp\"\2314" +
      "\n\tLogSource\022\024\n\007UNKNOWN\020\377\377\377\377\377\377\377\377\377\001\022\t\n\005STO" +
      "RE\020\000\022\r\n\tWEB_STORE\020A\022\017\n\nWORK_STORE\020\204\001\022\023\n\016" +
      "WORK_STORE_APP\020\205\002\022\r\n\tEDU_STORE\020\017\022\t\n\005MUSI" +
      "C\020\001\022\t\n\005BOOKS\020\002\022\t\n\005VIDEO\020\003\022\n\n\006MOVIES\020J\022\r\n" +
      "\tMAGAZINES\020\004\022\t\n\005GAMES\020\005\022\010\n\004LB_A\020\006\022\017\n\013AND" +
      "ROID_IDE\020\007\022\010\n\004LB_P\020\010\022\010\n\004LB_S\020\t\022\014\n\010GMS_CO" +
      "RE\020\n\022\020\n\014APP_USAGE_1P\020\013\022\t\n\005ICING\020\014\022\014\n\010HER" +
      "REVAD\020\r\022\r\n\tGOOGLE_TV\020\016\022\023\n\017GMS_CORE_PEOPL",
      "E\020\020\022\006\n\002LE\020\021\022\024\n\020GOOGLE_ANALYTICS\020\022\022\010\n\004LB_" +
      "D\020\023\022\017\n\013ANDROID_GSA\020\024\022\010\n\004LB_T\020\025\022\023\n\017PERSON" +
      "AL_LOGGER\020\026\022\033\n\027PERSONAL_BROWSER_LOGGER\020%" +
      "\022\"\n\036GMS_CORE_WALLET_MERCHANT_ERROR\020\027\022\010\n\004" +
      "LB_C\020\030\022\t\n\005LB_IA\0204\022\n\n\005LB_CB\020\355\001\022\n\n\005LB_DM\020\214" +
      "\002\022\020\n\014ANDROID_AUTH\020\031\022\022\n\016ANDROID_CAMERA\020\032\022" +
      "\006\n\002CW\020\033\022\020\n\013CW_COUNTERS\020\363\001\022\007\n\003GEL\020\034\022\016\n\nDN" +
      "A_PROBER\020\035\022\007\n\003UDR\020\036\022\023\n\017GMS_CORE_WALLET\020\037" +
      "\022\n\n\006SOCIAL\020 \022\022\n\016INSTORE_WALLET\020!\022\010\n\004NOVA" +
      "\020\"\022\t\n\005LB_CA\020#\022\r\n\tLATIN_IME\020$\022\020\n\014NEWS_WEA",
      "THER\020&\022\013\n\007HANGOUT\020\'\022\027\n\023HANGOUT_LOG_REQUE" +
      "ST\0202\022\016\n\nCOPRESENCE\020(\022\023\n\017SOCIAL_AFFINITY\020" +
      ")\022\n\n\006PHOTOS\020*\022\007\n\003GCM\020+\022\n\n\006GOKART\020,\022\t\n\005FI" +
      "NDR\020-\022\025\n\021ANDROID_MESSAGING\020.\022\016\n\nSOCIAL_W" +
      "EB\020/\022\014\n\010BACKDROP\0200\022\016\n\nTELEMATICS\0201\022\021\n\rGV" +
      "C_HARVESTER\0203\022\007\n\003CAR\0205\022\021\n\rPIXEL_PERFECT\020" +
      "6\022\t\n\005DRIVE\0207\022\010\n\004DOCS\0208\022\n\n\006SHEETS\0209\022\n\n\006SL" +
      "IDES\020:\022\007\n\003IME\020;\022\010\n\004WARP\020<\022\022\n\016NFC_PROGRAM" +
      "MER\020=\022\014\n\010NETSTATS\020>\022\r\n\tNEWSSTAND\020?\022\025\n\021KI" +
      "DS_COMMUNICATOR\020@\022\022\n\016WIFI_ASSISTANT\020B\022\023\n",
      "\017CAST_SENDER_SDK\020C\022\021\n\rCRONET_SOCIAL\020D\022\r\n" +
      "\tPHENOTYPE\020E\022\026\n\022PHENOTYPE_COUNTERS\020F\022\020\n\014" +
      "CHROME_INFRA\020G\022\r\n\tJUSTSPEAK\020H\022\020\n\014PERF_PR" +
      "OFILE\020I\022\013\n\007KATNISS\020K\022\024\n\020SOCIAL_APPINVITE" +
      "\020L\022\020\n\014GMM_COUNTERS\020M\022\022\n\016BOND_ONEGOOGLE\020N" +
      "\022\014\n\010MAPS_API\020O\022\026\n\021CRONET_ANDROID_YT\020\304\001\022\026" +
      "\n\022CRONET_ANDROID_GSA\020P\022\027\n\023GOOGLE_FIT_WEA" +
      "RABLE\020Q\022\024\n\017FITNESS_ANDROID\020\251\001\022\025\n\020FITNESS" +
      "_GMS_CORE\020\252\001\022\022\n\016GOOGLE_EXPRESS\020R\022\027\n\022GOOG" +
      "LE_EXPRESS_DEV\020\327\001\022*\n%GOOGLE_EXPRESS_COUR",
      "IER_ANDROID_PRIMES\020\344\001\022\"\n\035GOOGLE_EXPRESS_" +
      "ANDROID_PRIMES\020\345\001\022+\n&GOOGLE_EXPRESS_STOR" +
      "EOMS_ANDROID_PRIMES\020\360\001\022\t\n\005SENSE\020S\022\022\n\016AND" +
      "ROID_BACKUP\020T\022\006\n\002VR\020U\022\020\n\014IME_COUNTERS\020V\022" +
      "\020\n\014SETUP_WIZARD\020W\022\024\n\020EMERGENCY_ASSIST\020X\022" +
      "\010\n\004TRON\020Y\022\021\n\rTRON_COUNTERS\020Z\022\021\n\rBATTERY_" +
      "STATS\020[\022\016\n\nDISK_STATS\020\\\022\022\n\016GRAPHICS_STAT" +
      "S\020k\022\016\n\nPROC_STATS\020]\022\r\n\010DROP_BOX\020\203\001\022\026\n\021FI" +
      "NGERPRINT_STATS\020\265\001\022\027\n\022NOTIFICATION_STATS" +
      "\020\266\001\022\025\n\021TAP_AND_PAY_GCORE\020^\022\016\n\nA11YLOGGER",
      "\020_\022\020\n\014GCM_COUNTERS\020`\022\031\n\025PLACES_NO_GLS_CO" +
      "NSENT\020a\022\027\n\023TACHYON_LOG_REQUEST\020b\022\024\n\020TACH" +
      "YON_COUNTERS\020c\022\n\n\006VISION\020d\022\030\n\024SOCIAL_USE" +
      "R_LOCATION\020e\022\022\n\016LAUNCHPAD_TOYS\020f\022\024\n\020META" +
      "LOG_COUNTERS\020g\022\024\n\020MOBILESDK_CLIENT\020h\022\027\n\023" +
      "ANDROID_VERIFY_APPS\020i\022\014\n\010ADSHIELD\020j\022\013\n\007S" +
      "HERLOG\020l\022\023\n\017LE_ULR_COUNTERS\020m\022\013\n\007GMM_UE3" +
      "\020n\022\014\n\010CALENDAR\020o\022\t\n\005ENDER\020p\022\022\n\016FAMILY_CO" +
      "MPASS\020q\022\013\n\007TRANSOM\020r\022\024\n\020TRANSOM_COUNTERS" +
      "\020s\022\t\n\005LB_AS\020t\022\n\n\006LB_CFG\020u\022\013\n\007IOS_GSA\020v\022\023",
      "\n\017TAP_AND_PAY_APP\020w\022\035\n\030TAP_AND_PAY_APP_C" +
      "OUNTERS\020\211\002\022\014\n\010FLYDROID\020x\022\016\n\nCPANEL_APP\020y" +
      "\022\026\n\022ANDROID_SNET_GCORE\020z\022\025\n\021ANDROID_SNET" +
      "_IDLE\020{\022\024\n\020ANDROID_SNET_JAR\020|\022\023\n\017CONTEXT" +
      "_MANAGER\020}\022\r\n\tCLASSROOM\020~\022\016\n\nTAILORMADE\020" +
      "\177\022\t\n\004KEEP\020\200\001\022\027\n\022GMM_BRIIM_COUNTERS\020\201\001\022\027\n" +
      "\022CHROMECAST_APP_LOG\020\202\001\022\023\n\016ADWORDS_MOBILE" +
      "\020\205\001\022\023\n\016LEANBACK_EVENT\020\206\001\022\022\n\rANDROID_GMAI" +
      "L\020\207\001\022\017\n\nSAMPLE_SHM\020\210\001\022\031\n\024GPLUS_ANDROID_P" +
      "RIMES\020\214\001\022 \n\033GPLUS_ANDROID_SYSTEM_HEALTH\020",
      "\214\001\022\031\n\024GMAIL_ANDROID_PRIMES\020\226\001\022 \n\033GMAIL_A" +
      "NDROID_SYSTEM_HEALTH\020\226\001\022\034\n\027CALENDAR_ANDR" +
      "OID_PRIMES\020\227\001\022#\n\036CALENDAR_ANDROID_SYSTEM" +
      "_HEALTH\020\227\001\022\030\n\023DOCS_ANDROID_PRIMES\020\230\001\022\037\n\032" +
      "DOCS_ANDROID_SYSTEM_HEALTH\020\230\001\022\037\n\032YT_MAIN" +
      "_APP_ANDROID_PRIMES\020\232\001\022\033\n\026YT_KIDS_ANDROI" +
      "D_PRIMES\020\233\001\022\035\n\030YT_GAMING_ANDROID_PRIMES\020" +
      "\234\001\022\034\n\027YT_MUSIC_ANDROID_PRIMES\020\235\001\022\033\n\026YT_L" +
      "ITE_ANDROID_PRIMES\020\236\001\022\036\n\031YT_CREATOR_ANDR" +
      "OID_PRIMES\020\253\001\022\027\n\022JAM_ANDROID_PRIMES\020\237\001\022\035",
      "\n\030JAM_KIOSK_ANDROID_PRIMES\020\240\001\022\032\n\025PHOTOS_" +
      "ANDROID_PRIMES\020\245\001\022\031\n\024DRIVE_ANDROID_PRIME" +
      "S\020\246\001\022\032\n\025SHEETS_ANDROID_PRIMES\020\247\001\022\032\n\025SLID" +
      "ES_ANDROID_PRIMES\020\250\001\022\034\n\027SNAPSEED_ANDROID" +
      "_PRIMES\020\262\001\022\034\n\027HANGOUTS_ANDROID_PRIMES\020\263\001" +
      "\022\031\n\024INBOX_ANDROID_PRIMES\020\264\001\022\025\n\020INBOX_IOS" +
      "_PRIMES\020\206\002\022\023\n\016SDP_IOS_PRIMES\020\237\002\022\033\n\026GMSCO" +
      "RE_ANDROID_PRIMES\020\301\001\022#\n\036PLAY_MUSIC_ANDRO" +
      "ID_WEAR_PRIMES\020\310\001\022\034\n\027GEARHEAD_ANDROID_PR" +
      "IMES\020\311\001\022\034\n\027INSTORE_CONSUMER_PRIMES\020\317\001\022\026\n",
      "\021SAMPLE_IOS_PRIMES\020\312\001\022\032\n\025CPANEL_ANDROID_" +
      "PRIMES\020\325\001\022\032\n\025HUDDLE_ANDROID_PRIMES\020\326\001\022\027\n" +
      "\022AWX_ANDROID_PRIMES\020\336\001\022\027\n\022GHS_ANDROID_PR" +
      "IMES\020\337\001\022\"\n\035ADWORDS_MOBILE_ANDROID_PRIMES" +
      "\020\340\001\022\037\n\032TAP_AND_PAY_ANDROID_PRIMES\020\343\001\022\036\n\031" +
      "WALLET_APP_ANDROID_PRIMES\020\350\001\022\032\n\025WALLET_A" +
      "PP_IOS_PRIMES\020\351\001\022\035\n\030ANALYTICS_ANDROID_PR" +
      "IMES\020\353\001\022\032\n\025SPACES_ANDROID_PRIMES\020\354\001\022\026\n\021S" +
      "PACES_IOS_PRIMES\020\224\002\022\033\n\026SOCIETY_ANDROID_P" +
      "RIMES\020\356\001\022\025\n\020GMM_BRIIM_PRIMES\020\357\001\022\016\n\tCW_PR",
      "IMES\020\362\001\022\036\n\031FAMILYLINK_ANDROID_PRIMES\020\364\001\022" +
      "\032\n\025FAMILYLINK_IOS_PRIMES\020\243\002\022\016\n\tWH_PRIMES" +
      "\020\370\001\022\030\n\023NOVA_ANDROID_PRIMES\020\371\001\022!\n\034PHOTOS_" +
      "DRAPER_ANDROID_PRIMES\020\375\001\022\017\n\nGMM_PRIMES\020\376" +
      "\001\022\035\n\030TRANSLATE_ANDROID_PRIMES\020\377\001\022\031\n\024TRAN" +
      "SLATE_IOS_PRIMES\020\200\002\022\034\n\027FLYDROID_ANDROID_" +
      "PRIMES\020\203\002\022\026\n\021CONSUMERIQ_PRIMES\020\204\002\022\027\n\022GMB" +
      "_ANDROID_PRIMES\020\207\002\022\024\n\017CLOUDDPC_PRIMES\020\260\002" +
      "\022\030\n\023CLOUDDPC_ARC_PRIMES\020\261\002\022\n\n\005ICORE\020\211\001\022\031" +
      "\n\024PANCETTA_MOBILE_HOST\020\212\001\022\"\n\035PANCETTA_MO",
      "BILE_HOST_COUNTERS\020\213\001\022\034\n\027CROSSDEVICENOTI" +
      "FICATION\020\215\001\022 \n\033CROSSDEVICENOTIFICATION_D" +
      "EV\020\216\001\022\026\n\021MAPS_API_COUNTERS\020\217\001\022\010\n\003GPU\020\220\001\022" +
      "\016\n\tON_THE_GO\020\221\001\022\027\n\022ON_THE_GO_COUNTERS\020\222\001" +
      "\022!\n\034GMS_CORE_PEOPLE_AUTOCOMPLETE\020\223\001\022\026\n\021F" +
      "LYDROID_COUNTERS\020\224\001\022\r\n\010FIREBALL\020\225\001\022\026\n\021FI" +
      "REBALL_COUNTERS\020\201\002\022\024\n\017CRONET_FIREBALL\020\257\002" +
      "\022\024\n\017FIREBALL_PRIMES\020\212\002\022\030\n\023FIREBALL_IOS_P" +
      "RIMES\020\271\002\022,\n\'GOOGLE_HANDWRITING_INPUT_AND" +
      "ROID_PRIMES\020\272\002\022\016\n\tPYROCLASM\020\231\001\022\031\n\024ANDROI",
      "D_GSA_COUNTERS\020\241\001\022\024\n\017JAM_IMPRESSIONS\020\242\001\022" +
      "\032\n\025JAM_KIOSK_IMPRESSIONS\020\243\001\022\021\n\014PAYMENTS_" +
      "OCR\020\244\001\022\036\n\031UNICORN_FAMILY_MANAGEMENT\020\254\001\022\014" +
      "\n\007AUDITOR\020\255\001\022\r\n\010NQLOOKUP\020\256\001\022%\n ANDROID_G" +
      "SA_HIGH_PRIORITY_EVENTS\020\257\001\022\023\n\016ANDROID_DI" +
      "ALER\020\260\001\022\022\n\rCLEARCUT_DEMO\020\261\001\022\017\n\nAPPMANAGE" +
      "R\020\267\001\022\027\n\022SMARTLOCK_COUNTERS\020\270\001\022\026\n\021EXPEDIT" +
      "IONS_GUIDE\020\271\001\022\t\n\004FUSE\020\272\001\022&\n!PIXEL_PERFEC" +
      "T_CLIENT_STATE_LOGGER\020\273\001\022\034\n\027PLATFORM_STA" +
      "TS_COUNTERS\020\274\001\022\021\n\014DRIVE_VIEWER\020\275\001\022\017\n\nPDF",
      "_VIEWER\020\276\001\022\013\n\006BIGTOP\020\277\001\022\n\n\005VOICE\020\300\001\022\014\n\007M" +
      "YFIBER\020\302\001\022\023\n\016RECORDED_PAGES\020\303\001\022\014\n\007MOB_DO" +
      "G\020\305\001\022\017\n\nWALLET_APP\020\306\001\022\013\n\006GBOARD\020\307\001\022\017\n\nCR" +
      "ONET_GMM\020\313\001\022\021\n\014TRUSTED_FACE\020\314\001\022\017\n\nMATCHS" +
      "TICK\020\315\001\022\020\n\013APP_CATALOG\020\316\001\022\016\n\tBLUETOOTH\020\320" +
      "\001\022\t\n\004WIFI\020\321\001\022\014\n\007TELECOM\020\322\001\022\016\n\tTELEPHONY\020" +
      "\323\001\022\026\n\021IDENTITY_FRONTEND\020\324\001\022\013\n\006SESAME\020\330\001\022" +
      "\034\n\027GOOGLE_KEYBOARD_CONTENT\020\331\001\022\013\n\006MADDEN\020" +
      "\332\001\022\010\n\003INK\020\333\001\022\025\n\020ANDROID_CONTACTS\020\334\001\022\035\n\030G" +
      "OOGLE_KEYBOARD_COUNTERS\020\335\001\022\024\n\017CLEARCUT_P",
      "ROBER\020\341\001\022\025\n\020PLAY_CONSOLE_APP\020\342\001\022\034\n\027PLAY_" +
      "CONSOLE_APP_PRIMES\020\210\002\022\r\n\010SPECTRUM\020\346\001\022\026\n\021" +
      "SPECTRUM_COUNTERS\020\347\001\022\034\n\027SPECTRUM_ANDROID" +
      "_PRIMES\020\213\002\022!\n\034IOS_SPOTLIGHT_SEARCH_LIBRA" +
      "RY\020\352\001\022\014\n\007BOQ_WEB\020\361\001\022\031\n\024ORCHESTRATION_CLI" +
      "ENT\020\365\001\022\035\n\030ORCHESTRATION_CLIENT_DEV\020\366\001\022\030\n" +
      "\023GOOGLE_NOW_LAUNCHER\020\367\001\022\033\n\026SCOOBY_SPAM_R" +
      "EPORT_LOG\020\372\001\022\017\n\nIOS_GROWTH\020\373\001\022\020\n\013APPS_NO" +
      "TIFY\020\374\001\022\021\n\014SMARTKEY_APP\020\215\002\022\025\n\020CLINICAL_S" +
      "TUDIES\020\216\002\022\033\n\026FITNESS_ANDROID_PRIMES\020\217\002\022\020",
      "\n\013IMPROV_APPS\020\220\002\022\017\n\nFAMILYLINK\020\221\002\022\030\n\023FAM" +
      "ILYLINK_COUNTERS\020\222\002\022\014\n\007SOCIETY\020\223\002\022\032\n\025DIA" +
      "LER_ANDROID_PRIMES\020\225\002\022\031\n\024YOUTUBE_DIRECTO" +
      "R_APP\020\226\002\022\033\n\026TACHYON_ANDROID_PRIMES\020\227\002\022\r\n" +
      "\010DRIVE_FS\020\230\002\022\014\n\007YT_MAIN\020\231\002\022$\n\037WING_MARKE" +
      "TPLACE_ANDROID_PRIMES\020\232\002\022\r\n\010DYNAMITE\020\233\002\022" +
      "\026\n\021CORP_ANDROID_FOOD\020\234\002\022\035\n\030ANDROID_MESSA" +
      "GING_PRIMES\020\235\002\022\025\n\020GPLUS_IOS_PRIMES\020\236\002\022\036\n" +
      "\031CHROMECAST_ANDROID_PRIMES\020\240\002\022\021\n\014APPSTRE" +
      "AMING\020\241\002\022\020\n\013GMB_ANDROID\020\242\002\022\025\n\020VOICE_IOS_",
      "PRIMES\020\244\002\022\031\n\024VOICE_ANDROID_PRIMES\020\245\002\022\n\n\005" +
      "PAISA\020\246\002\022\014\n\007GMB_IOS\020\247\002\022\022\n\rSCOOBY_EVENTS\020" +
      "\250\002\022\030\n\023SNAPSEED_IOS_PRIMES\020\251\002\022 \n\033YOUTUBE_" +
      "DIRECTOR_IOS_PRIMES\020\252\002\022\025\n\020WALLPAPER_PICK" +
      "ER\020\253\002\022\n\n\005CHIME\020\254\002\022\021\n\014BEACON_GCORE\020\255\002\022\023\n\016" +
      "ANDROID_STUDIO\020\256\002\022\021\n\014DOCS_OFFLINE\020\262\002\022\016\n\t" +
      "FREIGHTER\020\263\002\022\024\n\017DOCS_IOS_PRIMES\020\264\002\022\026\n\021SL" +
      "IDES_IOS_PRIMES\020\265\002\022\026\n\021SHEETS_IOS_PRIMES\020" +
      "\266\002\022\023\n\016IPCONNECTIVITY\020\267\002\022\014\n\007CURATOR\020\270\002\032\002\020" +
      "\001\"\221\001\n\rSchedulerType\022\025\n\021UNKNOWN_SCHEDULER",
      "\020\000\022\010\n\004ASAP\020\001\022\024\n\020DEFAULT_PERIODIC\020\002\022\023\n\017QO" +
      "S_FAST_ONEOFF\020\003\022\030\n\024QOS_DEFAULT_PERIODIC\020" +
      "\004\022\032\n\026QOS_UNMETERED_PERIODIC\020\005*\t\010\350\007\020\200\200\200\200\002" +
      "\"\354\001\n\014DeviceStatus\022\024\n\014is_unmetered\030\001 \001(\010\022" +
      "\023\n\013is_charging\030\002 \001(\010\022S\n\020auto_time_status" +
      "\030\003 \001(\01629.wireless_android_play_playlog.D" +
      "eviceStatus.AutomaticTime\022\031\n\021is_googler_" +
      "device\030\004 \001(\010\"A\n\rAutomaticTime\022\013\n\007UNKNOWN" +
      "\020\000\022\021\n\rAUTO_TIME_OFF\020\001\022\020\n\014AUTO_TIME_ON\020\002\"" +
      "G\n\021ExternalTimestamp\022\017\n\007time_ms\030\001 \001(\003\022\021\n",
      "\tuptime_ms\030\002 \001(\003\022\016\n\006source\030\003 \001(\t\"\346\001\n\024Qos" +
      "TierConfiguration\022\027\n\017log_source_name\030\001 \001" +
      "(\t\022M\n\010qos_tier\030\002 \001(\0162;.wireless_android_" +
      "play_playlog.QosTierConfiguration.QosTie" +
      "r\"f\n\007QosTier\022\013\n\007DEFAULT\020\000\022\022\n\016UNMETERED_O" +
      "NLY\020\001\022\026\n\022UNMETERED_OR_DAILY\020\002\022\027\n\023FAST_IF" +
      "_RADIO_AWAKE\020\003\022\t\n\005NEVER\020\004\"\205\001\n\020QosTiersOv" +
      "erride\022S\n\026qos_tier_configuration\030\001 \003(\01323" +
      ".wireless_android_play_playlog.QosTierCo" +
      "nfiguration\022\034\n\024qos_tier_fingerprint\030\002 \001(",
      "\003\"5\n\032LogSourceBatchingBlacklist\022\027\n\017log_s" +
      "ource_name\030\001 \003(\t\"\236\002\n\013LogResponse\022$\n\030next" +
      "_request_wait_millis\030\001 \001(\003:\002-1\022D\n\013experi" +
      "ments\030\002 \001(\0132/.wireless_android_play_play" +
      "log.ExperimentIdList\022A\n\010qos_tier\030\003 \001(\0132/" +
      ".wireless_android_play_playlog.QosTiersO" +
      "verride\022`\n\035log_source_batching_blacklist" +
      "\030\004 \001(\01329.wireless_android_play_playlog.L" +
      "ogSourceBatchingBlacklistBA\n.com.google." +
      "wireless.android.play.playlog.protoB\017Cli",
      "entAnalytics"
    };
    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
        public com.google.protobuf.ExtensionRegistry assignDescriptors(
            com.google.protobuf.Descriptors.FileDescriptor root) {
          descriptor = root;
          internal_static_wireless_android_play_playlog_LogEventKeyValues_descriptor =
            getDescriptor().getMessageTypes().get(0);
          internal_static_wireless_android_play_playlog_LogEventKeyValues_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_LogEventKeyValues_descriptor,
              new java.lang.String[] { "Key", "Value", });
          internal_static_wireless_android_play_playlog_ActiveExperiments_descriptor =
            getDescriptor().getMessageTypes().get(1);
          internal_static_wireless_android_play_playlog_ActiveExperiments_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_ActiveExperiments_descriptor,
              new java.lang.String[] { "ClientAlteringExperiment", "OtherExperiment", "GwsExperiment", "PlayExperiment", "UnsupportedPlayExperiment", });
          internal_static_wireless_android_play_playlog_LogEvent_descriptor =
            getDescriptor().getMessageTypes().get(2);
          internal_static_wireless_android_play_playlog_LogEvent_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_LogEvent_descriptor,
              new java.lang.String[] { "EventTimeMs", "EventUptimeMs", "SequencePosition", "Tag", "EventCode", "EventFlowId", "IsUserInitiated", "Value", "Store", "AppUsage1P", "SourceExtension", "SourceExtensionJs", "SourceExtensionJson", "Exp", "TestId", "TimezoneOffsetSeconds", "ExperimentIds", "ClientVe", "ClientVeJs", "InternalEvent", "TestCode", "BootCount", "NetworkConnectionInfo", });
          internal_static_wireless_android_play_playlog_NetworkConnectionInfo_descriptor =
            getDescriptor().getMessageTypes().get(3);
          internal_static_wireless_android_play_playlog_NetworkConnectionInfo_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_NetworkConnectionInfo_descriptor,
              new java.lang.String[] { "NetworkType", });
          internal_static_wireless_android_play_playlog_ExperimentIds_descriptor =
            getDescriptor().getMessageTypes().get(4);
          internal_static_wireless_android_play_playlog_ExperimentIds_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_ExperimentIds_descriptor,
              new java.lang.String[] { "ClearBlob", "ClearBlobJs", "EncryptedBlob", "UsersMatch", });
          internal_static_wireless_android_play_playlog_AndroidClientInfo_descriptor =
            getDescriptor().getMessageTypes().get(5);
          internal_static_wireless_android_play_playlog_AndroidClientInfo_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_AndroidClientInfo_descriptor,
              new java.lang.String[] { "AndroidId", "LoggingId", "DeviceId", "SdkVersion", "Model", "Product", "Hardware", "Device", "OsBuild", "ApplicationBuild", "MccMnc", "Locale", "Country", "Manufacturer", "Brand", "Board", "RadioVersion", "Fingerprint", "GmsCoreVersionCode", "IsSidewinderDevice", "ChimeraConfigInfo", "UsingLogSourceInt", });
          internal_static_wireless_android_play_playlog_BrowserInfo_descriptor =
            getDescriptor().getMessageTypes().get(6);
          internal_static_wireless_android_play_playlog_BrowserInfo_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_BrowserInfo_descriptor,
              new java.lang.String[] { "Locale", "Browser", "BrowserVersion", "FlashVersion", });
          internal_static_wireless_android_play_playlog_DesktopClientInfo_descriptor =
            getDescriptor().getMessageTypes().get(7);
          internal_static_wireless_android_play_playlog_DesktopClientInfo_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_DesktopClientInfo_descriptor,
              new java.lang.String[] { "ClientId", "LoggingId", "Os", "OsMajorVersion", "OsFullVersion", "ApplicationBuild", "Country", });
          internal_static_wireless_android_play_playlog_IosClientInfo_descriptor =
            getDescriptor().getMessageTypes().get(8);
          internal_static_wireless_android_play_playlog_IosClientInfo_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_IosClientInfo_descriptor,
              new java.lang.String[] { "ClientId", "LoggingId", "OsMajorVersion", "OsFullVersion", "ApplicationBuild", "Country", "Model", "LanguageCode", });
          internal_static_wireless_android_play_playlog_PancettaClientInfo_descriptor =
            getDescriptor().getMessageTypes().get(9);
          internal_static_wireless_android_play_playlog_PancettaClientInfo_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_PancettaClientInfo_descriptor,
              new java.lang.String[] { "DeviceId", "Os", "AppId", "AppVersion", "MccMnc", });
          internal_static_wireless_android_play_playlog_PlayCeClientInfo_descriptor =
            getDescriptor().getMessageTypes().get(10);
          internal_static_wireless_android_play_playlog_PlayCeClientInfo_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_PlayCeClientInfo_descriptor,
              new java.lang.String[] { "ClientId", "LoggingId", "Make", "Model", "ApplicationBuild", "PlatformVersion", "Country", });
          internal_static_wireless_android_play_playlog_VrClientInfo_descriptor =
            getDescriptor().getMessageTypes().get(11);
          internal_static_wireless_android_play_playlog_VrClientInfo_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_VrClientInfo_descriptor,
              new java.lang.String[] { "VrClientType", "SdkVersion", "Fingerprint", "GvrVersion", "Manufacturer", "Model", "Language", "Country", "UnityVersion", "UnitySdkVersion", });
          internal_static_wireless_android_play_playlog_JsClientInfo_descriptor =
            getDescriptor().getMessageTypes().get(12);
          internal_static_wireless_android_play_playlog_JsClientInfo_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_JsClientInfo_descriptor,
              new java.lang.String[] { "Os", "OsVersion", "DeviceType", "Country", "Locale", "OsType", });
          internal_static_wireless_android_play_playlog_ClientInfo_descriptor =
            getDescriptor().getMessageTypes().get(13);
          internal_static_wireless_android_play_playlog_ClientInfo_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_ClientInfo_descriptor,
              new java.lang.String[] { "ClientType", "RemoteHost", "RemoteHost6", "AndroidClientInfo", "DesktopClientInfo", "IosClientInfo", "PlayCeClientInfo", "VrClientInfo", "PancettaClientInfo", "BrowserInfo", "JsClientInfo", });
          internal_static_wireless_android_play_playlog_ExperimentIdList_descriptor =
            getDescriptor().getMessageTypes().get(14);
          internal_static_wireless_android_play_playlog_ExperimentIdList_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_ExperimentIdList_descriptor,
              new java.lang.String[] { "Id", });
          internal_static_wireless_android_play_playlog_AppUsage1pLogEvent_descriptor =
            getDescriptor().getMessageTypes().get(15);
          internal_static_wireless_android_play_playlog_AppUsage1pLogEvent_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_AppUsage1pLogEvent_descriptor,
              new java.lang.String[] { "AppType", "AndroidPackageName", "Version", });
          internal_static_wireless_android_play_playlog_BatchedLogRequest_descriptor =
            getDescriptor().getMessageTypes().get(16);
          internal_static_wireless_android_play_playlog_BatchedLogRequest_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_BatchedLogRequest_descriptor,
              new java.lang.String[] { "LogRequest", });
          internal_static_wireless_android_play_playlog_LogRequest_descriptor =
            getDescriptor().getMessageTypes().get(17);
          internal_static_wireless_android_play_playlog_LogRequest_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_LogRequest_descriptor,
              new java.lang.String[] { "RequestTimeMs", "RequestUptimeMs", "ClientInfo", "LogSource", "LogSourceName", "ZwiebackCookie", "LogEvent", "SerializedLogEvents", "QosTier", "Scheduler", "DeviceStatus", "ExternalTimestamp", });
          internal_static_wireless_android_play_playlog_DeviceStatus_descriptor =
            getDescriptor().getMessageTypes().get(18);
          internal_static_wireless_android_play_playlog_DeviceStatus_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_DeviceStatus_descriptor,
              new java.lang.String[] { "IsUnmetered", "IsCharging", "AutoTimeStatus", "IsGooglerDevice", });
          internal_static_wireless_android_play_playlog_ExternalTimestamp_descriptor =
            getDescriptor().getMessageTypes().get(19);
          internal_static_wireless_android_play_playlog_ExternalTimestamp_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_ExternalTimestamp_descriptor,
              new java.lang.String[] { "TimeMs", "UptimeMs", "Source", });
          internal_static_wireless_android_play_playlog_QosTierConfiguration_descriptor =
            getDescriptor().getMessageTypes().get(20);
          internal_static_wireless_android_play_playlog_QosTierConfiguration_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_QosTierConfiguration_descriptor,
              new java.lang.String[] { "LogSourceName", "QosTier", });
          internal_static_wireless_android_play_playlog_QosTiersOverride_descriptor =
            getDescriptor().getMessageTypes().get(21);
          internal_static_wireless_android_play_playlog_QosTiersOverride_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_QosTiersOverride_descriptor,
              new java.lang.String[] { "QosTierConfiguration", "QosTierFingerprint", });
          internal_static_wireless_android_play_playlog_LogSourceBatchingBlacklist_descriptor =
            getDescriptor().getMessageTypes().get(22);
          internal_static_wireless_android_play_playlog_LogSourceBatchingBlacklist_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_LogSourceBatchingBlacklist_descriptor,
              new java.lang.String[] { "LogSourceName", });
          internal_static_wireless_android_play_playlog_LogResponse_descriptor =
            getDescriptor().getMessageTypes().get(23);
          internal_static_wireless_android_play_playlog_LogResponse_fieldAccessorTable = new
            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
              internal_static_wireless_android_play_playlog_LogResponse_descriptor,
              new java.lang.String[] { "NextRequestWaitMillis", "Experiments", "QosTier", "LogSourceBatchingBlacklist", });
          return null;
        }
      };
    com.google.protobuf.Descriptors.FileDescriptor
      .internalBuildGeneratedFileFrom(descriptorData,
        new com.google.protobuf.Descriptors.FileDescriptor[] {
        }, assigner);
  }

  // @@protoc_insertion_point(outer_class_scope)
}
