content: // Generated by the protocol buffer compiler.  DO NOT EDIT!
  // NO CHECKED-IN PROTOBUF GENCODE
  // source: messages.proto
  // Protobuf Java Version: 4.28.2
  
  package finsky.protos;
  
  /**
   * Protobuf type {@code finsky.protos.AppDetails}
   */
  public  final class AppDetails extends
      com.google.protobuf.GeneratedMessageLite<
          AppDetails, AppDetails.Builder> implements
      // @@protoc_insertion_point(message_implements:finsky.protos.AppDetails)
      AppDetailsOrBuilder {
    private AppDetails() {
      developerName_ = "";
      versionString_ = "";
      title_ = "";
      appCategory_ = com.google.protobuf.GeneratedMessageLite.emptyProtobufList();
      permission_ = com.google.protobuf.GeneratedMessageLite.emptyProtobufList();
      developerEmail_ = "";
      developerWebsite_ = "";
      numDownloads_ = "";
      packageName_ = "";
      recentChangesHtml_ = "";
      uploadDate_ = "";
      file_ = emptyProtobufList();
      appType_ = "";
      containsAds_ = "";
      instantLink_ = "";
      developerAddress_ = "";
      categoryName_ = "";
      downloadLabelDisplay_ = "";
      inAppProduct_ = "";
      downloadLabelAbbreviated_ = "";
      downloadLabel_ = "";
    }
    private int bitField0_;
    public static final int DEVELOPERNAME_FIELD_NUMBER = 1;
    private java.lang.String developerName_;
    /**
     * <code>optional string developerName = 1;</code>
     * @return Whether the developerName field is set.
     */
    @java.lang.Override
    public boolean hasDeveloperName() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <code>optional string developerName = 1;</code>
     * @return The developerName.
     */
    @java.lang.Override
    public java.lang.String getDeveloperName() {
      return developerName_;
    }
    /**
     * <code>optional string developerName = 1;</code>
     * @return The bytes for developerName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDeveloperNameBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(developerName_);
    }
    /**
     * <code>optional string developerName = 1;</code>
     * @param value The developerName to set.
     */
    private void setDeveloperName(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00000001;
      developerName_ = value;
    }
    /**
     * <code>optional string developerName = 1;</code>
     */
    private void clearDeveloperName() {
      bitField0_ = (bitField0_ & ~0x00000001);
      developerName_ = getDefaultInstance().getDeveloperName();
    }
    /**
     * <code>optional string developerName = 1;</code>
     * @param value The bytes for developerName to set.
     */
    private void setDeveloperNameBytes(
        com.google.protobuf.ByteString value) {
      developerName_ = value.toStringUtf8();
      bitField0_ |= 0x00000001;
    }
  
    public static final int MAJORVERSIONNUMBER_FIELD_NUMBER = 2;
    private int majorVersionNumber_;
    /**
     * <code>optional int32 majorVersionNumber = 2;</code>
     * @return Whether the majorVersionNumber field is set.
     */
    @java.lang.Override
    public boolean hasMajorVersionNumber() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <code>optional int32 majorVersionNumber = 2;</code>
     * @return The majorVersionNumber.
     */
    @java.lang.Override
    public int getMajorVersionNumber() {
      return majorVersionNumber_;
    }
    /**
     * <code>optional int32 majorVersionNumber = 2;</code>
     * @param value The majorVersionNumber to set.
     */
    private void setMajorVersionNumber(int value) {
      bitField0_ |= 0x00000002;
      majorVersionNumber_ = value;
    }
    /**
     * <code>optional int32 majorVersionNumber = 2;</code>
     */
    private void clearMajorVersionNumber() {
      bitField0_ = (bitField0_ & ~0x00000002);
      majorVersionNumber_ = 0;
    }
  
    public static final int VERSIONCODE_FIELD_NUMBER = 3;
    private int versionCode_;
    /**
     * <code>optional int32 versionCode = 3;</code>
     * @return Whether the versionCode field is set.
     */
    @java.lang.Override
    public boolean hasVersionCode() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <code>optional int32 versionCode = 3;</code>
     * @return The versionCode.
     */
    @java.lang.Override
    public int getVersionCode() {
      return versionCode_;
    }
    /**
     * <code>optional int32 versionCode = 3;</code>
     * @param value The versionCode to set.
     */
    private void setVersionCode(int value) {
      bitField0_ |= 0x00000004;
      versionCode_ = value;
    }
    /**
     * <code>optional int32 versionCode = 3;</code>
     */
    private void clearVersionCode() {
      bitField0_ = (bitField0_ & ~0x00000004);
      versionCode_ = 0;
    }
  
    public static final int VERSIONSTRING_FIELD_NUMBER = 4;
    private java.lang.String versionString_;
    /**
     * <code>optional string versionString = 4;</code>
     * @return Whether the versionString field is set.
     */
    @java.lang.Override
    public boolean hasVersionString() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <code>optional string versionString = 4;</code>
     * @return The versionString.
     */
    @java.lang.Override
    public java.lang.String getVersionString() {
      return versionString_;
    }
    /**
     * <code>optional string versionString = 4;</code>
     * @return The bytes for versionString.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getVersionStringBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(versionString_);
    }
    /**
     * <code>optional string versionString = 4;</code>
     * @param value The versionString to set.
     */
    private void setVersionString(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00000008;
      versionString_ = value;
    }
    /**
     * <code>optional string versionString = 4;</code>
     */
    private void clearVersionString() {
      bitField0_ = (bitField0_ & ~0x00000008);
      versionString_ = getDefaultInstance().getVersionString();
    }
    /**
     * <code>optional string versionString = 4;</code>
     * @param value The bytes for versionString to set.
     */
    private void setVersionStringBytes(
        com.google.protobuf.ByteString value) {
      versionString_ = value.toStringUtf8();
      bitField0_ |= 0x00000008;
    }
  
    public static final int TITLE_FIELD_NUMBER = 5;
    private java.lang.String title_;
    /**
     * <code>optional string title = 5;</code>
     * @return Whether the title field is set.
     */
    @java.lang.Override
    public boolean hasTitle() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <code>optional string title = 5;</code>
     * @return The title.
     */
    @java.lang.Override
    public java.lang.String getTitle() {
      return title_;
    }
    /**
     * <code>optional string title = 5;</code>
     * @return The bytes for title.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getTitleBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(title_);
    }
    /**
     * <code>optional string title = 5;</code>
     * @param value The title to set.
     */
    private void setTitle(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00000010;
      title_ = value;
    }
    /**
     * <code>optional string title = 5;</code>
     */
    private void clearTitle() {
      bitField0_ = (bitField0_ & ~0x00000010);
      title_ = getDefaultInstance().getTitle();
    }
    /**
     * <code>optional string title = 5;</code>
     * @param value The bytes for title to set.
     */
    private void setTitleBytes(
        com.google.protobuf.ByteString value) {
      title_ = value.toStringUtf8();
      bitField0_ |= 0x00000010;
    }
  
    public static final int APPCATEGORY_FIELD_NUMBER = 7;
    private com.google.protobuf.Internal.ProtobufList<java.lang.String> appCategory_;
    /**
     * <code>repeated string appCategory = 7;</code>
     * @return A list containing the appCategory.
     */
    @java.lang.Override
    public java.util.List<java.lang.String> getAppCategoryList() {
      return appCategory_;
    }
    /**
     * <code>repeated string appCategory = 7;</code>
     * @return The count of appCategory.
     */
    @java.lang.Override
    public int getAppCategoryCount() {
      return appCategory_.size();
    }
    /**
     * <code>repeated string appCategory = 7;</code>
     * @param index The index of the element to return.
     * @return The appCategory at the given index.
     */
    @java.lang.Override
    public java.lang.String getAppCategory(int index) {
      return appCategory_.get(index);
    }
    /**
     * <code>repeated string appCategory = 7;</code>
     * @param index The index of the value to return.
     * @return The bytes of the appCategory at the given index.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getAppCategoryBytes(int index) {
      return com.google.protobuf.ByteString.copyFromUtf8(
          appCategory_.get(index));
    }
    private void ensureAppCategoryIsMutable() {
      com.google.protobuf.Internal.ProtobufList<java.lang.String> tmp =
          appCategory_;  if (!tmp.isModifiable()) {
        appCategory_ =
            com.google.protobuf.GeneratedMessageLite.mutableCopy(tmp);
       }
    }
    /**
     * <code>repeated string appCategory = 7;</code>
     * @param index The index to set the value at.
     * @param value The appCategory to set.
     */
    private void setAppCategory(
        int index, java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    ensureAppCategoryIsMutable();
      appCategory_.set(index, value);
    }
    /**
     * <code>repeated string appCategory = 7;</code>
     * @param value The appCategory to add.
     */
    private void addAppCategory(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    ensureAppCategoryIsMutable();
      appCategory_.add(value);
    }
    /**
     * <code>repeated string appCategory = 7;</code>
     * @param values The appCategory to add.
     */
    private void addAllAppCategory(
        java.lang.Iterable<java.lang.String> values) {
      ensureAppCategoryIsMutable();
      com.google.protobuf.AbstractMessageLite.addAll(
          values, appCategory_);
    }
    /**
     * <code>repeated string appCategory = 7;</code>
     */
    private void clearAppCategory() {
      appCategory_ = com.google.protobuf.GeneratedMessageLite.emptyProtobufList();
    }
    /**
     * <code>repeated string appCategory = 7;</code>
     * @param value The bytes of the appCategory to add.
     */
    private void addAppCategoryBytes(
        com.google.protobuf.ByteString value) {
      ensureAppCategoryIsMutable();
      appCategory_.add(value.toStringUtf8());
    }
  
    public static final int CONTENTRATING_FIELD_NUMBER = 8;
    private int contentRating_;
    /**
     * <code>optional int32 contentRating = 8;</code>
     * @return Whether the contentRating field is set.
     */
    @java.lang.Override
    public boolean hasContentRating() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <code>optional int32 contentRating = 8;</code>
     * @return The contentRating.
     */
    @java.lang.Override
    public int getContentRating() {
      return contentRating_;
    }
    /**
     * <code>optional int32 contentRating = 8;</code>
     * @param value The contentRating to set.
     */
    private void setContentRating(int value) {
      bitField0_ |= 0x00000020;
      contentRating_ = value;
    }
    /**
     * <code>optional int32 contentRating = 8;</code>
     */
    private void clearContentRating() {
      bitField0_ = (bitField0_ & ~0x00000020);
      contentRating_ = 0;
    }
  
    public static final int INSTALLATIONSIZE_FIELD_NUMBER = 9;
    private long installationSize_;
    /**
     * <code>optional int64 installationSize = 9;</code>
     * @return Whether the installationSize field is set.
     */
    @java.lang.Override
    public boolean hasInstallationSize() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <code>optional int64 installationSize = 9;</code>
     * @return The installationSize.
     */
    @java.lang.Override
    public long getInstallationSize() {
      return installationSize_;
    }
    /**
     * <code>optional int64 installationSize = 9;</code>
     * @param value The installationSize to set.
     */
    private void setInstallationSize(long value) {
      bitField0_ |= 0x00000040;
      installationSize_ = value;
    }
    /**
     * <code>optional int64 installationSize = 9;</code>
     */
    private void clearInstallationSize() {
      bitField0_ = (bitField0_ & ~0x00000040);
      installationSize_ = 0L;
    }
  
    public static final int PERMISSION_FIELD_NUMBER = 10;
    private com.google.protobuf.Internal.ProtobufList<java.lang.String> permission_;
    /**
     * <code>repeated string permission = 10;</code>
     * @return A list containing the permission.
     */
    @java.lang.Override
    public java.util.List<java.lang.String> getPermissionList() {
      return permission_;
    }
    /**
     * <code>repeated string permission = 10;</code>
     * @return The count of permission.
     */
    @java.lang.Override
    public int getPermissionCount() {
      return permission_.size();
    }
    /**
     * <code>repeated string permission = 10;</code>
     * @param index The index of the element to return.
     * @return The permission at the given index.
     */
    @java.lang.Override
    public java.lang.String getPermission(int index) {
      return permission_.get(index);
    }
    /**
     * <code>repeated string permission = 10;</code>
     * @param index The index of the value to return.
     * @return The bytes of the permission at the given index.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getPermissionBytes(int index) {
      return com.google.protobuf.ByteString.copyFromUtf8(
          permission_.get(index));
    }
    private void ensurePermissionIsMutable() {
      com.google.protobuf.Internal.ProtobufList<java.lang.String> tmp =
          permission_;  if (!tmp.isModifiable()) {
        permission_ =
            com.google.protobuf.GeneratedMessageLite.mutableCopy(tmp);
       }
    }
    /**
     * <code>repeated string permission = 10;</code>
     * @param index The index to set the value at.
     * @param value The permission to set.
     */
    private void setPermission(
        int index, java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    ensurePermissionIsMutable();
      permission_.set(index, value);
    }
    /**
     * <code>repeated string permission = 10;</code>
     * @param value The permission to add.
     */
    private void addPermission(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    ensurePermissionIsMutable();
      permission_.add(value);
    }
    /**
     * <code>repeated string permission = 10;</code>
     * @param values The permission to add.
     */
    private void addAllPermission(
        java.lang.Iterable<java.lang.String> values) {
      ensurePermissionIsMutable();
      com.google.protobuf.AbstractMessageLite.addAll(
          values, permission_);
    }
    /**
     * <code>repeated string permission = 10;</code>
     */
    private void clearPermission() {
      permission_ = com.google.protobuf.GeneratedMessageLite.emptyProtobufList();
    }
    /**
     * <code>repeated string permission = 10;</code>
     * @param value The bytes of the permission to add.
     */
    private void addPermissionBytes(
        com.google.protobuf.ByteString value) {
      ensurePermissionIsMutable();
      permission_.add(value.toStringUtf8());
    }
  
    public static final int DEVELOPEREMAIL_FIELD_NUMBER = 11;
    private java.lang.String developerEmail_;
    /**
     * <code>optional string developerEmail = 11;</code>
     * @return Whether the developerEmail field is set.
     */
    @java.lang.Override
    public boolean hasDeveloperEmail() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <code>optional string developerEmail = 11;</code>
     * @return The developerEmail.
     */
    @java.lang.Override
    public java.lang.String getDeveloperEmail() {
      return developerEmail_;
    }
    /**
     * <code>optional string developerEmail = 11;</code>
     * @return The bytes for developerEmail.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDeveloperEmailBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(developerEmail_);
    }
    /**
     * <code>optional string developerEmail = 11;</code>
     * @param value The developerEmail to set.
     */
    private void setDeveloperEmail(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00000080;
      developerEmail_ = value;
    }
    /**
     * <code>optional string developerEmail = 11;</code>
     */
    private void clearDeveloperEmail() {
      bitField0_ = (bitField0_ & ~0x00000080);
      developerEmail_ = getDefaultInstance().getDeveloperEmail();
    }
    /**
     * <code>optional string developerEmail = 11;</code>
     * @param value The bytes for developerEmail to set.
     */
    private void setDeveloperEmailBytes(
        com.google.protobuf.ByteString value) {
      developerEmail_ = value.toStringUtf8();
      bitField0_ |= 0x00000080;
    }
  
    public static final int DEVELOPERWEBSITE_FIELD_NUMBER = 12;
    private java.lang.String developerWebsite_;
    /**
     * <code>optional string developerWebsite = 12;</code>
     * @return Whether the developerWebsite field is set.
     */
    @java.lang.Override
    public boolean hasDeveloperWebsite() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <code>optional string developerWebsite = 12;</code>
     * @return The developerWebsite.
     */
    @java.lang.Override
    public java.lang.String getDeveloperWebsite() {
      return developerWebsite_;
    }
    /**
     * <code>optional string developerWebsite = 12;</code>
     * @return The bytes for developerWebsite.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDeveloperWebsiteBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(developerWebsite_);
    }
    /**
     * <code>optional string developerWebsite = 12;</code>
     * @param value The developerWebsite to set.
     */
    private void setDeveloperWebsite(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00000100;
      developerWebsite_ = value;
    }
    /**
     * <code>optional string developerWebsite = 12;</code>
     */
    private void clearDeveloperWebsite() {
      bitField0_ = (bitField0_ & ~0x00000100);
      developerWebsite_ = getDefaultInstance().getDeveloperWebsite();
    }
    /**
     * <code>optional string developerWebsite = 12;</code>
     * @param value The bytes for developerWebsite to set.
     */
    private void setDeveloperWebsiteBytes(
        com.google.protobuf.ByteString value) {
      developerWebsite_ = value.toStringUtf8();
      bitField0_ |= 0x00000100;
    }
  
    public static final int NUMDOWNLOADS_FIELD_NUMBER = 13;
    private java.lang.String numDownloads_;
    /**
     * <code>optional string numDownloads = 13;</code>
     * @return Whether the numDownloads field is set.
     */
    @java.lang.Override
    public boolean hasNumDownloads() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <code>optional string numDownloads = 13;</code>
     * @return The numDownloads.
     */
    @java.lang.Override
    public java.lang.String getNumDownloads() {
      return numDownloads_;
    }
    /**
     * <code>optional string numDownloads = 13;</code>
     * @return The bytes for numDownloads.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getNumDownloadsBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(numDownloads_);
    }
    /**
     * <code>optional string numDownloads = 13;</code>
     * @param value The numDownloads to set.
     */
    private void setNumDownloads(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00000200;
      numDownloads_ = value;
    }
    /**
     * <code>optional string numDownloads = 13;</code>
     */
    private void clearNumDownloads() {
      bitField0_ = (bitField0_ & ~0x00000200);
      numDownloads_ = getDefaultInstance().getNumDownloads();
    }
    /**
     * <code>optional string numDownloads = 13;</code>
     * @param value The bytes for numDownloads to set.
     */
    private void setNumDownloadsBytes(
        com.google.protobuf.ByteString value) {
      numDownloads_ = value.toStringUtf8();
      bitField0_ |= 0x00000200;
    }
  
    public static final int PACKAGENAME_FIELD_NUMBER = 14;
    private java.lang.String packageName_;
    /**
     * <code>optional string packageName = 14;</code>
     * @return Whether the packageName field is set.
     */
    @java.lang.Override
    public boolean hasPackageName() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <code>optional string packageName = 14;</code>
     * @return The packageName.
     */
    @java.lang.Override
    public java.lang.String getPackageName() {
      return packageName_;
    }
    /**
     * <code>optional string packageName = 14;</code>
     * @return The bytes for packageName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getPackageNameBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(packageName_);
    }
    /**
     * <code>optional string packageName = 14;</code>
     * @param value The packageName to set.
     */
    private void setPackageName(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00000400;
      packageName_ = value;
    }
    /**
     * <code>optional string packageName = 14;</code>
     */
    private void clearPackageName() {
      bitField0_ = (bitField0_ & ~0x00000400);
      packageName_ = getDefaultInstance().getPackageName();
    }
    /**
     * <code>optional string packageName = 14;</code>
     * @param value The bytes for packageName to set.
     */
    private void setPackageNameBytes(
        com.google.protobuf.ByteString value) {
      packageName_ = value.toStringUtf8();
      bitField0_ |= 0x00000400;
    }
  
    public static final int RECENTCHANGESHTML_FIELD_NUMBER = 15;
    private java.lang.String recentChangesHtml_;
    /**
     * <code>optional string recentChangesHtml = 15;</code>
     * @return Whether the recentChangesHtml field is set.
     */
    @java.lang.Override
    public boolean hasRecentChangesHtml() {
      return ((bitField0_ & 0x00000800) != 0);
    }
    /**
     * <code>optional string recentChangesHtml = 15;</code>
     * @return The recentChangesHtml.
     */
    @java.lang.Override
    public java.lang.String getRecentChangesHtml() {
      return recentChangesHtml_;
    }
    /**
     * <code>optional string recentChangesHtml = 15;</code>
     * @return The bytes for recentChangesHtml.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getRecentChangesHtmlBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(recentChangesHtml_);
    }
    /**
     * <code>optional string recentChangesHtml = 15;</code>
     * @param value The recentChangesHtml to set.
     */
    private void setRecentChangesHtml(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00000800;
      recentChangesHtml_ = value;
    }
    /**
     * <code>optional string recentChangesHtml = 15;</code>
     */
    private void clearRecentChangesHtml() {
      bitField0_ = (bitField0_ & ~0x00000800);
      recentChangesHtml_ = getDefaultInstance().getRecentChangesHtml();
    }
    /**
     * <code>optional string recentChangesHtml = 15;</code>
     * @param value The bytes for recentChangesHtml to set.
     */
    private void setRecentChangesHtmlBytes(
        com.google.protobuf.ByteString value) {
      recentChangesHtml_ = value.toStringUtf8();
      bitField0_ |= 0x00000800;
    }
  
    public static final int UPLOADDATE_FIELD_NUMBER = 16;
    private java.lang.String uploadDate_;
    /**
     * <code>optional string uploadDate = 16;</code>
     * @return Whether the uploadDate field is set.
     */
    @java.lang.Override
    public boolean hasUploadDate() {
      return ((bitField0_ & 0x00001000) != 0);
    }
    /**
     * <code>optional string uploadDate = 16;</code>
     * @return The uploadDate.
     */
    @java.lang.Override
    public java.lang.String getUploadDate() {
      return uploadDate_;
    }
    /**
     * <code>optional string uploadDate = 16;</code>
     * @return The bytes for uploadDate.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getUploadDateBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(uploadDate_);
    }
    /**
     * <code>optional string uploadDate = 16;</code>
     * @param value The uploadDate to set.
     */
    private void setUploadDate(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00001000;
      uploadDate_ = value;
    }
    /**
     * <code>optional string uploadDate = 16;</code>
     */
    private void clearUploadDate() {
      bitField0_ = (bitField0_ & ~0x00001000);
      uploadDate_ = getDefaultInstance().getUploadDate();
    }
    /**
     * <code>optional string uploadDate = 16;</code>
     * @param value The bytes for uploadDate to set.
     */
    private void setUploadDateBytes(
        com.google.protobuf.ByteString value) {
      uploadDate_ = value.toStringUtf8();
      bitField0_ |= 0x00001000;
    }
  
    public static final int FILE_FIELD_NUMBER = 17;
    private com.google.protobuf.Internal.ProtobufList<finsky.protos.Common.FileMetadata> file_;
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    @java.lang.Override
    public java.util.List<finsky.protos.Common.FileMetadata> getFileList() {
      return file_;
    }
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    public java.util.List<? extends finsky.protos.Common.FileMetadataOrBuilder> 
        getFileOrBuilderList() {
      return file_;
    }
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    @java.lang.Override
    public int getFileCount() {
      return file_.size();
    }
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    @java.lang.Override
    public finsky.protos.Common.FileMetadata getFile(int index) {
      return file_.get(index);
    }
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    public finsky.protos.Common.FileMetadataOrBuilder getFileOrBuilder(
        int index) {
      return file_.get(index);
    }
    private void ensureFileIsMutable() {
      com.google.protobuf.Internal.ProtobufList<finsky.protos.Common.FileMetadata> tmp = file_;
      if (!tmp.isModifiable()) {
        file_ =
            com.google.protobuf.GeneratedMessageLite.mutableCopy(tmp);
       }
    }
  
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    private void setFile(
        int index, finsky.protos.Common.FileMetadata value) {
      value.getClass();
    ensureFileIsMutable();
      file_.set(index, value);
    }
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    private void addFile(finsky.protos.Common.FileMetadata value) {
      value.getClass();
    ensureFileIsMutable();
      file_.add(value);
    }
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    private void addFile(
        int index, finsky.protos.Common.FileMetadata value) {
      value.getClass();
    ensureFileIsMutable();
      file_.add(index, value);
    }
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    private void addAllFile(
        java.lang.Iterable<? extends finsky.protos.Common.FileMetadata> values) {
      ensureFileIsMutable();
      com.google.protobuf.AbstractMessageLite.addAll(
          values, file_);
    }
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    private void clearFile() {
      file_ = emptyProtobufList();
    }
    /**
     * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
     */
    private void removeFile(int index) {
      ensureFileIsMutable();
      file_.remove(index);
    }
  
    public static final int APPTYPE_FIELD_NUMBER = 18;
    private java.lang.String appType_;
    /**
     * <code>optional string appType = 18;</code>
     * @return Whether the appType field is set.
     */
    @java.lang.Override
    public boolean hasAppType() {
      return ((bitField0_ & 0x00002000) != 0);
    }
    /**
     * <code>optional string appType = 18;</code>
     * @return The appType.
     */
    @java.lang.Override
    public java.lang.String getAppType() {
      return appType_;
    }
    /**
     * <code>optional string appType = 18;</code>
     * @return The bytes for appType.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getAppTypeBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(appType_);
    }
    /**
     * <code>optional string appType = 18;</code>
     * @param value The appType to set.
     */
    private void setAppType(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00002000;
      appType_ = value;
    }
    /**
     * <code>optional string appType = 18;</code>
     */
    private void clearAppType() {
      bitField0_ = (bitField0_ & ~0x00002000);
      appType_ = getDefaultInstance().getAppType();
    }
    /**
     * <code>optional string appType = 18;</code>
     * @param value The bytes for appType to set.
     */
    private void setAppTypeBytes(
        com.google.protobuf.ByteString value) {
      appType_ = value.toStringUtf8();
      bitField0_ |= 0x00002000;
    }
  
    public static final int UNSTABLE_FIELD_NUMBER = 21;
    private boolean unstable_;
    /**
     * <code>optional bool unstable = 21;</code>
     * @return Whether the unstable field is set.
     */
    @java.lang.Override
    public boolean hasUnstable() {
      return ((bitField0_ & 0x00004000) != 0);
    }
    /**
     * <code>optional bool unstable = 21;</code>
     * @return The unstable.
     */
    @java.lang.Override
    public boolean getUnstable() {
      return unstable_;
    }
    /**
     * <code>optional bool unstable = 21;</code>
     * @param value The unstable to set.
     */
    private void setUnstable(boolean value) {
      bitField0_ |= 0x00004000;
      unstable_ = value;
    }
    /**
     * <code>optional bool unstable = 21;</code>
     */
    private void clearUnstable() {
      bitField0_ = (bitField0_ & ~0x00004000);
      unstable_ = false;
    }
  
    public static final int HASINSTANTLINK_FIELD_NUMBER = 24;
    private boolean hasInstantLink_;
    /**
     * <code>optional bool hasInstantLink = 24;</code>
     * @return Whether the hasInstantLink field is set.
     */
    @java.lang.Override
    public boolean hasHasInstantLink() {
      return ((bitField0_ & 0x00008000) != 0);
    }
    /**
     * <code>optional bool hasInstantLink = 24;</code>
     * @return The hasInstantLink.
     */
    @java.lang.Override
    public boolean getHasInstantLink() {
      return hasInstantLink_;
    }
    /**
     * <code>optional bool hasInstantLink = 24;</code>
     * @param value The hasInstantLink to set.
     */
    private void setHasInstantLink(boolean value) {
      bitField0_ |= 0x00008000;
      hasInstantLink_ = value;
    }
    /**
     * <code>optional bool hasInstantLink = 24;</code>
     */
    private void clearHasInstantLink() {
      bitField0_ = (bitField0_ & ~0x00008000);
      hasInstantLink_ = false;
    }
  
    public static final int CONTAINSADS_FIELD_NUMBER = 30;
    private java.lang.String containsAds_;
    /**
     * <code>optional string containsAds = 30;</code>
     * @return Whether the containsAds field is set.
     */
    @java.lang.Override
    public boolean hasContainsAds() {
      return ((bitField0_ & 0x00010000) != 0);
    }
    /**
     * <code>optional string containsAds = 30;</code>
     * @return The containsAds.
     */
    @java.lang.Override
    public java.lang.String getContainsAds() {
      return containsAds_;
    }
    /**
     * <code>optional string containsAds = 30;</code>
     * @return The bytes for containsAds.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getContainsAdsBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(containsAds_);
    }
    /**
     * <code>optional string containsAds = 30;</code>
     * @param value The containsAds to set.
     */
    private void setContainsAds(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00010000;
      containsAds_ = value;
    }
    /**
     * <code>optional string containsAds = 30;</code>
     */
    private void clearContainsAds() {
      bitField0_ = (bitField0_ & ~0x00010000);
      containsAds_ = getDefaultInstance().getContainsAds();
    }
    /**
     * <code>optional string containsAds = 30;</code>
     * @param value The bytes for containsAds to set.
     */
    private void setContainsAdsBytes(
        com.google.protobuf.ByteString value) {
      containsAds_ = value.toStringUtf8();
      bitField0_ |= 0x00010000;
    }
  
    public static final int TARGETSDKVERSION_FIELD_NUMBER = 32;
    private int targetSdkVersion_;
    /**
     * <code>optional int32 targetSdkVersion = 32;</code>
     * @return Whether the targetSdkVersion field is set.
     */
    @java.lang.Override
    public boolean hasTargetSdkVersion() {
      return ((bitField0_ & 0x00020000) != 0);
    }
    /**
     * <code>optional int32 targetSdkVersion = 32;</code>
     * @return The targetSdkVersion.
     */
    @java.lang.Override
    public int getTargetSdkVersion() {
      return targetSdkVersion_;
    }
    /**
     * <code>optional int32 targetSdkVersion = 32;</code>
     * @param value The targetSdkVersion to set.
     */
    private void setTargetSdkVersion(int value) {
      bitField0_ |= 0x00020000;
      targetSdkVersion_ = value;
    }
    /**
     * <code>optional int32 targetSdkVersion = 32;</code>
     */
    private void clearTargetSdkVersion() {
      bitField0_ = (bitField0_ & ~0x00020000);
      targetSdkVersion_ = 0;
    }
  
    public static final int DEPENDENCIES_FIELD_NUMBER = 34;
    private finsky.protos.Dependencies dependencies_;
    /**
     * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
     */
    @java.lang.Override
    public boolean hasDependencies() {
      return ((bitField0_ & 0x00040000) != 0);
    }
    /**
     * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
     */
    @java.lang.Override
    public finsky.protos.Dependencies getDependencies() {
      return dependencies_ == null ? finsky.protos.Dependencies.getDefaultInstance() : dependencies_;
    }
    /**
     * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
     */
    private void setDependencies(finsky.protos.Dependencies value) {
      value.getClass();
    dependencies_ = value;
      bitField0_ |= 0x00040000;
      }
    /**
     * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
     */
    @java.lang.SuppressWarnings({"ReferenceEquality"})
    private void mergeDependencies(finsky.protos.Dependencies value) {
      value.getClass();
    if (dependencies_ != null &&
          dependencies_ != finsky.protos.Dependencies.getDefaultInstance()) {
        dependencies_ =
          finsky.protos.Dependencies.newBuilder(dependencies_).mergeFrom(value).buildPartial();
      } else {
        dependencies_ = value;
      }
      bitField0_ |= 0x00040000;
    }
    /**
     * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
     */
    private void clearDependencies() {  dependencies_ = null;
      bitField0_ = (bitField0_ & ~0x00040000);
    }
  
    public static final int TESTINGPROGRAMINFO_FIELD_NUMBER = 35;
    private finsky.protos.TestingProgramInfo testingProgramInfo_;
    /**
     * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
     */
    @java.lang.Override
    public boolean hasTestingProgramInfo() {
      return ((bitField0_ & 0x00080000) != 0);
    }
    /**
     * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
     */
    @java.lang.Override
    public finsky.protos.TestingProgramInfo getTestingProgramInfo() {
      return testingProgramInfo_ == null ? finsky.protos.TestingProgramInfo.getDefaultInstance() : testingProgramInfo_;
    }
    /**
     * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
     */
    private void setTestingProgramInfo(finsky.protos.TestingProgramInfo value) {
      value.getClass();
    testingProgramInfo_ = value;
      bitField0_ |= 0x00080000;
      }
    /**
     * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
     */
    @java.lang.SuppressWarnings({"ReferenceEquality"})
    private void mergeTestingProgramInfo(finsky.protos.TestingProgramInfo value) {
      value.getClass();
    if (testingProgramInfo_ != null &&
          testingProgramInfo_ != finsky.protos.TestingProgramInfo.getDefaultInstance()) {
        testingProgramInfo_ =
          finsky.protos.TestingProgramInfo.newBuilder(testingProgramInfo_).mergeFrom(value).buildPartial();
      } else {
        testingProgramInfo_ = value;
      }
      bitField0_ |= 0x00080000;
    }
    /**
     * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
     */
    private void clearTestingProgramInfo() {  testingProgramInfo_ = null;
      bitField0_ = (bitField0_ & ~0x00080000);
    }
  
    public static final int EARLYACCESSINFO_FIELD_NUMBER = 36;
    private finsky.protos.EarlyAccessInfo earlyAccessInfo_;
    /**
     * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
     */
    @java.lang.Override
    public boolean hasEarlyAccessInfo() {
      return ((bitField0_ & 0x00100000) != 0);
    }
    /**
     * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
     */
    @java.lang.Override
    public finsky.protos.EarlyAccessInfo getEarlyAccessInfo() {
      return earlyAccessInfo_ == null ? finsky.protos.EarlyAccessInfo.getDefaultInstance() : earlyAccessInfo_;
    }
    /**
     * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
     */
    private void setEarlyAccessInfo(finsky.protos.EarlyAccessInfo value) {
      value.getClass();
    earlyAccessInfo_ = value;
      bitField0_ |= 0x00100000;
      }
    /**
     * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
     */
    @java.lang.SuppressWarnings({"ReferenceEquality"})
    private void mergeEarlyAccessInfo(finsky.protos.EarlyAccessInfo value) {
      value.getClass();
    if (earlyAccessInfo_ != null &&
          earlyAccessInfo_ != finsky.protos.EarlyAccessInfo.getDefaultInstance()) {
        earlyAccessInfo_ =
          finsky.protos.EarlyAccessInfo.newBuilder(earlyAccessInfo_).mergeFrom(value).buildPartial();
      } else {
        earlyAccessInfo_ = value;
      }
      bitField0_ |= 0x00100000;
    }
    /**
     * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
     */
    private void clearEarlyAccessInfo() {  earlyAccessInfo_ = null;
      bitField0_ = (bitField0_ & ~0x00100000);
    }
  
    public static final int EDITORCHOICE_FIELD_NUMBER = 41;
    private finsky.protos.EditorChoice editorChoice_;
    /**
     * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
     */
    @java.lang.Override
    public boolean hasEditorChoice() {
      return ((bitField0_ & 0x00200000) != 0);
    }
    /**
     * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
     */
    @java.lang.Override
    public finsky.protos.EditorChoice getEditorChoice() {
      return editorChoice_ == null ? finsky.protos.EditorChoice.getDefaultInstance() : editorChoice_;
    }
    /**
     * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
     */
    private void setEditorChoice(finsky.protos.EditorChoice value) {
      value.getClass();
    editorChoice_ = value;
      bitField0_ |= 0x00200000;
      }
    /**
     * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
     */
    @java.lang.SuppressWarnings({"ReferenceEquality"})
    private void mergeEditorChoice(finsky.protos.EditorChoice value) {
      value.getClass();
    if (editorChoice_ != null &&
          editorChoice_ != finsky.protos.EditorChoice.getDefaultInstance()) {
        editorChoice_ =
          finsky.protos.EditorChoice.newBuilder(editorChoice_).mergeFrom(value).buildPartial();
      } else {
        editorChoice_ = value;
      }
      bitField0_ |= 0x00200000;
    }
    /**
     * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
     */
    private void clearEditorChoice() {  editorChoice_ = null;
      bitField0_ = (bitField0_ & ~0x00200000);
    }
  
    public static final int INSTANTLINK_FIELD_NUMBER = 43;
    private java.lang.String instantLink_;
    /**
     * <code>optional string instantLink = 43;</code>
     * @return Whether the instantLink field is set.
     */
    @java.lang.Override
    public boolean hasInstantLink() {
      return ((bitField0_ & 0x00400000) != 0);
    }
    /**
     * <code>optional string instantLink = 43;</code>
     * @return The instantLink.
     */
    @java.lang.Override
    public java.lang.String getInstantLink() {
      return instantLink_;
    }
    /**
     * <code>optional string instantLink = 43;</code>
     * @return The bytes for instantLink.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getInstantLinkBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(instantLink_);
    }
    /**
     * <code>optional string instantLink = 43;</code>
     * @param value The instantLink to set.
     */
    private void setInstantLink(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00400000;
      instantLink_ = value;
    }
    /**
     * <code>optional string instantLink = 43;</code>
     */
    private void clearInstantLink() {
      bitField0_ = (bitField0_ & ~0x00400000);
      instantLink_ = getDefaultInstance().getInstantLink();
    }
    /**
     * <code>optional string instantLink = 43;</code>
     * @param value The bytes for instantLink to set.
     */
    private void setInstantLinkBytes(
        com.google.protobuf.ByteString value) {
      instantLink_ = value.toStringUtf8();
      bitField0_ |= 0x00400000;
    }
  
    public static final int DEVELOPERADDRESS_FIELD_NUMBER = 45;
    private java.lang.String developerAddress_;
    /**
     * <code>optional string developerAddress = 45;</code>
     * @return Whether the developerAddress field is set.
     */
    @java.lang.Override
    public boolean hasDeveloperAddress() {
      return ((bitField0_ & 0x00800000) != 0);
    }
    /**
     * <code>optional string developerAddress = 45;</code>
     * @return The developerAddress.
     */
    @java.lang.Override
    public java.lang.String getDeveloperAddress() {
      return developerAddress_;
    }
    /**
     * <code>optional string developerAddress = 45;</code>
     * @return The bytes for developerAddress.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDeveloperAddressBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(developerAddress_);
    }
    /**
     * <code>optional string developerAddress = 45;</code>
     * @param value The developerAddress to set.
     */
    private void setDeveloperAddress(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x00800000;
      developerAddress_ = value;
    }
    /**
     * <code>optional string developerAddress = 45;</code>
     */
    private void clearDeveloperAddress() {
      bitField0_ = (bitField0_ & ~0x00800000);
      developerAddress_ = getDefaultInstance().getDeveloperAddress();
    }
    /**
     * <code>optional string developerAddress = 45;</code>
     * @param value The bytes for developerAddress to set.
     */
    private void setDeveloperAddressBytes(
        com.google.protobuf.ByteString value) {
      developerAddress_ = value.toStringUtf8();
      bitField0_ |= 0x00800000;
    }
  
    public static final int PUBLISHER_FIELD_NUMBER = 46;
    private finsky.protos.Publisher publisher_;
    /**
     * <code>optional .finsky.protos.Publisher publisher = 46;</code>
     */
    @java.lang.Override
    public boolean hasPublisher() {
      return ((bitField0_ & 0x01000000) != 0);
    }
    /**
     * <code>optional .finsky.protos.Publisher publisher = 46;</code>
     */
    @java.lang.Override
    public finsky.protos.Publisher getPublisher() {
      return publisher_ == null ? finsky.protos.Publisher.getDefaultInstance() : publisher_;
    }
    /**
     * <code>optional .finsky.protos.Publisher publisher = 46;</code>
     */
    private void setPublisher(finsky.protos.Publisher value) {
      value.getClass();
    publisher_ = value;
      bitField0_ |= 0x01000000;
      }
    /**
     * <code>optional .finsky.protos.Publisher publisher = 46;</code>
     */
    @java.lang.SuppressWarnings({"ReferenceEquality"})
    private void mergePublisher(finsky.protos.Publisher value) {
      value.getClass();
    if (publisher_ != null &&
          publisher_ != finsky.protos.Publisher.getDefaultInstance()) {
        publisher_ =
          finsky.protos.Publisher.newBuilder(publisher_).mergeFrom(value).buildPartial();
      } else {
        publisher_ = value;
      }
      bitField0_ |= 0x01000000;
    }
    /**
     * <code>optional .finsky.protos.Publisher publisher = 46;</code>
     */
    private void clearPublisher() {  publisher_ = null;
      bitField0_ = (bitField0_ & ~0x01000000);
    }
  
    public static final int CATEGORYNAME_FIELD_NUMBER = 48;
    private java.lang.String categoryName_;
    /**
     * <code>optional string categoryName = 48;</code>
     * @return Whether the categoryName field is set.
     */
    @java.lang.Override
    public boolean hasCategoryName() {
      return ((bitField0_ & 0x02000000) != 0);
    }
    /**
     * <code>optional string categoryName = 48;</code>
     * @return The categoryName.
     */
    @java.lang.Override
    public java.lang.String getCategoryName() {
      return categoryName_;
    }
    /**
     * <code>optional string categoryName = 48;</code>
     * @return The bytes for categoryName.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getCategoryNameBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(categoryName_);
    }
    /**
     * <code>optional string categoryName = 48;</code>
     * @param value The categoryName to set.
     */
    private void setCategoryName(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x02000000;
      categoryName_ = value;
    }
    /**
     * <code>optional string categoryName = 48;</code>
     */
    private void clearCategoryName() {
      bitField0_ = (bitField0_ & ~0x02000000);
      categoryName_ = getDefaultInstance().getCategoryName();
    }
    /**
     * <code>optional string categoryName = 48;</code>
     * @param value The bytes for categoryName to set.
     */
    private void setCategoryNameBytes(
        com.google.protobuf.ByteString value) {
      categoryName_ = value.toStringUtf8();
      bitField0_ |= 0x02000000;
    }
  
    public static final int DOWNLOADCOUNT_FIELD_NUMBER = 53;
    private long downloadCount_;
    /**
     * <code>optional int64 downloadCount = 53;</code>
     * @return Whether the downloadCount field is set.
     */
    @java.lang.Override
    public boolean hasDownloadCount() {
      return ((bitField0_ & 0x04000000) != 0);
    }
    /**
     * <code>optional int64 downloadCount = 53;</code>
     * @return The downloadCount.
     */
    @java.lang.Override
    public long getDownloadCount() {
      return downloadCount_;
    }
    /**
     * <code>optional int64 downloadCount = 53;</code>
     * @param value The downloadCount to set.
     */
    private void setDownloadCount(long value) {
      bitField0_ |= 0x04000000;
      downloadCount_ = value;
    }
    /**
     * <code>optional int64 downloadCount = 53;</code>
     */
    private void clearDownloadCount() {
      bitField0_ = (bitField0_ & ~0x04000000);
      downloadCount_ = 0L;
    }
  
    public static final int DOWNLOADLABELDISPLAY_FIELD_NUMBER = 61;
    private java.lang.String downloadLabelDisplay_;
    /**
     * <code>optional string downloadLabelDisplay = 61;</code>
     * @return Whether the downloadLabelDisplay field is set.
     */
    @java.lang.Override
    public boolean hasDownloadLabelDisplay() {
      return ((bitField0_ & 0x08000000) != 0);
    }
    /**
     * <code>optional string downloadLabelDisplay = 61;</code>
     * @return The downloadLabelDisplay.
     */
    @java.lang.Override
    public java.lang.String getDownloadLabelDisplay() {
      return downloadLabelDisplay_;
    }
    /**
     * <code>optional string downloadLabelDisplay = 61;</code>
     * @return The bytes for downloadLabelDisplay.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDownloadLabelDisplayBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(downloadLabelDisplay_);
    }
    /**
     * <code>optional string downloadLabelDisplay = 61;</code>
     * @param value The downloadLabelDisplay to set.
     */
    private void setDownloadLabelDisplay(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x08000000;
      downloadLabelDisplay_ = value;
    }
    /**
     * <code>optional string downloadLabelDisplay = 61;</code>
     */
    private void clearDownloadLabelDisplay() {
      bitField0_ = (bitField0_ & ~0x08000000);
      downloadLabelDisplay_ = getDefaultInstance().getDownloadLabelDisplay();
    }
    /**
     * <code>optional string downloadLabelDisplay = 61;</code>
     * @param value The bytes for downloadLabelDisplay to set.
     */
    private void setDownloadLabelDisplayBytes(
        com.google.protobuf.ByteString value) {
      downloadLabelDisplay_ = value.toStringUtf8();
      bitField0_ |= 0x08000000;
    }
  
    public static final int INAPPPRODUCT_FIELD_NUMBER = 67;
    private java.lang.String inAppProduct_;
    /**
     * <code>optional string inAppProduct = 67;</code>
     * @return Whether the inAppProduct field is set.
     */
    @java.lang.Override
    public boolean hasInAppProduct() {
      return ((bitField0_ & 0x10000000) != 0);
    }
    /**
     * <code>optional string inAppProduct = 67;</code>
     * @return The inAppProduct.
     */
    @java.lang.Override
    public java.lang.String getInAppProduct() {
      return inAppProduct_;
    }
    /**
     * <code>optional string inAppProduct = 67;</code>
     * @return The bytes for inAppProduct.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getInAppProductBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(inAppProduct_);
    }
    /**
     * <code>optional string inAppProduct = 67;</code>
     * @param value The inAppProduct to set.
     */
    private void setInAppProduct(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x10000000;
      inAppProduct_ = value;
    }
    /**
     * <code>optional string inAppProduct = 67;</code>
     */
    private void clearInAppProduct() {
      bitField0_ = (bitField0_ & ~0x10000000);
      inAppProduct_ = getDefaultInstance().getInAppProduct();
    }
    /**
     * <code>optional string inAppProduct = 67;</code>
     * @param value The bytes for inAppProduct to set.
     */
    private void setInAppProductBytes(
        com.google.protobuf.ByteString value) {
      inAppProduct_ = value.toStringUtf8();
      bitField0_ |= 0x10000000;
    }
  
    public static final int DOWNLOADLABELABBREVIATED_FIELD_NUMBER = 77;
    private java.lang.String downloadLabelAbbreviated_;
    /**
     * <code>optional string downloadLabelAbbreviated = 77;</code>
     * @return Whether the downloadLabelAbbreviated field is set.
     */
    @java.lang.Override
    public boolean hasDownloadLabelAbbreviated() {
      return ((bitField0_ & 0x20000000) != 0);
    }
    /**
     * <code>optional string downloadLabelAbbreviated = 77;</code>
     * @return The downloadLabelAbbreviated.
     */
    @java.lang.Override
    public java.lang.String getDownloadLabelAbbreviated() {
      return downloadLabelAbbreviated_;
    }
    /**
     * <code>optional string downloadLabelAbbreviated = 77;</code>
     * @return The bytes for downloadLabelAbbreviated.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDownloadLabelAbbreviatedBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(downloadLabelAbbreviated_);
    }
    /**
     * <code>optional string downloadLabelAbbreviated = 77;</code>
     * @param value The downloadLabelAbbreviated to set.
     */
    private void setDownloadLabelAbbreviated(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x20000000;
      downloadLabelAbbreviated_ = value;
    }
    /**
     * <code>optional string downloadLabelAbbreviated = 77;</code>
     */
    private void clearDownloadLabelAbbreviated() {
      bitField0_ = (bitField0_ & ~0x20000000);
      downloadLabelAbbreviated_ = getDefaultInstance().getDownloadLabelAbbreviated();
    }
    /**
     * <code>optional string downloadLabelAbbreviated = 77;</code>
     * @param value The bytes for downloadLabelAbbreviated to set.
     */
    private void setDownloadLabelAbbreviatedBytes(
        com.google.protobuf.ByteString value) {
      downloadLabelAbbreviated_ = value.toStringUtf8();
      bitField0_ |= 0x20000000;
    }
  
    public static final int DOWNLOADLABEL_FIELD_NUMBER = 78;
    private java.lang.String downloadLabel_;
    /**
     * <code>optional string downloadLabel = 78;</code>
     * @return Whether the downloadLabel field is set.
     */
    @java.lang.Override
    public boolean hasDownloadLabel() {
      return ((bitField0_ & 0x40000000) != 0);
    }
    /**
     * <code>optional string downloadLabel = 78;</code>
     * @return The downloadLabel.
     */
    @java.lang.Override
    public java.lang.String getDownloadLabel() {
      return downloadLabel_;
    }
    /**
     * <code>optional string downloadLabel = 78;</code>
     * @return The bytes for downloadLabel.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDownloadLabelBytes() {
      return com.google.protobuf.ByteString.copyFromUtf8(downloadLabel_);
    }
    /**
     * <code>optional string downloadLabel = 78;</code>
     * @param value The downloadLabel to set.
     */
    private void setDownloadLabel(
        java.lang.String value) {
      java.lang.Class<?> valueClass = value.getClass();
    bitField0_ |= 0x40000000;
      downloadLabel_ = value;
    }
    /**
     * <code>optional string downloadLabel = 78;</code>
     */
    private void clearDownloadLabel() {
      bitField0_ = (bitField0_ & ~0x40000000);
      downloadLabel_ = getDefaultInstance().getDownloadLabel();
    }
    /**
     * <code>optional string downloadLabel = 78;</code>
     * @param value The bytes for downloadLabel to set.
     */
    private void setDownloadLabelBytes(
        com.google.protobuf.ByteString value) {
      downloadLabel_ = value.toStringUtf8();
      bitField0_ |= 0x40000000;
    }
  
    public static finsky.protos.AppDetails parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return com.google.protobuf.GeneratedMessageLite.parseFrom(
          DEFAULT_INSTANCE, data);
    }
    public static finsky.protos.AppDetails parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return com.google.protobuf.GeneratedMessageLite.parseFrom(
          DEFAULT_INSTANCE, data, extensionRegistry);
    }
    public static finsky.protos.AppDetails parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return com.google.protobuf.GeneratedMessageLite.parseFrom(
          DEFAULT_INSTANCE, data);
    }
    public static finsky.protos.AppDetails parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return com.google.protobuf.GeneratedMessageLite.parseFrom(
          DEFAULT_INSTANCE, data, extensionRegistry);
    }
    public static finsky.protos.AppDetails parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return com.google.protobuf.GeneratedMessageLite.parseFrom(
          DEFAULT_INSTANCE, data);
    }
    public static finsky.protos.AppDetails parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return com.google.protobuf.GeneratedMessageLite.parseFrom(
          DEFAULT_INSTANCE, data, extensionRegistry);
    }
    public static finsky.protos.AppDetails parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageLite.parseFrom(
          DEFAULT_INSTANCE, input);
    }
    public static finsky.protos.AppDetails parseFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageLite.parseFrom(
          DEFAULT_INSTANCE, input, extensionRegistry);
    }
  
    public static finsky.protos.AppDetails parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return parseDelimitedFrom(DEFAULT_INSTANCE, input);
    }
  
    public static finsky.protos.AppDetails parseDelimitedFrom(
        java.io.InputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return parseDelimitedFrom(DEFAULT_INSTANCE, input, extensionRegistry);
    }
    public static finsky.protos.AppDetails parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageLite.parseFrom(
          DEFAULT_INSTANCE, input);
    }
    public static finsky.protos.AppDetails parseFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageLite.parseFrom(
          DEFAULT_INSTANCE, input, extensionRegistry);
    }
  
    public static Builder newBuilder() {
      return (Builder) DEFAULT_INSTANCE.createBuilder();
    }
    public static Builder newBuilder(finsky.protos.AppDetails prototype) {
      return DEFAULT_INSTANCE.createBuilder(prototype);
    }
  
    /**
     * Protobuf type {@code finsky.protos.AppDetails}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageLite.Builder<
          finsky.protos.AppDetails, Builder> implements
        // @@protoc_insertion_point(builder_implements:finsky.protos.AppDetails)
        finsky.protos.AppDetailsOrBuilder {
      // Construct using finsky.protos.AppDetails.newBuilder()
      private Builder() {
        super(DEFAULT_INSTANCE);
      }
  
  
      /**
       * <code>optional string developerName = 1;</code>
       * @return Whether the developerName field is set.
       */
      @java.lang.Override
      public boolean hasDeveloperName() {
        return instance.hasDeveloperName();
      }
      /**
       * <code>optional string developerName = 1;</code>
       * @return The developerName.
       */
      @java.lang.Override
      public java.lang.String getDeveloperName() {
        return instance.getDeveloperName();
      }
      /**
       * <code>optional string developerName = 1;</code>
       * @return The bytes for developerName.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDeveloperNameBytes() {
        return instance.getDeveloperNameBytes();
      }
      /**
       * <code>optional string developerName = 1;</code>
       * @param value The developerName to set.
       * @return This builder for chaining.
       */
      public Builder setDeveloperName(
          java.lang.String value) {
        copyOnWrite();
        instance.setDeveloperName(value);
        return this;
      }
      /**
       * <code>optional string developerName = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearDeveloperName() {
        copyOnWrite();
        instance.clearDeveloperName();
        return this;
      }
      /**
       * <code>optional string developerName = 1;</code>
       * @param value The bytes for developerName to set.
       * @return This builder for chaining.
       */
      public Builder setDeveloperNameBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setDeveloperNameBytes(value);
        return this;
      }
  
      /**
       * <code>optional int32 majorVersionNumber = 2;</code>
       * @return Whether the majorVersionNumber field is set.
       */
      @java.lang.Override
      public boolean hasMajorVersionNumber() {
        return instance.hasMajorVersionNumber();
      }
      /**
       * <code>optional int32 majorVersionNumber = 2;</code>
       * @return The majorVersionNumber.
       */
      @java.lang.Override
      public int getMajorVersionNumber() {
        return instance.getMajorVersionNumber();
      }
      /**
       * <code>optional int32 majorVersionNumber = 2;</code>
       * @param value The majorVersionNumber to set.
       * @return This builder for chaining.
       */
      public Builder setMajorVersionNumber(int value) {
        copyOnWrite();
        instance.setMajorVersionNumber(value);
        return this;
      }
      /**
       * <code>optional int32 majorVersionNumber = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearMajorVersionNumber() {
        copyOnWrite();
        instance.clearMajorVersionNumber();
        return this;
      }
  
      /**
       * <code>optional int32 versionCode = 3;</code>
       * @return Whether the versionCode field is set.
       */
      @java.lang.Override
      public boolean hasVersionCode() {
        return instance.hasVersionCode();
      }
      /**
       * <code>optional int32 versionCode = 3;</code>
       * @return The versionCode.
       */
      @java.lang.Override
      public int getVersionCode() {
        return instance.getVersionCode();
      }
      /**
       * <code>optional int32 versionCode = 3;</code>
       * @param value The versionCode to set.
       * @return This builder for chaining.
       */
      public Builder setVersionCode(int value) {
        copyOnWrite();
        instance.setVersionCode(value);
        return this;
      }
      /**
       * <code>optional int32 versionCode = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearVersionCode() {
        copyOnWrite();
        instance.clearVersionCode();
        return this;
      }
  
      /**
       * <code>optional string versionString = 4;</code>
       * @return Whether the versionString field is set.
       */
      @java.lang.Override
      public boolean hasVersionString() {
        return instance.hasVersionString();
      }
      /**
       * <code>optional string versionString = 4;</code>
       * @return The versionString.
       */
      @java.lang.Override
      public java.lang.String getVersionString() {
        return instance.getVersionString();
      }
      /**
       * <code>optional string versionString = 4;</code>
       * @return The bytes for versionString.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getVersionStringBytes() {
        return instance.getVersionStringBytes();
      }
      /**
       * <code>optional string versionString = 4;</code>
       * @param value The versionString to set.
       * @return This builder for chaining.
       */
      public Builder setVersionString(
          java.lang.String value) {
        copyOnWrite();
        instance.setVersionString(value);
        return this;
      }
      /**
       * <code>optional string versionString = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearVersionString() {
        copyOnWrite();
        instance.clearVersionString();
        return this;
      }
      /**
       * <code>optional string versionString = 4;</code>
       * @param value The bytes for versionString to set.
       * @return This builder for chaining.
       */
      public Builder setVersionStringBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setVersionStringBytes(value);
        return this;
      }
  
      /**
       * <code>optional string title = 5;</code>
       * @return Whether the title field is set.
       */
      @java.lang.Override
      public boolean hasTitle() {
        return instance.hasTitle();
      }
      /**
       * <code>optional string title = 5;</code>
       * @return The title.
       */
      @java.lang.Override
      public java.lang.String getTitle() {
        return instance.getTitle();
      }
      /**
       * <code>optional string title = 5;</code>
       * @return The bytes for title.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getTitleBytes() {
        return instance.getTitleBytes();
      }
      /**
       * <code>optional string title = 5;</code>
       * @param value The title to set.
       * @return This builder for chaining.
       */
      public Builder setTitle(
          java.lang.String value) {
        copyOnWrite();
        instance.setTitle(value);
        return this;
      }
      /**
       * <code>optional string title = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearTitle() {
        copyOnWrite();
        instance.clearTitle();
        return this;
      }
      /**
       * <code>optional string title = 5;</code>
       * @param value The bytes for title to set.
       * @return This builder for chaining.
       */
      public Builder setTitleBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setTitleBytes(value);
        return this;
      }
  
      /**
       * <code>repeated string appCategory = 7;</code>
       * @return A list containing the appCategory.
       */
      @java.lang.Override
      public java.util.List<java.lang.String>
          getAppCategoryList() {
        return java.util.Collections.unmodifiableList(
            instance.getAppCategoryList());
      }
      /**
       * <code>repeated string appCategory = 7;</code>
       * @return The count of appCategory.
       */
      @java.lang.Override
      public int getAppCategoryCount() {
        return instance.getAppCategoryCount();
      }
      /**
       * <code>repeated string appCategory = 7;</code>
       * @param index The index of the element to return.
       * @return The appCategory at the given index.
       */
      @java.lang.Override
      public java.lang.String getAppCategory(int index) {
        return instance.getAppCategory(index);
      }
      /**
       * <code>repeated string appCategory = 7;</code>
       * @param index The index of the value to return.
       * @return The bytes of the appCategory at the given index.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getAppCategoryBytes(int index) {
        return instance.getAppCategoryBytes(index);
      }
      /**
       * <code>repeated string appCategory = 7;</code>
       * @param index The index to set the value at.
       * @param value The appCategory to set.
       * @return This builder for chaining.
       */
      public Builder setAppCategory(
          int index, java.lang.String value) {
        copyOnWrite();
        instance.setAppCategory(index, value);
        return this;
      }
      /**
       * <code>repeated string appCategory = 7;</code>
       * @param value The appCategory to add.
       * @return This builder for chaining.
       */
      public Builder addAppCategory(
          java.lang.String value) {
        copyOnWrite();
        instance.addAppCategory(value);
        return this;
      }
      /**
       * <code>repeated string appCategory = 7;</code>
       * @param values The appCategory to add.
       * @return This builder for chaining.
       */
      public Builder addAllAppCategory(
          java.lang.Iterable<java.lang.String> values) {
        copyOnWrite();
        instance.addAllAppCategory(values);
        return this;
      }
      /**
       * <code>repeated string appCategory = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearAppCategory() {
        copyOnWrite();
        instance.clearAppCategory();
        return this;
      }
      /**
       * <code>repeated string appCategory = 7;</code>
       * @param value The bytes of the appCategory to add.
       * @return This builder for chaining.
       */
      public Builder addAppCategoryBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.addAppCategoryBytes(value);
        return this;
      }
  
      /**
       * <code>optional int32 contentRating = 8;</code>
       * @return Whether the contentRating field is set.
       */
      @java.lang.Override
      public boolean hasContentRating() {
        return instance.hasContentRating();
      }
      /**
       * <code>optional int32 contentRating = 8;</code>
       * @return The contentRating.
       */
      @java.lang.Override
      public int getContentRating() {
        return instance.getContentRating();
      }
      /**
       * <code>optional int32 contentRating = 8;</code>
       * @param value The contentRating to set.
       * @return This builder for chaining.
       */
      public Builder setContentRating(int value) {
        copyOnWrite();
        instance.setContentRating(value);
        return this;
      }
      /**
       * <code>optional int32 contentRating = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearContentRating() {
        copyOnWrite();
        instance.clearContentRating();
        return this;
      }
  
      /**
       * <code>optional int64 installationSize = 9;</code>
       * @return Whether the installationSize field is set.
       */
      @java.lang.Override
      public boolean hasInstallationSize() {
        return instance.hasInstallationSize();
      }
      /**
       * <code>optional int64 installationSize = 9;</code>
       * @return The installationSize.
       */
      @java.lang.Override
      public long getInstallationSize() {
        return instance.getInstallationSize();
      }
      /**
       * <code>optional int64 installationSize = 9;</code>
       * @param value The installationSize to set.
       * @return This builder for chaining.
       */
      public Builder setInstallationSize(long value) {
        copyOnWrite();
        instance.setInstallationSize(value);
        return this;
      }
      /**
       * <code>optional int64 installationSize = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearInstallationSize() {
        copyOnWrite();
        instance.clearInstallationSize();
        return this;
      }
  
      /**
       * <code>repeated string permission = 10;</code>
       * @return A list containing the permission.
       */
      @java.lang.Override
      public java.util.List<java.lang.String>
          getPermissionList() {
        return java.util.Collections.unmodifiableList(
            instance.getPermissionList());
      }
      /**
       * <code>repeated string permission = 10;</code>
       * @return The count of permission.
       */
      @java.lang.Override
      public int getPermissionCount() {
        return instance.getPermissionCount();
      }
      /**
       * <code>repeated string permission = 10;</code>
       * @param index The index of the element to return.
       * @return The permission at the given index.
       */
      @java.lang.Override
      public java.lang.String getPermission(int index) {
        return instance.getPermission(index);
      }
      /**
       * <code>repeated string permission = 10;</code>
       * @param index The index of the value to return.
       * @return The bytes of the permission at the given index.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getPermissionBytes(int index) {
        return instance.getPermissionBytes(index);
      }
      /**
       * <code>repeated string permission = 10;</code>
       * @param index The index to set the value at.
       * @param value The permission to set.
       * @return This builder for chaining.
       */
      public Builder setPermission(
          int index, java.lang.String value) {
        copyOnWrite();
        instance.setPermission(index, value);
        return this;
      }
      /**
       * <code>repeated string permission = 10;</code>
       * @param value The permission to add.
       * @return This builder for chaining.
       */
      public Builder addPermission(
          java.lang.String value) {
        copyOnWrite();
        instance.addPermission(value);
        return this;
      }
      /**
       * <code>repeated string permission = 10;</code>
       * @param values The permission to add.
       * @return This builder for chaining.
       */
      public Builder addAllPermission(
          java.lang.Iterable<java.lang.String> values) {
        copyOnWrite();
        instance.addAllPermission(values);
        return this;
      }
      /**
       * <code>repeated string permission = 10;</code>
       * @return This builder for chaining.
       */
      public Builder clearPermission() {
        copyOnWrite();
        instance.clearPermission();
        return this;
      }
      /**
       * <code>repeated string permission = 10;</code>
       * @param value The bytes of the permission to add.
       * @return This builder for chaining.
       */
      public Builder addPermissionBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.addPermissionBytes(value);
        return this;
      }
  
      /**
       * <code>optional string developerEmail = 11;</code>
       * @return Whether the developerEmail field is set.
       */
      @java.lang.Override
      public boolean hasDeveloperEmail() {
        return instance.hasDeveloperEmail();
      }
      /**
       * <code>optional string developerEmail = 11;</code>
       * @return The developerEmail.
       */
      @java.lang.Override
      public java.lang.String getDeveloperEmail() {
        return instance.getDeveloperEmail();
      }
      /**
       * <code>optional string developerEmail = 11;</code>
       * @return The bytes for developerEmail.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDeveloperEmailBytes() {
        return instance.getDeveloperEmailBytes();
      }
      /**
       * <code>optional string developerEmail = 11;</code>
       * @param value The developerEmail to set.
       * @return This builder for chaining.
       */
      public Builder setDeveloperEmail(
          java.lang.String value) {
        copyOnWrite();
        instance.setDeveloperEmail(value);
        return this;
      }
      /**
       * <code>optional string developerEmail = 11;</code>
       * @return This builder for chaining.
       */
      public Builder clearDeveloperEmail() {
        copyOnWrite();
        instance.clearDeveloperEmail();
        return this;
      }
      /**
       * <code>optional string developerEmail = 11;</code>
       * @param value The bytes for developerEmail to set.
       * @return This builder for chaining.
       */
      public Builder setDeveloperEmailBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setDeveloperEmailBytes(value);
        return this;
      }
  
      /**
       * <code>optional string developerWebsite = 12;</code>
       * @return Whether the developerWebsite field is set.
       */
      @java.lang.Override
      public boolean hasDeveloperWebsite() {
        return instance.hasDeveloperWebsite();
      }
      /**
       * <code>optional string developerWebsite = 12;</code>
       * @return The developerWebsite.
       */
      @java.lang.Override
      public java.lang.String getDeveloperWebsite() {
        return instance.getDeveloperWebsite();
      }
      /**
       * <code>optional string developerWebsite = 12;</code>
       * @return The bytes for developerWebsite.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDeveloperWebsiteBytes() {
        return instance.getDeveloperWebsiteBytes();
      }
      /**
       * <code>optional string developerWebsite = 12;</code>
       * @param value The developerWebsite to set.
       * @return This builder for chaining.
       */
      public Builder setDeveloperWebsite(
          java.lang.String value) {
        copyOnWrite();
        instance.setDeveloperWebsite(value);
        return this;
      }
      /**
       * <code>optional string developerWebsite = 12;</code>
       * @return This builder for chaining.
       */
      public Builder clearDeveloperWebsite() {
        copyOnWrite();
        instance.clearDeveloperWebsite();
        return this;
      }
      /**
       * <code>optional string developerWebsite = 12;</code>
       * @param value The bytes for developerWebsite to set.
       * @return This builder for chaining.
       */
      public Builder setDeveloperWebsiteBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setDeveloperWebsiteBytes(value);
        return this;
      }
  
      /**
       * <code>optional string numDownloads = 13;</code>
       * @return Whether the numDownloads field is set.
       */
      @java.lang.Override
      public boolean hasNumDownloads() {
        return instance.hasNumDownloads();
      }
      /**
       * <code>optional string numDownloads = 13;</code>
       * @return The numDownloads.
       */
      @java.lang.Override
      public java.lang.String getNumDownloads() {
        return instance.getNumDownloads();
      }
      /**
       * <code>optional string numDownloads = 13;</code>
       * @return The bytes for numDownloads.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getNumDownloadsBytes() {
        return instance.getNumDownloadsBytes();
      }
      /**
       * <code>optional string numDownloads = 13;</code>
       * @param value The numDownloads to set.
       * @return This builder for chaining.
       */
      public Builder setNumDownloads(
          java.lang.String value) {
        copyOnWrite();
        instance.setNumDownloads(value);
        return this;
      }
      /**
       * <code>optional string numDownloads = 13;</code>
       * @return This builder for chaining.
       */
      public Builder clearNumDownloads() {
        copyOnWrite();
        instance.clearNumDownloads();
        return this;
      }
      /**
       * <code>optional string numDownloads = 13;</code>
       * @param value The bytes for numDownloads to set.
       * @return This builder for chaining.
       */
      public Builder setNumDownloadsBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setNumDownloadsBytes(value);
        return this;
      }
  
      /**
       * <code>optional string packageName = 14;</code>
       * @return Whether the packageName field is set.
       */
      @java.lang.Override
      public boolean hasPackageName() {
        return instance.hasPackageName();
      }
      /**
       * <code>optional string packageName = 14;</code>
       * @return The packageName.
       */
      @java.lang.Override
      public java.lang.String getPackageName() {
        return instance.getPackageName();
      }
      /**
       * <code>optional string packageName = 14;</code>
       * @return The bytes for packageName.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getPackageNameBytes() {
        return instance.getPackageNameBytes();
      }
      /**
       * <code>optional string packageName = 14;</code>
       * @param value The packageName to set.
       * @return This builder for chaining.
       */
      public Builder setPackageName(
          java.lang.String value) {
        copyOnWrite();
        instance.setPackageName(value);
        return this;
      }
      /**
       * <code>optional string packageName = 14;</code>
       * @return This builder for chaining.
       */
      public Builder clearPackageName() {
        copyOnWrite();
        instance.clearPackageName();
        return this;
      }
      /**
       * <code>optional string packageName = 14;</code>
       * @param value The bytes for packageName to set.
       * @return This builder for chaining.
       */
      public Builder setPackageNameBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setPackageNameBytes(value);
        return this;
      }
  
      /**
       * <code>optional string recentChangesHtml = 15;</code>
       * @return Whether the recentChangesHtml field is set.
       */
      @java.lang.Override
      public boolean hasRecentChangesHtml() {
        return instance.hasRecentChangesHtml();
      }
      /**
       * <code>optional string recentChangesHtml = 15;</code>
       * @return The recentChangesHtml.
       */
      @java.lang.Override
      public java.lang.String getRecentChangesHtml() {
        return instance.getRecentChangesHtml();
      }
      /**
       * <code>optional string recentChangesHtml = 15;</code>
       * @return The bytes for recentChangesHtml.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getRecentChangesHtmlBytes() {
        return instance.getRecentChangesHtmlBytes();
      }
      /**
       * <code>optional string recentChangesHtml = 15;</code>
       * @param value The recentChangesHtml to set.
       * @return This builder for chaining.
       */
      public Builder setRecentChangesHtml(
          java.lang.String value) {
        copyOnWrite();
        instance.setRecentChangesHtml(value);
        return this;
      }
      /**
       * <code>optional string recentChangesHtml = 15;</code>
       * @return This builder for chaining.
       */
      public Builder clearRecentChangesHtml() {
        copyOnWrite();
        instance.clearRecentChangesHtml();
        return this;
      }
      /**
       * <code>optional string recentChangesHtml = 15;</code>
       * @param value The bytes for recentChangesHtml to set.
       * @return This builder for chaining.
       */
      public Builder setRecentChangesHtmlBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setRecentChangesHtmlBytes(value);
        return this;
      }
  
      /**
       * <code>optional string uploadDate = 16;</code>
       * @return Whether the uploadDate field is set.
       */
      @java.lang.Override
      public boolean hasUploadDate() {
        return instance.hasUploadDate();
      }
      /**
       * <code>optional string uploadDate = 16;</code>
       * @return The uploadDate.
       */
      @java.lang.Override
      public java.lang.String getUploadDate() {
        return instance.getUploadDate();
      }
      /**
       * <code>optional string uploadDate = 16;</code>
       * @return The bytes for uploadDate.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getUploadDateBytes() {
        return instance.getUploadDateBytes();
      }
      /**
       * <code>optional string uploadDate = 16;</code>
       * @param value The uploadDate to set.
       * @return This builder for chaining.
       */
      public Builder setUploadDate(
          java.lang.String value) {
        copyOnWrite();
        instance.setUploadDate(value);
        return this;
      }
      /**
       * <code>optional string uploadDate = 16;</code>
       * @return This builder for chaining.
       */
      public Builder clearUploadDate() {
        copyOnWrite();
        instance.clearUploadDate();
        return this;
      }
      /**
       * <code>optional string uploadDate = 16;</code>
       * @param value The bytes for uploadDate to set.
       * @return This builder for chaining.
       */
      public Builder setUploadDateBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setUploadDateBytes(value);
        return this;
      }
  
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      @java.lang.Override
      public java.util.List<finsky.protos.Common.FileMetadata> getFileList() {
        return java.util.Collections.unmodifiableList(
            instance.getFileList());
      }
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      @java.lang.Override
      public int getFileCount() {
        return instance.getFileCount();
      }/**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      @java.lang.Override
      public finsky.protos.Common.FileMetadata getFile(int index) {
        return instance.getFile(index);
      }
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      public Builder setFile(
          int index, finsky.protos.Common.FileMetadata value) {
        copyOnWrite();
        instance.setFile(index, value);
        return this;
      }
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      public Builder setFile(
          int index, finsky.protos.Common.FileMetadata.Builder builderForValue) {
        copyOnWrite();
        instance.setFile(index,
            builderForValue.build());
        return this;
      }
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      public Builder addFile(finsky.protos.Common.FileMetadata value) {
        copyOnWrite();
        instance.addFile(value);
        return this;
      }
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      public Builder addFile(
          int index, finsky.protos.Common.FileMetadata value) {
        copyOnWrite();
        instance.addFile(index, value);
        return this;
      }
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      public Builder addFile(
          finsky.protos.Common.FileMetadata.Builder builderForValue) {
        copyOnWrite();
        instance.addFile(builderForValue.build());
        return this;
      }
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      public Builder addFile(
          int index, finsky.protos.Common.FileMetadata.Builder builderForValue) {
        copyOnWrite();
        instance.addFile(index,
            builderForValue.build());
        return this;
      }
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      public Builder addAllFile(
          java.lang.Iterable<? extends finsky.protos.Common.FileMetadata> values) {
        copyOnWrite();
        instance.addAllFile(values);
        return this;
      }
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      public Builder clearFile() {
        copyOnWrite();
        instance.clearFile();
        return this;
      }
      /**
       * <code>repeated .finsky.protos.Common.FileMetadata file = 17;</code>
       */
      public Builder removeFile(int index) {
        copyOnWrite();
        instance.removeFile(index);
        return this;
      }
  
      /**
       * <code>optional string appType = 18;</code>
       * @return Whether the appType field is set.
       */
      @java.lang.Override
      public boolean hasAppType() {
        return instance.hasAppType();
      }
      /**
       * <code>optional string appType = 18;</code>
       * @return The appType.
       */
      @java.lang.Override
      public java.lang.String getAppType() {
        return instance.getAppType();
      }
      /**
       * <code>optional string appType = 18;</code>
       * @return The bytes for appType.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getAppTypeBytes() {
        return instance.getAppTypeBytes();
      }
      /**
       * <code>optional string appType = 18;</code>
       * @param value The appType to set.
       * @return This builder for chaining.
       */
      public Builder setAppType(
          java.lang.String value) {
        copyOnWrite();
        instance.setAppType(value);
        return this;
      }
      /**
       * <code>optional string appType = 18;</code>
       * @return This builder for chaining.
       */
      public Builder clearAppType() {
        copyOnWrite();
        instance.clearAppType();
        return this;
      }
      /**
       * <code>optional string appType = 18;</code>
       * @param value The bytes for appType to set.
       * @return This builder for chaining.
       */
      public Builder setAppTypeBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setAppTypeBytes(value);
        return this;
      }
  
      /**
       * <code>optional bool unstable = 21;</code>
       * @return Whether the unstable field is set.
       */
      @java.lang.Override
      public boolean hasUnstable() {
        return instance.hasUnstable();
      }
      /**
       * <code>optional bool unstable = 21;</code>
       * @return The unstable.
       */
      @java.lang.Override
      public boolean getUnstable() {
        return instance.getUnstable();
      }
      /**
       * <code>optional bool unstable = 21;</code>
       * @param value The unstable to set.
       * @return This builder for chaining.
       */
      public Builder setUnstable(boolean value) {
        copyOnWrite();
        instance.setUnstable(value);
        return this;
      }
      /**
       * <code>optional bool unstable = 21;</code>
       * @return This builder for chaining.
       */
      public Builder clearUnstable() {
        copyOnWrite();
        instance.clearUnstable();
        return this;
      }
  
      /**
       * <code>optional bool hasInstantLink = 24;</code>
       * @return Whether the hasInstantLink field is set.
       */
      @java.lang.Override
      public boolean hasHasInstantLink() {
        return instance.hasHasInstantLink();
      }
      /**
       * <code>optional bool hasInstantLink = 24;</code>
       * @return The hasInstantLink.
       */
      @java.lang.Override
      public boolean getHasInstantLink() {
        return instance.getHasInstantLink();
      }
      /**
       * <code>optional bool hasInstantLink = 24;</code>
       * @param value The hasInstantLink to set.
       * @return This builder for chaining.
       */
      public Builder setHasInstantLink(boolean value) {
        copyOnWrite();
        instance.setHasInstantLink(value);
        return this;
      }
      /**
       * <code>optional bool hasInstantLink = 24;</code>
       * @return This builder for chaining.
       */
      public Builder clearHasInstantLink() {
        copyOnWrite();
        instance.clearHasInstantLink();
        return this;
      }
  
      /**
       * <code>optional string containsAds = 30;</code>
       * @return Whether the containsAds field is set.
       */
      @java.lang.Override
      public boolean hasContainsAds() {
        return instance.hasContainsAds();
      }
      /**
       * <code>optional string containsAds = 30;</code>
       * @return The containsAds.
       */
      @java.lang.Override
      public java.lang.String getContainsAds() {
        return instance.getContainsAds();
      }
      /**
       * <code>optional string containsAds = 30;</code>
       * @return The bytes for containsAds.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getContainsAdsBytes() {
        return instance.getContainsAdsBytes();
      }
      /**
       * <code>optional string containsAds = 30;</code>
       * @param value The containsAds to set.
       * @return This builder for chaining.
       */
      public Builder setContainsAds(
          java.lang.String value) {
        copyOnWrite();
        instance.setContainsAds(value);
        return this;
      }
      /**
       * <code>optional string containsAds = 30;</code>
       * @return This builder for chaining.
       */
      public Builder clearContainsAds() {
        copyOnWrite();
        instance.clearContainsAds();
        return this;
      }
      /**
       * <code>optional string containsAds = 30;</code>
       * @param value The bytes for containsAds to set.
       * @return This builder for chaining.
       */
      public Builder setContainsAdsBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setContainsAdsBytes(value);
        return this;
      }
  
      /**
       * <code>optional int32 targetSdkVersion = 32;</code>
       * @return Whether the targetSdkVersion field is set.
       */
      @java.lang.Override
      public boolean hasTargetSdkVersion() {
        return instance.hasTargetSdkVersion();
      }
      /**
       * <code>optional int32 targetSdkVersion = 32;</code>
       * @return The targetSdkVersion.
       */
      @java.lang.Override
      public int getTargetSdkVersion() {
        return instance.getTargetSdkVersion();
      }
      /**
       * <code>optional int32 targetSdkVersion = 32;</code>
       * @param value The targetSdkVersion to set.
       * @return This builder for chaining.
       */
      public Builder setTargetSdkVersion(int value) {
        copyOnWrite();
        instance.setTargetSdkVersion(value);
        return this;
      }
      /**
       * <code>optional int32 targetSdkVersion = 32;</code>
       * @return This builder for chaining.
       */
      public Builder clearTargetSdkVersion() {
        copyOnWrite();
        instance.clearTargetSdkVersion();
        return this;
      }
  
      /**
       * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
       */
      @java.lang.Override
      public boolean hasDependencies() {
        return instance.hasDependencies();
      }
      /**
       * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
       */
      @java.lang.Override
      public finsky.protos.Dependencies getDependencies() {
        return instance.getDependencies();
      }
      /**
       * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
       */
      public Builder setDependencies(finsky.protos.Dependencies value) {
        copyOnWrite();
        instance.setDependencies(value);
        return this;
        }
      /**
       * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
       */
      public Builder setDependencies(
          finsky.protos.Dependencies.Builder builderForValue) {
        copyOnWrite();
        instance.setDependencies(builderForValue.build());
        return this;
      }
      /**
       * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
       */
      public Builder mergeDependencies(finsky.protos.Dependencies value) {
        copyOnWrite();
        instance.mergeDependencies(value);
        return this;
      }
      /**
       * <code>optional .finsky.protos.Dependencies dependencies = 34;</code>
       */
      public Builder clearDependencies() {  copyOnWrite();
        instance.clearDependencies();
        return this;
      }
  
      /**
       * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
       */
      @java.lang.Override
      public boolean hasTestingProgramInfo() {
        return instance.hasTestingProgramInfo();
      }
      /**
       * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
       */
      @java.lang.Override
      public finsky.protos.TestingProgramInfo getTestingProgramInfo() {
        return instance.getTestingProgramInfo();
      }
      /**
       * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
       */
      public Builder setTestingProgramInfo(finsky.protos.TestingProgramInfo value) {
        copyOnWrite();
        instance.setTestingProgramInfo(value);
        return this;
        }
      /**
       * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
       */
      public Builder setTestingProgramInfo(
          finsky.protos.TestingProgramInfo.Builder builderForValue) {
        copyOnWrite();
        instance.setTestingProgramInfo(builderForValue.build());
        return this;
      }
      /**
       * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
       */
      public Builder mergeTestingProgramInfo(finsky.protos.TestingProgramInfo value) {
        copyOnWrite();
        instance.mergeTestingProgramInfo(value);
        return this;
      }
      /**
       * <code>optional .finsky.protos.TestingProgramInfo testingProgramInfo = 35;</code>
       */
      public Builder clearTestingProgramInfo() {  copyOnWrite();
        instance.clearTestingProgramInfo();
        return this;
      }
  
      /**
       * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
       */
      @java.lang.Override
      public boolean hasEarlyAccessInfo() {
        return instance.hasEarlyAccessInfo();
      }
      /**
       * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
       */
      @java.lang.Override
      public finsky.protos.EarlyAccessInfo getEarlyAccessInfo() {
        return instance.getEarlyAccessInfo();
      }
      /**
       * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
       */
      public Builder setEarlyAccessInfo(finsky.protos.EarlyAccessInfo value) {
        copyOnWrite();
        instance.setEarlyAccessInfo(value);
        return this;
        }
      /**
       * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
       */
      public Builder setEarlyAccessInfo(
          finsky.protos.EarlyAccessInfo.Builder builderForValue) {
        copyOnWrite();
        instance.setEarlyAccessInfo(builderForValue.build());
        return this;
      }
      /**
       * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
       */
      public Builder mergeEarlyAccessInfo(finsky.protos.EarlyAccessInfo value) {
        copyOnWrite();
        instance.mergeEarlyAccessInfo(value);
        return this;
      }
      /**
       * <code>optional .finsky.protos.EarlyAccessInfo earlyAccessInfo = 36;</code>
       */
      public Builder clearEarlyAccessInfo() {  copyOnWrite();
        instance.clearEarlyAccessInfo();
        return this;
      }
  
      /**
       * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
       */
      @java.lang.Override
      public boolean hasEditorChoice() {
        return instance.hasEditorChoice();
      }
      /**
       * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
       */
      @java.lang.Override
      public finsky.protos.EditorChoice getEditorChoice() {
        return instance.getEditorChoice();
      }
      /**
       * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
       */
      public Builder setEditorChoice(finsky.protos.EditorChoice value) {
        copyOnWrite();
        instance.setEditorChoice(value);
        return this;
        }
      /**
       * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
       */
      public Builder setEditorChoice(
          finsky.protos.EditorChoice.Builder builderForValue) {
        copyOnWrite();
        instance.setEditorChoice(builderForValue.build());
        return this;
      }
      /**
       * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
       */
      public Builder mergeEditorChoice(finsky.protos.EditorChoice value) {
        copyOnWrite();
        instance.mergeEditorChoice(value);
        return this;
      }
      /**
       * <code>optional .finsky.protos.EditorChoice editorChoice = 41;</code>
       */
      public Builder clearEditorChoice() {  copyOnWrite();
        instance.clearEditorChoice();
        return this;
      }
  
      /**
       * <code>optional string instantLink = 43;</code>
       * @return Whether the instantLink field is set.
       */
      @java.lang.Override
      public boolean hasInstantLink() {
        return instance.hasInstantLink();
      }
      /**
       * <code>optional string instantLink = 43;</code>
       * @return The instantLink.
       */
      @java.lang.Override
      public java.lang.String getInstantLink() {
        return instance.getInstantLink();
      }
      /**
       * <code>optional string instantLink = 43;</code>
       * @return The bytes for instantLink.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getInstantLinkBytes() {
        return instance.getInstantLinkBytes();
      }
      /**
       * <code>optional string instantLink = 43;</code>
       * @param value The instantLink to set.
       * @return This builder for chaining.
       */
      public Builder setInstantLink(
          java.lang.String value) {
        copyOnWrite();
        instance.setInstantLink(value);
        return this;
      }
      /**
       * <code>optional string instantLink = 43;</code>
       * @return This builder for chaining.
       */
      public Builder clearInstantLink() {
        copyOnWrite();
        instance.clearInstantLink();
        return this;
      }
      /**
       * <code>optional string instantLink = 43;</code>
       * @param value The bytes for instantLink to set.
       * @return This builder for chaining.
       */
      public Builder setInstantLinkBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setInstantLinkBytes(value);
        return this;
      }
  
      /**
       * <code>optional string developerAddress = 45;</code>
       * @return Whether the developerAddress field is set.
       */
      @java.lang.Override
      public boolean hasDeveloperAddress() {
        return instance.hasDeveloperAddress();
      }
      /**
       * <code>optional string developerAddress = 45;</code>
       * @return The developerAddress.
       */
      @java.lang.Override
      public java.lang.String getDeveloperAddress() {
        return instance.getDeveloperAddress();
      }
      /**
       * <code>optional string developerAddress = 45;</code>
       * @return The bytes for developerAddress.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDeveloperAddressBytes() {
        return instance.getDeveloperAddressBytes();
      }
      /**
       * <code>optional string developerAddress = 45;</code>
       * @param value The developerAddress to set.
       * @return This builder for chaining.
       */
      public Builder setDeveloperAddress(
          java.lang.String value) {
        copyOnWrite();
        instance.setDeveloperAddress(value);
        return this;
      }
      /**
       * <code>optional string developerAddress = 45;</code>
       * @return This builder for chaining.
       */
      public Builder clearDeveloperAddress() {
        copyOnWrite();
        instance.clearDeveloperAddress();
        return this;
      }
      /**
       * <code>optional string developerAddress = 45;</code>
       * @param value The bytes for developerAddress to set.
       * @return This builder for chaining.
       */
      public Builder setDeveloperAddressBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setDeveloperAddressBytes(value);
        return this;
      }
  
      /**
       * <code>optional .finsky.protos.Publisher publisher = 46;</code>
       */
      @java.lang.Override
      public boolean hasPublisher() {
        return instance.hasPublisher();
      }
      /**
       * <code>optional .finsky.protos.Publisher publisher = 46;</code>
       */
      @java.lang.Override
      public finsky.protos.Publisher getPublisher() {
        return instance.getPublisher();
      }
      /**
       * <code>optional .finsky.protos.Publisher publisher = 46;</code>
       */
      public Builder setPublisher(finsky.protos.Publisher value) {
        copyOnWrite();
        instance.setPublisher(value);
        return this;
        }
      /**
       * <code>optional .finsky.protos.Publisher publisher = 46;</code>
       */
      public Builder setPublisher(
          finsky.protos.Publisher.Builder builderForValue) {
        copyOnWrite();
        instance.setPublisher(builderForValue.build());
        return this;
      }
      /**
       * <code>optional .finsky.protos.Publisher publisher = 46;</code>
       */
      public Builder mergePublisher(finsky.protos.Publisher value) {
        copyOnWrite();
        instance.mergePublisher(value);
        return this;
      }
      /**
       * <code>optional .finsky.protos.Publisher publisher = 46;</code>
       */
      public Builder clearPublisher() {  copyOnWrite();
        instance.clearPublisher();
        return this;
      }
  
      /**
       * <code>optional string categoryName = 48;</code>
       * @return Whether the categoryName field is set.
       */
      @java.lang.Override
      public boolean hasCategoryName() {
        return instance.hasCategoryName();
      }
      /**
       * <code>optional string categoryName = 48;</code>
       * @return The categoryName.
       */
      @java.lang.Override
      public java.lang.String getCategoryName() {
        return instance.getCategoryName();
      }
      /**
       * <code>optional string categoryName = 48;</code>
       * @return The bytes for categoryName.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getCategoryNameBytes() {
        return instance.getCategoryNameBytes();
      }
      /**
       * <code>optional string categoryName = 48;</code>
       * @param value The categoryName to set.
       * @return This builder for chaining.
       */
      public Builder setCategoryName(
          java.lang.String value) {
        copyOnWrite();
        instance.setCategoryName(value);
        return this;
      }
      /**
       * <code>optional string categoryName = 48;</code>
       * @return This builder for chaining.
       */
      public Builder clearCategoryName() {
        copyOnWrite();
        instance.clearCategoryName();
        return this;
      }
      /**
       * <code>optional string categoryName = 48;</code>
       * @param value The bytes for categoryName to set.
       * @return This builder for chaining.
       */
      public Builder setCategoryNameBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setCategoryNameBytes(value);
        return this;
      }
  
      /**
       * <code>optional int64 downloadCount = 53;</code>
       * @return Whether the downloadCount field is set.
       */
      @java.lang.Override
      public boolean hasDownloadCount() {
        return instance.hasDownloadCount();
      }
      /**
       * <code>optional int64 downloadCount = 53;</code>
       * @return The downloadCount.
       */
      @java.lang.Override
      public long getDownloadCount() {
        return instance.getDownloadCount();
      }
      /**
       * <code>optional int64 downloadCount = 53;</code>
       * @param value The downloadCount to set.
       * @return This builder for chaining.
       */
      public Builder setDownloadCount(long value) {
        copyOnWrite();
        instance.setDownloadCount(value);
        return this;
      }
      /**
       * <code>optional int64 downloadCount = 53;</code>
       * @return This builder for chaining.
       */
      public Builder clearDownloadCount() {
        copyOnWrite();
        instance.clearDownloadCount();
        return this;
      }
  
      /**
       * <code>optional string downloadLabelDisplay = 61;</code>
       * @return Whether the downloadLabelDisplay field is set.
       */
      @java.lang.Override
      public boolean hasDownloadLabelDisplay() {
        return instance.hasDownloadLabelDisplay();
      }
      /**
       * <code>optional string downloadLabelDisplay = 61;</code>
       * @return The downloadLabelDisplay.
       */
      @java.lang.Override
      public java.lang.String getDownloadLabelDisplay() {
        return instance.getDownloadLabelDisplay();
      }
      /**
       * <code>optional string downloadLabelDisplay = 61;</code>
       * @return The bytes for downloadLabelDisplay.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDownloadLabelDisplayBytes() {
        return instance.getDownloadLabelDisplayBytes();
      }
      /**
       * <code>optional string downloadLabelDisplay = 61;</code>
       * @param value The downloadLabelDisplay to set.
       * @return This builder for chaining.
       */
      public Builder setDownloadLabelDisplay(
          java.lang.String value) {
        copyOnWrite();
        instance.setDownloadLabelDisplay(value);
        return this;
      }
      /**
       * <code>optional string downloadLabelDisplay = 61;</code>
       * @return This builder for chaining.
       */
      public Builder clearDownloadLabelDisplay() {
        copyOnWrite();
        instance.clearDownloadLabelDisplay();
        return this;
      }
      /**
       * <code>optional string downloadLabelDisplay = 61;</code>
       * @param value The bytes for downloadLabelDisplay to set.
       * @return This builder for chaining.
       */
      public Builder setDownloadLabelDisplayBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setDownloadLabelDisplayBytes(value);
        return this;
      }
  
      /**
       * <code>optional string inAppProduct = 67;</code>
       * @return Whether the inAppProduct field is set.
       */
      @java.lang.Override
      public boolean hasInAppProduct() {
        return instance.hasInAppProduct();
      }
      /**
       * <code>optional string inAppProduct = 67;</code>
       * @return The inAppProduct.
       */
      @java.lang.Override
      public java.lang.String getInAppProduct() {
        return instance.getInAppProduct();
      }
      /**
       * <code>optional string inAppProduct = 67;</code>
       * @return The bytes for inAppProduct.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getInAppProductBytes() {
        return instance.getInAppProductBytes();
      }
      /**
       * <code>optional string inAppProduct = 67;</code>
       * @param value The inAppProduct to set.
       * @return This builder for chaining.
       */
      public Builder setInAppProduct(
          java.lang.String value) {
        copyOnWrite();
        instance.setInAppProduct(value);
        return this;
      }
      /**
       * <code>optional string inAppProduct = 67;</code>
       * @return This builder for chaining.
       */
      public Builder clearInAppProduct() {
        copyOnWrite();
        instance.clearInAppProduct();
        return this;
      }
      /**
       * <code>optional string inAppProduct = 67;</code>
       * @param value The bytes for inAppProduct to set.
       * @return This builder for chaining.
       */
      public Builder setInAppProductBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setInAppProductBytes(value);
        return this;
      }
  
      /**
       * <code>optional string downloadLabelAbbreviated = 77;</code>
       * @return Whether the downloadLabelAbbreviated field is set.
       */
      @java.lang.Override
      public boolean hasDownloadLabelAbbreviated() {
        return instance.hasDownloadLabelAbbreviated();
      }
      /**
       * <code>optional string downloadLabelAbbreviated = 77;</code>
       * @return The downloadLabelAbbreviated.
       */
      @java.lang.Override
      public java.lang.String getDownloadLabelAbbreviated() {
        return instance.getDownloadLabelAbbreviated();
      }
      /**
       * <code>optional string downloadLabelAbbreviated = 77;</code>
       * @return The bytes for downloadLabelAbbreviated.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDownloadLabelAbbreviatedBytes() {
        return instance.getDownloadLabelAbbreviatedBytes();
      }
      /**
       * <code>optional string downloadLabelAbbreviated = 77;</code>
       * @param value The downloadLabelAbbreviated to set.
       * @return This builder for chaining.
       */
      public Builder setDownloadLabelAbbreviated(
          java.lang.String value) {
        copyOnWrite();
        instance.setDownloadLabelAbbreviated(value);
        return this;
      }
      /**
       * <code>optional string downloadLabelAbbreviated = 77;</code>
       * @return This builder for chaining.
       */
      public Builder clearDownloadLabelAbbreviated() {
        copyOnWrite();
        instance.clearDownloadLabelAbbreviated();
        return this;
      }
      /**
       * <code>optional string downloadLabelAbbreviated = 77;</code>
       * @param value The bytes for downloadLabelAbbreviated to set.
       * @return This builder for chaining.
       */
      public Builder setDownloadLabelAbbreviatedBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setDownloadLabelAbbreviatedBytes(value);
        return this;
      }
  
      /**
       * <code>optional string downloadLabel = 78;</code>
       * @return Whether the downloadLabel field is set.
       */
      @java.lang.Override
      public boolean hasDownloadLabel() {
        return instance.hasDownloadLabel();
      }
      /**
       * <code>optional string downloadLabel = 78;</code>
       * @return The downloadLabel.
       */
      @java.lang.Override
      public java.lang.String getDownloadLabel() {
        return instance.getDownloadLabel();
      }
      /**
       * <code>optional string downloadLabel = 78;</code>
       * @return The bytes for downloadLabel.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDownloadLabelBytes() {
        return instance.getDownloadLabelBytes();
      }
      /**
       * <code>optional string downloadLabel = 78;</code>
       * @param value The downloadLabel to set.
       * @return This builder for chaining.
       */
      public Builder setDownloadLabel(
          java.lang.String value) {
        copyOnWrite();
        instance.setDownloadLabel(value);
        return this;
      }
      /**
       * <code>optional string downloadLabel = 78;</code>
       * @return This builder for chaining.
       */
      public Builder clearDownloadLabel() {
        copyOnWrite();
        instance.clearDownloadLabel();
        return this;
      }
      /**
       * <code>optional string downloadLabel = 78;</code>
       * @param value The bytes for downloadLabel to set.
       * @return This builder for chaining.
       */
      public Builder setDownloadLabelBytes(
          com.google.protobuf.ByteString value) {
        copyOnWrite();
        instance.setDownloadLabelBytes(value);
        return this;
      }
  
      // @@protoc_insertion_point(builder_scope:finsky.protos.AppDetails)
    }
    @java.lang.Override
    @java.lang.SuppressWarnings({"unchecked", "fallthrough"})
    protected final java.lang.Object dynamicMethod(
        com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,
        java.lang.Object arg0, java.lang.Object arg1) {
      switch (method) {
        case NEW_MUTABLE_INSTANCE: {
          return new finsky.protos.AppDetails();
        }
        case NEW_BUILDER: {
          return new Builder();
        }
        case BUILD_MESSAGE_INFO: {
            java.lang.Object[] objects = new java.lang.Object[] {
              "bitField0_",
              "developerName_",
              "majorVersionNumber_",
              "versionCode_",
              "versionString_",
              "title_",
              "appCategory_",
              "contentRating_",
              "installationSize_",
              "permission_",
              "developerEmail_",
              "developerWebsite_",
              "numDownloads_",
              "packageName_",
              "recentChangesHtml_",
              "uploadDate_",
              "file_",
              finsky.protos.Common.FileMetadata.class,
              "appType_",
              "unstable_",
              "hasInstantLink_",
              "containsAds_",
              "targetSdkVersion_",
              "dependencies_",
              "testingProgramInfo_",
              "earlyAccessInfo_",
              "editorChoice_",
              "instantLink_",
              "developerAddress_",
              "publisher_",
              "categoryName_",
              "downloadCount_",
              "downloadLabelDisplay_",
              "inAppProduct_",
              "downloadLabelAbbreviated_",
              "downloadLabel_",
            };
            java.lang.String info =
                "\u0001\"\u0000\u0001\u0001N\"\u0000\u0003\u0000\u0001\u1008\u0000\u0002\u1004\u0001" +
                "\u0003\u1004\u0002\u0004\u1008\u0003\u0005\u1008\u0004\u0007\u001a\b\u1004\u0005" +
                "\t\u1002\u0006\n\u001a\u000b\u1008\u0007\f\u1008\b\r\u1008\t\u000e\u1008\n\u000f" +
                "\u1008\u000b\u0010\u1008\f\u0011\u001b\u0012\u1008\r\u0015\u1007\u000e\u0018\u1007" +
                "\u000f\u001e\u1008\u0010 \u1004\u0011\"\u1009\u0012#\u1009\u0013$\u1009\u0014)\u1009" +
                "\u0015+\u1008\u0016-\u1008\u0017.\u1009\u00180\u1008\u00195\u1002\u001a=\u1008\u001b" +
                "C\u1008\u001cM\u1008\u001dN\u1008\u001e";
            return newMessageInfo(DEFAULT_INSTANCE, info, objects);
        }
        // fall through
        case GET_DEFAULT_INSTANCE: {
          return DEFAULT_INSTANCE;
        }
        case GET_PARSER: {
          com.google.protobuf.Parser<finsky.protos.AppDetails> parser = PARSER;
          if (parser == null) {
            synchronized (finsky.protos.AppDetails.class) {
              parser = PARSER;
              if (parser == null) {
                parser =
                    new DefaultInstanceBasedParser<finsky.protos.AppDetails>(
                        DEFAULT_INSTANCE);
                PARSER = parser;
              }
            }
          }
          return parser;
      }
      case GET_MEMOIZED_IS_INITIALIZED: {
        return (byte) 1;
      }
      case SET_MEMOIZED_IS_INITIALIZED: {
        return null;
      }
      }
      throw new UnsupportedOperationException();
    }
  
  
    // @@protoc_insertion_point(class_scope:finsky.protos.AppDetails)
    private static final finsky.protos.AppDetails DEFAULT_INSTANCE;
    static {
      AppDetails defaultInstance = new AppDetails();
      // New instances are implicitly immutable so no need to make
      // immutable.
      DEFAULT_INSTANCE = defaultInstance;
      com.google.protobuf.GeneratedMessageLite.registerDefaultInstance(
        AppDetails.class, defaultInstance);
    }
  
    public static finsky.protos.AppDetails getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }
  
    private static volatile com.google.protobuf.Parser<AppDetails> PARSER;
  
    public static com.google.protobuf.Parser<AppDetails> parser() {
      return DEFAULT_INSTANCE.getParserForType();
    }
  }
  
  