/*
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
/*
 * This code was generated by https://github.com/googleapis/google-api-java-client-services/
 * Modify at your own risk.
 */

package com.google.api.services.firebaseappdistribution.v1;

/**
 * Service definition for FirebaseAppDistribution (v1).
 *
 * <p>
 * 
 * </p>
 *
 * <p>
 * For more information about this service, see the
 * <a href="https://firebase.google.com/products/app-distribution" target="_blank">API Documentation</a>
 * </p>
 *
 * <p>
 * This service uses {@link FirebaseAppDistributionRequestInitializer} to initialize global parameters via its
 * {@link Builder}.
 * </p>
 *
 * @since 1.3
 * @author Google, Inc.
 */
@SuppressWarnings("javadoc")
public class FirebaseAppDistribution extends com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient {

  // Note: Leave this static initializer at the top of the file.
  static {
    com.google.api.client.util.Preconditions.checkState(
        (com.google.api.client.googleapis.GoogleUtils.MAJOR_VERSION == 1 &&
        (com.google.api.client.googleapis.GoogleUtils.MINOR_VERSION >= 32 ||
        (com.google.api.client.googleapis.GoogleUtils.MINOR_VERSION == 31 &&
        com.google.api.client.googleapis.GoogleUtils.BUGFIX_VERSION >= 1))) ||
        com.google.api.client.googleapis.GoogleUtils.MAJOR_VERSION >= 2,
        "You are currently running with version %s of google-api-client. " +
        "You need at least version 1.31.1 of google-api-client to run version " +
        "2.0.0 of the Firebase App Distribution API library.", com.google.api.client.googleapis.GoogleUtils.VERSION);
  }

  /**
   * The default encoded root URL of the service. This is determined when the library is generated
   * and normally should not be changed.
   *
   * @since 1.7
   */
  public static final String DEFAULT_ROOT_URL = "https://firebaseappdistribution.googleapis.com/";

  /**
   * The default encoded mTLS root URL of the service. This is determined when the library is generated
   * and normally should not be changed.
   *
   * @since 1.31
   */
  public static final String DEFAULT_MTLS_ROOT_URL = "https://firebaseappdistribution.mtls.googleapis.com/";

  /**
   * The default encoded service path of the service. This is determined when the library is
   * generated and normally should not be changed.
   *
   * @since 1.7
   */
  public static final String DEFAULT_SERVICE_PATH = "";

  /**
   * The default encoded batch path of the service. This is determined when the library is
   * generated and normally should not be changed.
   *
   * @since 1.23
   */
  public static final String DEFAULT_BATCH_PATH = "batch";

  /**
   * The default encoded base URL of the service. This is determined when the library is generated
   * and normally should not be changed.
   */
  public static final String DEFAULT_BASE_URL = DEFAULT_ROOT_URL + DEFAULT_SERVICE_PATH;

  /**
   * Constructor.
   *
   * <p>
   * Use {@link Builder} if you need to specify any of the optional parameters.
   * </p>
   *
   * @param transport HTTP transport, which should normally be:
   *        <ul>
   *        <li>Google App Engine:
   *        {@code com.google.api.client.extensions.appengine.http.UrlFetchTransport}</li>
   *        <li>Android: {@code newCompatibleTransport} from
   *        {@code com.google.api.client.extensions.android.http.AndroidHttp}</li>
   *        <li>Java: {@link com.google.api.client.googleapis.javanet.GoogleNetHttpTransport#newTrustedTransport()}
   *        </li>
   *        </ul>
   * @param jsonFactory JSON factory, which may be:
   *        <ul>
   *        <li>Jackson: {@code com.google.api.client.json.jackson2.JacksonFactory}</li>
   *        <li>Google GSON: {@code com.google.api.client.json.gson.GsonFactory}</li>
   *        <li>Android Honeycomb or higher:
   *        {@code com.google.api.client.extensions.android.json.AndroidJsonFactory}</li>
   *        </ul>
   * @param httpRequestInitializer HTTP request initializer or {@code null} for none
   * @since 1.7
   */
  public FirebaseAppDistribution(com.google.api.client.http.HttpTransport transport, com.google.api.client.json.JsonFactory jsonFactory,
      com.google.api.client.http.HttpRequestInitializer httpRequestInitializer) {
    this(new Builder(transport, jsonFactory, httpRequestInitializer));
  }

  /**
   * @param builder builder
   */
  FirebaseAppDistribution(Builder builder) {
    super(builder);
  }

  @Override
  protected void initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest<?> httpClientRequest) throws java.io.IOException {
    super.initialize(httpClientRequest);
  }

  /**
   * An accessor for creating requests from the Media collection.
   *
   * <p>The typical use is:</p>
   * <pre>
   *   {@code FirebaseAppDistribution firebaseappdistribution = new FirebaseAppDistribution(...);}
   *   {@code FirebaseAppDistribution.Media.List request = firebaseappdistribution.media().list(parameters ...)}
   * </pre>
   *
   * @return the resource collection
   */
  public Media media() {
    return new Media();
  }

  /**
   * The "media" collection of methods.
   */
  public class Media {

    /**
     * Uploads a binary. Uploading a binary can result in a new release being created, an update to an
     * existing release, or a no-op if a release with the same binary already exists.
     *
     * Create a request for the method "media.upload".
     *
     * This request holds the parameters needed by the firebaseappdistribution server.  After setting
     * any optional parameters, call the {@link Upload#execute()} method to invoke the remote operation.
     *
     * @param app The name of the app resource. Format: `projects/{project_number}/apps/{app_id}`
     * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1UploadReleaseRequest}
     * @return the request
     */
    public Upload upload(java.lang.String app, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1UploadReleaseRequest content) throws java.io.IOException {
      Upload result = new Upload(app, content);
      initialize(result);
      return result;
    }

    /**
     * Uploads a binary. Uploading a binary can result in a new release being created, an update to an
     * existing release, or a no-op if a release with the same binary already exists.
     *
     * Create a request for the method "media.upload".
     *
     * This request holds the parameters needed by the the firebaseappdistribution server.  After
     * setting any optional parameters, call the {@link Upload#execute()} method to invoke the remote
     * operation.
     *
     * <p>
     * This method should be used for uploading media content.
     * </p>
     *
     * @param app The name of the app resource. Format: `projects/{project_number}/apps/{app_id}`
     * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1UploadReleaseRequest} media metadata or {@code null} if none
     * @param mediaContent The media HTTP content or {@code null} if none.
     * @return the request
     * @throws java.io.IOException if the initialization of the request fails
     */
    public Upload upload(java.lang.String app, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1UploadReleaseRequest content, com.google.api.client.http.AbstractInputStreamContent mediaContent) throws java.io.IOException {
      Upload result = new Upload(app, content, mediaContent);
      initialize(result);
      return result;
    }

    public class Upload extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningOperation> {

      private static final String REST_PATH = "v1/{+app}/releases:upload";

      private final java.util.regex.Pattern APP_PATTERN =
          java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+$");

      /**
       * Uploads a binary. Uploading a binary can result in a new release being created, an update to an
       * existing release, or a no-op if a release with the same binary already exists.
       *
       * Create a request for the method "media.upload".
       *
       * This request holds the parameters needed by the the firebaseappdistribution server.  After
       * setting any optional parameters, call the {@link Upload#execute()} method to invoke the remote
       * operation. <p> {@link
       * Upload#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must
       * be called to initialize this instance immediately after invoking the constructor. </p>
       *
       * @param app The name of the app resource. Format: `projects/{project_number}/apps/{app_id}`
       * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1UploadReleaseRequest}
       * @since 1.13
       */
      protected Upload(java.lang.String app, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1UploadReleaseRequest content) {
        super(FirebaseAppDistribution.this, "POST", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningOperation.class);
        this.app = com.google.api.client.util.Preconditions.checkNotNull(app, "Required parameter app must be specified.");
        if (!getSuppressPatternChecks()) {
          com.google.api.client.util.Preconditions.checkArgument(APP_PATTERN.matcher(app).matches(),
              "Parameter app must conform to the pattern " +
              "^projects/[^/]+/apps/[^/]+$");
        }
      }

      /**
       * Uploads a binary. Uploading a binary can result in a new release being created, an update to an
       * existing release, or a no-op if a release with the same binary already exists.
       *
       * Create a request for the method "media.upload".
       *
       * This request holds the parameters needed by the the firebaseappdistribution server.  After
       * setting any optional parameters, call the {@link Upload#execute()} method to invoke the remote
       * operation. <p> {@link
       * Upload#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must
       * be called to initialize this instance immediately after invoking the constructor. </p>
       *
       * <p>
       * This constructor should be used for uploading media content.
       * </p>
       *
       * @param app The name of the app resource. Format: `projects/{project_number}/apps/{app_id}`
       * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1UploadReleaseRequest} media metadata or {@code null} if none
       * @param mediaContent The media HTTP content or {@code null} if none.
       * @since 1.13
       */
      protected Upload(java.lang.String app, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1UploadReleaseRequest content, com.google.api.client.http.AbstractInputStreamContent mediaContent) {
        super(FirebaseAppDistribution.this, "POST", "/upload/" + getServicePath() + REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningOperation.class);
        this.app = com.google.api.client.util.Preconditions.checkNotNull(app, "Required parameter app must be specified.");
        initializeMediaUpload(mediaContent);
      }

      @Override
      public Upload set$Xgafv(java.lang.String $Xgafv) {
        return (Upload) super.set$Xgafv($Xgafv);
      }

      @Override
      public Upload setAccessToken(java.lang.String accessToken) {
        return (Upload) super.setAccessToken(accessToken);
      }

      @Override
      public Upload setAlt(java.lang.String alt) {
        return (Upload) super.setAlt(alt);
      }

      @Override
      public Upload setCallback(java.lang.String callback) {
        return (Upload) super.setCallback(callback);
      }

      @Override
      public Upload setFields(java.lang.String fields) {
        return (Upload) super.setFields(fields);
      }

      @Override
      public Upload setKey(java.lang.String key) {
        return (Upload) super.setKey(key);
      }

      @Override
      public Upload setOauthToken(java.lang.String oauthToken) {
        return (Upload) super.setOauthToken(oauthToken);
      }

      @Override
      public Upload setPrettyPrint(java.lang.Boolean prettyPrint) {
        return (Upload) super.setPrettyPrint(prettyPrint);
      }

      @Override
      public Upload setQuotaUser(java.lang.String quotaUser) {
        return (Upload) super.setQuotaUser(quotaUser);
      }

      @Override
      public Upload setUploadType(java.lang.String uploadType) {
        return (Upload) super.setUploadType(uploadType);
      }

      @Override
      public Upload setUploadProtocol(java.lang.String uploadProtocol) {
        return (Upload) super.setUploadProtocol(uploadProtocol);
      }

      /** The name of the app resource. Format: `projects/{project_number}/apps/{app_id}` */
      @com.google.api.client.util.Key
      private java.lang.String app;

      /** The name of the app resource. Format: `projects/{project_number}/apps/{app_id}`
       */
      public java.lang.String getApp() {
        return app;
      }

      /** The name of the app resource. Format: `projects/{project_number}/apps/{app_id}` */
      public Upload setApp(java.lang.String app) {
        if (!getSuppressPatternChecks()) {
          com.google.api.client.util.Preconditions.checkArgument(APP_PATTERN.matcher(app).matches(),
              "Parameter app must conform to the pattern " +
              "^projects/[^/]+/apps/[^/]+$");
        }
        this.app = app;
        return this;
      }

      @Override
      public Upload set(String parameterName, Object value) {
        return (Upload) super.set(parameterName, value);
      }
    }

  }

  /**
   * An accessor for creating requests from the Projects collection.
   *
   * <p>The typical use is:</p>
   * <pre>
   *   {@code FirebaseAppDistribution firebaseappdistribution = new FirebaseAppDistribution(...);}
   *   {@code FirebaseAppDistribution.Projects.List request = firebaseappdistribution.projects().list(parameters ...)}
   * </pre>
   *
   * @return the resource collection
   */
  public Projects projects() {
    return new Projects();
  }

  /**
   * The "projects" collection of methods.
   */
  public class Projects {

    /**
     * An accessor for creating requests from the Apps collection.
     *
     * <p>The typical use is:</p>
     * <pre>
     *   {@code FirebaseAppDistribution firebaseappdistribution = new FirebaseAppDistribution(...);}
     *   {@code FirebaseAppDistribution.Apps.List request = firebaseappdistribution.apps().list(parameters ...)}
     * </pre>
     *
     * @return the resource collection
     */
    public Apps apps() {
      return new Apps();
    }

    /**
     * The "apps" collection of methods.
     */
    public class Apps {

      /**
       * Gets Android App Bundle (AAB) information for a Firebase app.
       *
       * Create a request for the method "apps.getAabInfo".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link GetAabInfo#execute()} method to invoke the remote
       * operation.
       *
       * @param name Required. The name of the `AabInfo` resource to retrieve. Format:
       *        `projects/{project_number}/apps/{app_id}/aabInfo`
       * @return the request
       */
      public GetAabInfo getAabInfo(java.lang.String name) throws java.io.IOException {
        GetAabInfo result = new GetAabInfo(name);
        initialize(result);
        return result;
      }

      public class GetAabInfo extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1AabInfo> {

        private static final String REST_PATH = "v1/{+name}";

        private final java.util.regex.Pattern NAME_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/aabInfo$");

        /**
         * Gets Android App Bundle (AAB) information for a Firebase app.
         *
         * Create a request for the method "apps.getAabInfo".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link GetAabInfo#execute()} method to invoke the
         * remote operation. <p> {@link
         * GetAabInfo#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)}
         * must be called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param name Required. The name of the `AabInfo` resource to retrieve. Format:
       *        `projects/{project_number}/apps/{app_id}/aabInfo`
         * @since 1.13
         */
        protected GetAabInfo(java.lang.String name) {
          super(FirebaseAppDistribution.this, "GET", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1AabInfo.class);
          this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                "Parameter name must conform to the pattern " +
                "^projects/[^/]+/apps/[^/]+/aabInfo$");
          }
        }

        @Override
        public com.google.api.client.http.HttpResponse executeUsingHead() throws java.io.IOException {
          return super.executeUsingHead();
        }

        @Override
        public com.google.api.client.http.HttpRequest buildHttpRequestUsingHead() throws java.io.IOException {
          return super.buildHttpRequestUsingHead();
        }

        @Override
        public GetAabInfo set$Xgafv(java.lang.String $Xgafv) {
          return (GetAabInfo) super.set$Xgafv($Xgafv);
        }

        @Override
        public GetAabInfo setAccessToken(java.lang.String accessToken) {
          return (GetAabInfo) super.setAccessToken(accessToken);
        }

        @Override
        public GetAabInfo setAlt(java.lang.String alt) {
          return (GetAabInfo) super.setAlt(alt);
        }

        @Override
        public GetAabInfo setCallback(java.lang.String callback) {
          return (GetAabInfo) super.setCallback(callback);
        }

        @Override
        public GetAabInfo setFields(java.lang.String fields) {
          return (GetAabInfo) super.setFields(fields);
        }

        @Override
        public GetAabInfo setKey(java.lang.String key) {
          return (GetAabInfo) super.setKey(key);
        }

        @Override
        public GetAabInfo setOauthToken(java.lang.String oauthToken) {
          return (GetAabInfo) super.setOauthToken(oauthToken);
        }

        @Override
        public GetAabInfo setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (GetAabInfo) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public GetAabInfo setQuotaUser(java.lang.String quotaUser) {
          return (GetAabInfo) super.setQuotaUser(quotaUser);
        }

        @Override
        public GetAabInfo setUploadType(java.lang.String uploadType) {
          return (GetAabInfo) super.setUploadType(uploadType);
        }

        @Override
        public GetAabInfo setUploadProtocol(java.lang.String uploadProtocol) {
          return (GetAabInfo) super.setUploadProtocol(uploadProtocol);
        }

        /**
         * Required. The name of the `AabInfo` resource to retrieve. Format:
         * `projects/{project_number}/apps/{app_id}/aabInfo`
         */
        @com.google.api.client.util.Key
        private java.lang.String name;

        /** Required. The name of the `AabInfo` resource to retrieve. Format:
       `projects/{project_number}/apps/{app_id}/aabInfo`
         */
        public java.lang.String getName() {
          return name;
        }

        /**
         * Required. The name of the `AabInfo` resource to retrieve. Format:
         * `projects/{project_number}/apps/{app_id}/aabInfo`
         */
        public GetAabInfo setName(java.lang.String name) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                "Parameter name must conform to the pattern " +
                "^projects/[^/]+/apps/[^/]+/aabInfo$");
          }
          this.name = name;
          return this;
        }

        @Override
        public GetAabInfo set(String parameterName, Object value) {
          return (GetAabInfo) super.set(parameterName, value);
        }
      }

      /**
       * An accessor for creating requests from the Releases collection.
       *
       * <p>The typical use is:</p>
       * <pre>
       *   {@code FirebaseAppDistribution firebaseappdistribution = new FirebaseAppDistribution(...);}
       *   {@code FirebaseAppDistribution.Releases.List request = firebaseappdistribution.releases().list(parameters ...)}
       * </pre>
       *
       * @return the resource collection
       */
      public Releases releases() {
        return new Releases();
      }

      /**
       * The "releases" collection of methods.
       */
      public class Releases {

        /**
         * Deletes releases. A maximum of 100 releases can be deleted per request.
         *
         * Create a request for the method "releases.batchDelete".
         *
         * This request holds the parameters needed by the firebaseappdistribution server.  After setting
         * any optional parameters, call the {@link BatchDelete#execute()} method to invoke the remote
         * operation.
         *
         * @param parent Required. The name of the app resource, which is the parent of the release resources. Format:
         *        `projects/{project_number}/apps/{app_id}`
         * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchDeleteReleasesRequest}
         * @return the request
         */
        public BatchDelete batchDelete(java.lang.String parent, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchDeleteReleasesRequest content) throws java.io.IOException {
          BatchDelete result = new BatchDelete(parent, content);
          initialize(result);
          return result;
        }

        public class BatchDelete extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty> {

          private static final String REST_PATH = "v1/{+parent}/releases:batchDelete";

          private final java.util.regex.Pattern PARENT_PATTERN =
              java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+$");

          /**
           * Deletes releases. A maximum of 100 releases can be deleted per request.
           *
           * Create a request for the method "releases.batchDelete".
           *
           * This request holds the parameters needed by the the firebaseappdistribution server.  After
           * setting any optional parameters, call the {@link BatchDelete#execute()} method to invoke the
           * remote operation. <p> {@link
           * BatchDelete#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)}
           * must be called to initialize this instance immediately after invoking the constructor. </p>
           *
           * @param parent Required. The name of the app resource, which is the parent of the release resources. Format:
         *        `projects/{project_number}/apps/{app_id}`
           * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchDeleteReleasesRequest}
           * @since 1.13
           */
          protected BatchDelete(java.lang.String parent, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchDeleteReleasesRequest content) {
            super(FirebaseAppDistribution.this, "POST", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty.class);
            this.parent = com.google.api.client.util.Preconditions.checkNotNull(parent, "Required parameter parent must be specified.");
            if (!getSuppressPatternChecks()) {
              com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                  "Parameter parent must conform to the pattern " +
                  "^projects/[^/]+/apps/[^/]+$");
            }
          }

          @Override
          public BatchDelete set$Xgafv(java.lang.String $Xgafv) {
            return (BatchDelete) super.set$Xgafv($Xgafv);
          }

          @Override
          public BatchDelete setAccessToken(java.lang.String accessToken) {
            return (BatchDelete) super.setAccessToken(accessToken);
          }

          @Override
          public BatchDelete setAlt(java.lang.String alt) {
            return (BatchDelete) super.setAlt(alt);
          }

          @Override
          public BatchDelete setCallback(java.lang.String callback) {
            return (BatchDelete) super.setCallback(callback);
          }

          @Override
          public BatchDelete setFields(java.lang.String fields) {
            return (BatchDelete) super.setFields(fields);
          }

          @Override
          public BatchDelete setKey(java.lang.String key) {
            return (BatchDelete) super.setKey(key);
          }

          @Override
          public BatchDelete setOauthToken(java.lang.String oauthToken) {
            return (BatchDelete) super.setOauthToken(oauthToken);
          }

          @Override
          public BatchDelete setPrettyPrint(java.lang.Boolean prettyPrint) {
            return (BatchDelete) super.setPrettyPrint(prettyPrint);
          }

          @Override
          public BatchDelete setQuotaUser(java.lang.String quotaUser) {
            return (BatchDelete) super.setQuotaUser(quotaUser);
          }

          @Override
          public BatchDelete setUploadType(java.lang.String uploadType) {
            return (BatchDelete) super.setUploadType(uploadType);
          }

          @Override
          public BatchDelete setUploadProtocol(java.lang.String uploadProtocol) {
            return (BatchDelete) super.setUploadProtocol(uploadProtocol);
          }

          /**
           * Required. The name of the app resource, which is the parent of the release resources.
           * Format: `projects/{project_number}/apps/{app_id}`
           */
          @com.google.api.client.util.Key
          private java.lang.String parent;

          /** Required. The name of the app resource, which is the parent of the release resources. Format:
         `projects/{project_number}/apps/{app_id}`
           */
          public java.lang.String getParent() {
            return parent;
          }

          /**
           * Required. The name of the app resource, which is the parent of the release resources.
           * Format: `projects/{project_number}/apps/{app_id}`
           */
          public BatchDelete setParent(java.lang.String parent) {
            if (!getSuppressPatternChecks()) {
              com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                  "Parameter parent must conform to the pattern " +
                  "^projects/[^/]+/apps/[^/]+$");
            }
            this.parent = parent;
            return this;
          }

          @Override
          public BatchDelete set(String parameterName, Object value) {
            return (BatchDelete) super.set(parameterName, value);
          }
        }
        /**
         * Distributes a release to testers. This call does the following: 1. Creates testers for the
         * specified emails, if none exist. 2. Adds the testers and groups to the release. 3. Sends new
         * testers an invitation email. 4. Sends existing testers a new release email. The request will fail
         * with a `INVALID_ARGUMENT` if it contains a group that doesn't exist.
         *
         * Create a request for the method "releases.distribute".
         *
         * This request holds the parameters needed by the firebaseappdistribution server.  After setting
         * any optional parameters, call the {@link Distribute#execute()} method to invoke the remote
         * operation.
         *
         * @param name Required. The name of the release resource to distribute. Format:
         *        `projects/{project_number}/apps/{app_id}/releases/{release_id}`
         * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1DistributeReleaseRequest}
         * @return the request
         */
        public Distribute distribute(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1DistributeReleaseRequest content) throws java.io.IOException {
          Distribute result = new Distribute(name, content);
          initialize(result);
          return result;
        }

        public class Distribute extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1DistributeReleaseResponse> {

          private static final String REST_PATH = "v1/{+name}:distribute";

          private final java.util.regex.Pattern NAME_PATTERN =
              java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+$");

          /**
           * Distributes a release to testers. This call does the following: 1. Creates testers for the
           * specified emails, if none exist. 2. Adds the testers and groups to the release. 3. Sends new
           * testers an invitation email. 4. Sends existing testers a new release email. The request will
           * fail with a `INVALID_ARGUMENT` if it contains a group that doesn't exist.
           *
           * Create a request for the method "releases.distribute".
           *
           * This request holds the parameters needed by the the firebaseappdistribution server.  After
           * setting any optional parameters, call the {@link Distribute#execute()} method to invoke the
           * remote operation. <p> {@link
           * Distribute#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)}
           * must be called to initialize this instance immediately after invoking the constructor. </p>
           *
           * @param name Required. The name of the release resource to distribute. Format:
         *        `projects/{project_number}/apps/{app_id}/releases/{release_id}`
           * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1DistributeReleaseRequest}
           * @since 1.13
           */
          protected Distribute(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1DistributeReleaseRequest content) {
            super(FirebaseAppDistribution.this, "POST", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1DistributeReleaseResponse.class);
            this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
            if (!getSuppressPatternChecks()) {
              com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                  "Parameter name must conform to the pattern " +
                  "^projects/[^/]+/apps/[^/]+/releases/[^/]+$");
            }
          }

          @Override
          public Distribute set$Xgafv(java.lang.String $Xgafv) {
            return (Distribute) super.set$Xgafv($Xgafv);
          }

          @Override
          public Distribute setAccessToken(java.lang.String accessToken) {
            return (Distribute) super.setAccessToken(accessToken);
          }

          @Override
          public Distribute setAlt(java.lang.String alt) {
            return (Distribute) super.setAlt(alt);
          }

          @Override
          public Distribute setCallback(java.lang.String callback) {
            return (Distribute) super.setCallback(callback);
          }

          @Override
          public Distribute setFields(java.lang.String fields) {
            return (Distribute) super.setFields(fields);
          }

          @Override
          public Distribute setKey(java.lang.String key) {
            return (Distribute) super.setKey(key);
          }

          @Override
          public Distribute setOauthToken(java.lang.String oauthToken) {
            return (Distribute) super.setOauthToken(oauthToken);
          }

          @Override
          public Distribute setPrettyPrint(java.lang.Boolean prettyPrint) {
            return (Distribute) super.setPrettyPrint(prettyPrint);
          }

          @Override
          public Distribute setQuotaUser(java.lang.String quotaUser) {
            return (Distribute) super.setQuotaUser(quotaUser);
          }

          @Override
          public Distribute setUploadType(java.lang.String uploadType) {
            return (Distribute) super.setUploadType(uploadType);
          }

          @Override
          public Distribute setUploadProtocol(java.lang.String uploadProtocol) {
            return (Distribute) super.setUploadProtocol(uploadProtocol);
          }

          /**
           * Required. The name of the release resource to distribute. Format:
           * `projects/{project_number}/apps/{app_id}/releases/{release_id}`
           */
          @com.google.api.client.util.Key
          private java.lang.String name;

          /** Required. The name of the release resource to distribute. Format:
         `projects/{project_number}/apps/{app_id}/releases/{release_id}`
           */
          public java.lang.String getName() {
            return name;
          }

          /**
           * Required. The name of the release resource to distribute. Format:
           * `projects/{project_number}/apps/{app_id}/releases/{release_id}`
           */
          public Distribute setName(java.lang.String name) {
            if (!getSuppressPatternChecks()) {
              com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                  "Parameter name must conform to the pattern " +
                  "^projects/[^/]+/apps/[^/]+/releases/[^/]+$");
            }
            this.name = name;
            return this;
          }

          @Override
          public Distribute set(String parameterName, Object value) {
            return (Distribute) super.set(parameterName, value);
          }
        }
        /**
         * Gets a release.
         *
         * Create a request for the method "releases.get".
         *
         * This request holds the parameters needed by the firebaseappdistribution server.  After setting
         * any optional parameters, call the {@link Get#execute()} method to invoke the remote operation.
         *
         * @param name Required. The name of the release resource to retrieve. Format:
         *        projects/{project_number}/apps/{app_id}/releases/{release_id}
         * @return the request
         */
        public Get get(java.lang.String name) throws java.io.IOException {
          Get result = new Get(name);
          initialize(result);
          return result;
        }

        public class Get extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Release> {

          private static final String REST_PATH = "v1/{+name}";

          private final java.util.regex.Pattern NAME_PATTERN =
              java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+$");

          /**
           * Gets a release.
           *
           * Create a request for the method "releases.get".
           *
           * This request holds the parameters needed by the the firebaseappdistribution server.  After
           * setting any optional parameters, call the {@link Get#execute()} method to invoke the remote
           * operation. <p> {@link
           * Get#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must be
           * called to initialize this instance immediately after invoking the constructor. </p>
           *
           * @param name Required. The name of the release resource to retrieve. Format:
         *        projects/{project_number}/apps/{app_id}/releases/{release_id}
           * @since 1.13
           */
          protected Get(java.lang.String name) {
            super(FirebaseAppDistribution.this, "GET", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Release.class);
            this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
            if (!getSuppressPatternChecks()) {
              com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                  "Parameter name must conform to the pattern " +
                  "^projects/[^/]+/apps/[^/]+/releases/[^/]+$");
            }
          }

          @Override
          public com.google.api.client.http.HttpResponse executeUsingHead() throws java.io.IOException {
            return super.executeUsingHead();
          }

          @Override
          public com.google.api.client.http.HttpRequest buildHttpRequestUsingHead() throws java.io.IOException {
            return super.buildHttpRequestUsingHead();
          }

          @Override
          public Get set$Xgafv(java.lang.String $Xgafv) {
            return (Get) super.set$Xgafv($Xgafv);
          }

          @Override
          public Get setAccessToken(java.lang.String accessToken) {
            return (Get) super.setAccessToken(accessToken);
          }

          @Override
          public Get setAlt(java.lang.String alt) {
            return (Get) super.setAlt(alt);
          }

          @Override
          public Get setCallback(java.lang.String callback) {
            return (Get) super.setCallback(callback);
          }

          @Override
          public Get setFields(java.lang.String fields) {
            return (Get) super.setFields(fields);
          }

          @Override
          public Get setKey(java.lang.String key) {
            return (Get) super.setKey(key);
          }

          @Override
          public Get setOauthToken(java.lang.String oauthToken) {
            return (Get) super.setOauthToken(oauthToken);
          }

          @Override
          public Get setPrettyPrint(java.lang.Boolean prettyPrint) {
            return (Get) super.setPrettyPrint(prettyPrint);
          }

          @Override
          public Get setQuotaUser(java.lang.String quotaUser) {
            return (Get) super.setQuotaUser(quotaUser);
          }

          @Override
          public Get setUploadType(java.lang.String uploadType) {
            return (Get) super.setUploadType(uploadType);
          }

          @Override
          public Get setUploadProtocol(java.lang.String uploadProtocol) {
            return (Get) super.setUploadProtocol(uploadProtocol);
          }

          /**
           * Required. The name of the release resource to retrieve. Format:
           * projects/{project_number}/apps/{app_id}/releases/{release_id}
           */
          @com.google.api.client.util.Key
          private java.lang.String name;

          /** Required. The name of the release resource to retrieve. Format:
         projects/{project_number}/apps/{app_id}/releases/{release_id}
           */
          public java.lang.String getName() {
            return name;
          }

          /**
           * Required. The name of the release resource to retrieve. Format:
           * projects/{project_number}/apps/{app_id}/releases/{release_id}
           */
          public Get setName(java.lang.String name) {
            if (!getSuppressPatternChecks()) {
              com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                  "Parameter name must conform to the pattern " +
                  "^projects/[^/]+/apps/[^/]+/releases/[^/]+$");
            }
            this.name = name;
            return this;
          }

          @Override
          public Get set(String parameterName, Object value) {
            return (Get) super.set(parameterName, value);
          }
        }
        /**
         * Lists releases. By default, sorts by `createTime` in descending order.
         *
         * Create a request for the method "releases.list".
         *
         * This request holds the parameters needed by the firebaseappdistribution server.  After setting
         * any optional parameters, call the {@link List#execute()} method to invoke the remote operation.
         *
         * @param parent Required. The name of the app resource, which is the parent of the release resources. Format:
         *        `projects/{project_number}/apps/{app_id}`
         * @return the request
         */
        public List list(java.lang.String parent) throws java.io.IOException {
          List result = new List(parent);
          initialize(result);
          return result;
        }

        public class List extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1ListReleasesResponse> {

          private static final String REST_PATH = "v1/{+parent}/releases";

          private final java.util.regex.Pattern PARENT_PATTERN =
              java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+$");

          /**
           * Lists releases. By default, sorts by `createTime` in descending order.
           *
           * Create a request for the method "releases.list".
           *
           * This request holds the parameters needed by the the firebaseappdistribution server.  After
           * setting any optional parameters, call the {@link List#execute()} method to invoke the remote
           * operation. <p> {@link
           * List#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must be
           * called to initialize this instance immediately after invoking the constructor. </p>
           *
           * @param parent Required. The name of the app resource, which is the parent of the release resources. Format:
         *        `projects/{project_number}/apps/{app_id}`
           * @since 1.13
           */
          protected List(java.lang.String parent) {
            super(FirebaseAppDistribution.this, "GET", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1ListReleasesResponse.class);
            this.parent = com.google.api.client.util.Preconditions.checkNotNull(parent, "Required parameter parent must be specified.");
            if (!getSuppressPatternChecks()) {
              com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                  "Parameter parent must conform to the pattern " +
                  "^projects/[^/]+/apps/[^/]+$");
            }
          }

          @Override
          public com.google.api.client.http.HttpResponse executeUsingHead() throws java.io.IOException {
            return super.executeUsingHead();
          }

          @Override
          public com.google.api.client.http.HttpRequest buildHttpRequestUsingHead() throws java.io.IOException {
            return super.buildHttpRequestUsingHead();
          }

          @Override
          public List set$Xgafv(java.lang.String $Xgafv) {
            return (List) super.set$Xgafv($Xgafv);
          }

          @Override
          public List setAccessToken(java.lang.String accessToken) {
            return (List) super.setAccessToken(accessToken);
          }

          @Override
          public List setAlt(java.lang.String alt) {
            return (List) super.setAlt(alt);
          }

          @Override
          public List setCallback(java.lang.String callback) {
            return (List) super.setCallback(callback);
          }

          @Override
          public List setFields(java.lang.String fields) {
            return (List) super.setFields(fields);
          }

          @Override
          public List setKey(java.lang.String key) {
            return (List) super.setKey(key);
          }

          @Override
          public List setOauthToken(java.lang.String oauthToken) {
            return (List) super.setOauthToken(oauthToken);
          }

          @Override
          public List setPrettyPrint(java.lang.Boolean prettyPrint) {
            return (List) super.setPrettyPrint(prettyPrint);
          }

          @Override
          public List setQuotaUser(java.lang.String quotaUser) {
            return (List) super.setQuotaUser(quotaUser);
          }

          @Override
          public List setUploadType(java.lang.String uploadType) {
            return (List) super.setUploadType(uploadType);
          }

          @Override
          public List setUploadProtocol(java.lang.String uploadProtocol) {
            return (List) super.setUploadProtocol(uploadProtocol);
          }

          /**
           * Required. The name of the app resource, which is the parent of the release resources.
           * Format: `projects/{project_number}/apps/{app_id}`
           */
          @com.google.api.client.util.Key
          private java.lang.String parent;

          /** Required. The name of the app resource, which is the parent of the release resources. Format:
         `projects/{project_number}/apps/{app_id}`
           */
          public java.lang.String getParent() {
            return parent;
          }

          /**
           * Required. The name of the app resource, which is the parent of the release resources.
           * Format: `projects/{project_number}/apps/{app_id}`
           */
          public List setParent(java.lang.String parent) {
            if (!getSuppressPatternChecks()) {
              com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                  "Parameter parent must conform to the pattern " +
                  "^projects/[^/]+/apps/[^/]+$");
            }
            this.parent = parent;
            return this;
          }

          /**
           * The expression to filter releases listed in the response. To learn more about
           * filtering, refer to [Google's AIP-160 standard](http://aip.dev/160). Supported fields:
           * - `releaseNotes.text` supports `=` (can contain a wildcard character (`*`) at the
           * beginning or end of the string) - `createTime` supports `<`, `<=`, `>` and `>=`, and
           * expects an RFC-3339 formatted string Examples: - `createTime <=
           * "2021-09-08T00:00:00+04:00"` - `releaseNotes.text="fixes" AND createTime >=
           * "2021-09-08T00:00:00.0Z"` - `releaseNotes.text="*v1.0.0-rc*"`
           */
          @com.google.api.client.util.Key
          private java.lang.String filter;

          /** The expression to filter releases listed in the response. To learn more about filtering, refer to
         [Google's AIP-160 standard](http://aip.dev/160). Supported fields: - `releaseNotes.text` supports
         `=` (can contain a wildcard character (`*`) at the beginning or end of the string) - `createTime`
         supports `<`, `<=`, `>` and `>=`, and expects an RFC-3339 formatted string Examples: - `createTime
         <= "2021-09-08T00:00:00+04:00"` - `releaseNotes.text="fixes" AND createTime >=
         "2021-09-08T00:00:00.0Z"` - `releaseNotes.text="*v1.0.0-rc*"`
           */
          public java.lang.String getFilter() {
            return filter;
          }

          /**
           * The expression to filter releases listed in the response. To learn more about
           * filtering, refer to [Google's AIP-160 standard](http://aip.dev/160). Supported fields:
           * - `releaseNotes.text` supports `=` (can contain a wildcard character (`*`) at the
           * beginning or end of the string) - `createTime` supports `<`, `<=`, `>` and `>=`, and
           * expects an RFC-3339 formatted string Examples: - `createTime <=
           * "2021-09-08T00:00:00+04:00"` - `releaseNotes.text="fixes" AND createTime >=
           * "2021-09-08T00:00:00.0Z"` - `releaseNotes.text="*v1.0.0-rc*"`
           */
          public List setFilter(java.lang.String filter) {
            this.filter = filter;
            return this;
          }

          /**
           * The fields used to order releases. Supported fields: - `createTime` To specify
           * descending order for a field, append a "desc" suffix, for example, `createTime desc`.
           * If this parameter is not set, releases are ordered by `createTime` in descending order.
           */
          @com.google.api.client.util.Key
          private java.lang.String orderBy;

          /** The fields used to order releases. Supported fields: - `createTime` To specify descending order for
         a field, append a "desc" suffix, for example, `createTime desc`. If this parameter is not set,
         releases are ordered by `createTime` in descending order.
           */
          public java.lang.String getOrderBy() {
            return orderBy;
          }

          /**
           * The fields used to order releases. Supported fields: - `createTime` To specify
           * descending order for a field, append a "desc" suffix, for example, `createTime desc`.
           * If this parameter is not set, releases are ordered by `createTime` in descending order.
           */
          public List setOrderBy(java.lang.String orderBy) {
            this.orderBy = orderBy;
            return this;
          }

          /**
           * The maximum number of releases to return. The service may return fewer than this value.
           * The valid range is [1-100]; If unspecified (0), at most 25 releases are returned.
           * Values above 100 are coerced to 100.
           */
          @com.google.api.client.util.Key
          private java.lang.Integer pageSize;

          /** The maximum number of releases to return. The service may return fewer than this value. The valid
         range is [1-100]; If unspecified (0), at most 25 releases are returned. Values above 100 are
         coerced to 100.
           */
          public java.lang.Integer getPageSize() {
            return pageSize;
          }

          /**
           * The maximum number of releases to return. The service may return fewer than this value.
           * The valid range is [1-100]; If unspecified (0), at most 25 releases are returned.
           * Values above 100 are coerced to 100.
           */
          public List setPageSize(java.lang.Integer pageSize) {
            this.pageSize = pageSize;
            return this;
          }

          /**
           * A page token, received from a previous `ListReleases` call. Provide this to retrieve
           * the subsequent page. When paginating, all other parameters provided to `ListReleases`
           * must match the call that provided the page token.
           */
          @com.google.api.client.util.Key
          private java.lang.String pageToken;

          /** A page token, received from a previous `ListReleases` call. Provide this to retrieve the subsequent
         page. When paginating, all other parameters provided to `ListReleases` must match the call that
         provided the page token.
           */
          public java.lang.String getPageToken() {
            return pageToken;
          }

          /**
           * A page token, received from a previous `ListReleases` call. Provide this to retrieve
           * the subsequent page. When paginating, all other parameters provided to `ListReleases`
           * must match the call that provided the page token.
           */
          public List setPageToken(java.lang.String pageToken) {
            this.pageToken = pageToken;
            return this;
          }

          @Override
          public List set(String parameterName, Object value) {
            return (List) super.set(parameterName, value);
          }
        }
        /**
         * Updates a release.
         *
         * Create a request for the method "releases.patch".
         *
         * This request holds the parameters needed by the firebaseappdistribution server.  After setting
         * any optional parameters, call the {@link Patch#execute()} method to invoke the remote operation.
         *
         * @param name The name of the release resource. Format:
         *        `projects/{project_number}/apps/{app_id}/releases/{release_id}`
         * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Release}
         * @return the request
         */
        public Patch patch(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Release content) throws java.io.IOException {
          Patch result = new Patch(name, content);
          initialize(result);
          return result;
        }

        public class Patch extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Release> {

          private static final String REST_PATH = "v1/{+name}";

          private final java.util.regex.Pattern NAME_PATTERN =
              java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+$");

          /**
           * Updates a release.
           *
           * Create a request for the method "releases.patch".
           *
           * This request holds the parameters needed by the the firebaseappdistribution server.  After
           * setting any optional parameters, call the {@link Patch#execute()} method to invoke the remote
           * operation. <p> {@link
           * Patch#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must
           * be called to initialize this instance immediately after invoking the constructor. </p>
           *
           * @param name The name of the release resource. Format:
         *        `projects/{project_number}/apps/{app_id}/releases/{release_id}`
           * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Release}
           * @since 1.13
           */
          protected Patch(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Release content) {
            super(FirebaseAppDistribution.this, "PATCH", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Release.class);
            this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
            if (!getSuppressPatternChecks()) {
              com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                  "Parameter name must conform to the pattern " +
                  "^projects/[^/]+/apps/[^/]+/releases/[^/]+$");
            }
          }

          @Override
          public Patch set$Xgafv(java.lang.String $Xgafv) {
            return (Patch) super.set$Xgafv($Xgafv);
          }

          @Override
          public Patch setAccessToken(java.lang.String accessToken) {
            return (Patch) super.setAccessToken(accessToken);
          }

          @Override
          public Patch setAlt(java.lang.String alt) {
            return (Patch) super.setAlt(alt);
          }

          @Override
          public Patch setCallback(java.lang.String callback) {
            return (Patch) super.setCallback(callback);
          }

          @Override
          public Patch setFields(java.lang.String fields) {
            return (Patch) super.setFields(fields);
          }

          @Override
          public Patch setKey(java.lang.String key) {
            return (Patch) super.setKey(key);
          }

          @Override
          public Patch setOauthToken(java.lang.String oauthToken) {
            return (Patch) super.setOauthToken(oauthToken);
          }

          @Override
          public Patch setPrettyPrint(java.lang.Boolean prettyPrint) {
            return (Patch) super.setPrettyPrint(prettyPrint);
          }

          @Override
          public Patch setQuotaUser(java.lang.String quotaUser) {
            return (Patch) super.setQuotaUser(quotaUser);
          }

          @Override
          public Patch setUploadType(java.lang.String uploadType) {
            return (Patch) super.setUploadType(uploadType);
          }

          @Override
          public Patch setUploadProtocol(java.lang.String uploadProtocol) {
            return (Patch) super.setUploadProtocol(uploadProtocol);
          }

          /**
           * The name of the release resource. Format:
           * `projects/{project_number}/apps/{app_id}/releases/{release_id}`
           */
          @com.google.api.client.util.Key
          private java.lang.String name;

          /** The name of the release resource. Format:
         `projects/{project_number}/apps/{app_id}/releases/{release_id}`
           */
          public java.lang.String getName() {
            return name;
          }

          /**
           * The name of the release resource. Format:
           * `projects/{project_number}/apps/{app_id}/releases/{release_id}`
           */
          public Patch setName(java.lang.String name) {
            if (!getSuppressPatternChecks()) {
              com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                  "Parameter name must conform to the pattern " +
                  "^projects/[^/]+/apps/[^/]+/releases/[^/]+$");
            }
            this.name = name;
            return this;
          }

          /** The list of fields to update. */
          @com.google.api.client.util.Key
          private String updateMask;

          /** The list of fields to update.
           */
          public String getUpdateMask() {
            return updateMask;
          }

          /** The list of fields to update. */
          public Patch setUpdateMask(String updateMask) {
            this.updateMask = updateMask;
            return this;
          }

          @Override
          public Patch set(String parameterName, Object value) {
            return (Patch) super.set(parameterName, value);
          }
        }

        /**
         * An accessor for creating requests from the FeedbackReports collection.
         *
         * <p>The typical use is:</p>
         * <pre>
         *   {@code FirebaseAppDistribution firebaseappdistribution = new FirebaseAppDistribution(...);}
         *   {@code FirebaseAppDistribution.FeedbackReports.List request = firebaseappdistribution.feedbackReports().list(parameters ...)}
         * </pre>
         *
         * @return the resource collection
         */
        public FeedbackReports feedbackReports() {
          return new FeedbackReports();
        }

        /**
         * The "feedbackReports" collection of methods.
         */
        public class FeedbackReports {

          /**
           * Deletes a feedback report.
           *
           * Create a request for the method "feedbackReports.delete".
           *
           * This request holds the parameters needed by the firebaseappdistribution server.  After setting
           * any optional parameters, call the {@link Delete#execute()} method to invoke the remote operation.
           *
           * @param name Required. The name of the feedback report to delete. Format:
           *        projects/{project_number}/apps/{app}/releases/{release}/feedbackReports/{feedback_report}
           * @return the request
           */
          public Delete delete(java.lang.String name) throws java.io.IOException {
            Delete result = new Delete(name);
            initialize(result);
            return result;
          }

          public class Delete extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty> {

            private static final String REST_PATH = "v1/{+name}";

            private final java.util.regex.Pattern NAME_PATTERN =
                java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+/feedbackReports/[^/]+$");

            /**
             * Deletes a feedback report.
             *
             * Create a request for the method "feedbackReports.delete".
             *
             * This request holds the parameters needed by the the firebaseappdistribution server.  After
             * setting any optional parameters, call the {@link Delete#execute()} method to invoke the remote
             * operation. <p> {@link
             * Delete#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must
             * be called to initialize this instance immediately after invoking the constructor. </p>
             *
             * @param name Required. The name of the feedback report to delete. Format:
           *        projects/{project_number}/apps/{app}/releases/{release}/feedbackReports/{feedback_report}
             * @since 1.13
             */
            protected Delete(java.lang.String name) {
              super(FirebaseAppDistribution.this, "DELETE", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty.class);
              this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/feedbackReports/[^/]+$");
              }
            }

            @Override
            public Delete set$Xgafv(java.lang.String $Xgafv) {
              return (Delete) super.set$Xgafv($Xgafv);
            }

            @Override
            public Delete setAccessToken(java.lang.String accessToken) {
              return (Delete) super.setAccessToken(accessToken);
            }

            @Override
            public Delete setAlt(java.lang.String alt) {
              return (Delete) super.setAlt(alt);
            }

            @Override
            public Delete setCallback(java.lang.String callback) {
              return (Delete) super.setCallback(callback);
            }

            @Override
            public Delete setFields(java.lang.String fields) {
              return (Delete) super.setFields(fields);
            }

            @Override
            public Delete setKey(java.lang.String key) {
              return (Delete) super.setKey(key);
            }

            @Override
            public Delete setOauthToken(java.lang.String oauthToken) {
              return (Delete) super.setOauthToken(oauthToken);
            }

            @Override
            public Delete setPrettyPrint(java.lang.Boolean prettyPrint) {
              return (Delete) super.setPrettyPrint(prettyPrint);
            }

            @Override
            public Delete setQuotaUser(java.lang.String quotaUser) {
              return (Delete) super.setQuotaUser(quotaUser);
            }

            @Override
            public Delete setUploadType(java.lang.String uploadType) {
              return (Delete) super.setUploadType(uploadType);
            }

            @Override
            public Delete setUploadProtocol(java.lang.String uploadProtocol) {
              return (Delete) super.setUploadProtocol(uploadProtocol);
            }

            /**
             * Required. The name of the feedback report to delete. Format: projects/{project_number
             * }/apps/{app}/releases/{release}/feedbackReports/{feedback_report}
             */
            @com.google.api.client.util.Key
            private java.lang.String name;

            /** Required. The name of the feedback report to delete. Format:
           projects/{project_number}/apps/{app}/releases/{release}/feedbackReports/{feedback_report}
             */
            public java.lang.String getName() {
              return name;
            }

            /**
             * Required. The name of the feedback report to delete. Format: projects/{project_number
             * }/apps/{app}/releases/{release}/feedbackReports/{feedback_report}
             */
            public Delete setName(java.lang.String name) {
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/feedbackReports/[^/]+$");
              }
              this.name = name;
              return this;
            }

            @Override
            public Delete set(String parameterName, Object value) {
              return (Delete) super.set(parameterName, value);
            }
          }
          /**
           * Gets a feedback report.
           *
           * Create a request for the method "feedbackReports.get".
           *
           * This request holds the parameters needed by the firebaseappdistribution server.  After setting
           * any optional parameters, call the {@link Get#execute()} method to invoke the remote operation.
           *
           * @param name Required. The name of the feedback report to retrieve. Format:
           *        projects/{project_number}/apps/{app}/releases/{release}/feedbackReports/{feedback_report}
           * @return the request
           */
          public Get get(java.lang.String name) throws java.io.IOException {
            Get result = new Get(name);
            initialize(result);
            return result;
          }

          public class Get extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1FeedbackReport> {

            private static final String REST_PATH = "v1/{+name}";

            private final java.util.regex.Pattern NAME_PATTERN =
                java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+/feedbackReports/[^/]+$");

            /**
             * Gets a feedback report.
             *
             * Create a request for the method "feedbackReports.get".
             *
             * This request holds the parameters needed by the the firebaseappdistribution server.  After
             * setting any optional parameters, call the {@link Get#execute()} method to invoke the remote
             * operation. <p> {@link
             * Get#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must be
             * called to initialize this instance immediately after invoking the constructor. </p>
             *
             * @param name Required. The name of the feedback report to retrieve. Format:
           *        projects/{project_number}/apps/{app}/releases/{release}/feedbackReports/{feedback_report}
             * @since 1.13
             */
            protected Get(java.lang.String name) {
              super(FirebaseAppDistribution.this, "GET", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1FeedbackReport.class);
              this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/feedbackReports/[^/]+$");
              }
            }

            @Override
            public com.google.api.client.http.HttpResponse executeUsingHead() throws java.io.IOException {
              return super.executeUsingHead();
            }

            @Override
            public com.google.api.client.http.HttpRequest buildHttpRequestUsingHead() throws java.io.IOException {
              return super.buildHttpRequestUsingHead();
            }

            @Override
            public Get set$Xgafv(java.lang.String $Xgafv) {
              return (Get) super.set$Xgafv($Xgafv);
            }

            @Override
            public Get setAccessToken(java.lang.String accessToken) {
              return (Get) super.setAccessToken(accessToken);
            }

            @Override
            public Get setAlt(java.lang.String alt) {
              return (Get) super.setAlt(alt);
            }

            @Override
            public Get setCallback(java.lang.String callback) {
              return (Get) super.setCallback(callback);
            }

            @Override
            public Get setFields(java.lang.String fields) {
              return (Get) super.setFields(fields);
            }

            @Override
            public Get setKey(java.lang.String key) {
              return (Get) super.setKey(key);
            }

            @Override
            public Get setOauthToken(java.lang.String oauthToken) {
              return (Get) super.setOauthToken(oauthToken);
            }

            @Override
            public Get setPrettyPrint(java.lang.Boolean prettyPrint) {
              return (Get) super.setPrettyPrint(prettyPrint);
            }

            @Override
            public Get setQuotaUser(java.lang.String quotaUser) {
              return (Get) super.setQuotaUser(quotaUser);
            }

            @Override
            public Get setUploadType(java.lang.String uploadType) {
              return (Get) super.setUploadType(uploadType);
            }

            @Override
            public Get setUploadProtocol(java.lang.String uploadProtocol) {
              return (Get) super.setUploadProtocol(uploadProtocol);
            }

            /**
             * Required. The name of the feedback report to retrieve. Format: projects/{project_numb
             * er}/apps/{app}/releases/{release}/feedbackReports/{feedback_report}
             */
            @com.google.api.client.util.Key
            private java.lang.String name;

            /** Required. The name of the feedback report to retrieve. Format:
           projects/{project_number}/apps/{app}/releases/{release}/feedbackReports/{feedback_report}
             */
            public java.lang.String getName() {
              return name;
            }

            /**
             * Required. The name of the feedback report to retrieve. Format: projects/{project_numb
             * er}/apps/{app}/releases/{release}/feedbackReports/{feedback_report}
             */
            public Get setName(java.lang.String name) {
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/feedbackReports/[^/]+$");
              }
              this.name = name;
              return this;
            }

            @Override
            public Get set(String parameterName, Object value) {
              return (Get) super.set(parameterName, value);
            }
          }
          /**
           * Lists feedback reports. By default, sorts by `createTime` in descending order.
           *
           * Create a request for the method "feedbackReports.list".
           *
           * This request holds the parameters needed by the firebaseappdistribution server.  After setting
           * any optional parameters, call the {@link List#execute()} method to invoke the remote operation.
           *
           * @param parent Required. The name of the release resource, which is the parent of the feedback report resources.
           *        Format: `projects/{project_number}/apps/{app}/releases/{release}`
           * @return the request
           */
          public List list(java.lang.String parent) throws java.io.IOException {
            List result = new List(parent);
            initialize(result);
            return result;
          }

          public class List extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1ListFeedbackReportsResponse> {

            private static final String REST_PATH = "v1/{+parent}/feedbackReports";

            private final java.util.regex.Pattern PARENT_PATTERN =
                java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+$");

            /**
             * Lists feedback reports. By default, sorts by `createTime` in descending order.
             *
             * Create a request for the method "feedbackReports.list".
             *
             * This request holds the parameters needed by the the firebaseappdistribution server.  After
             * setting any optional parameters, call the {@link List#execute()} method to invoke the remote
             * operation. <p> {@link
             * List#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must be
             * called to initialize this instance immediately after invoking the constructor. </p>
             *
             * @param parent Required. The name of the release resource, which is the parent of the feedback report resources.
           *        Format: `projects/{project_number}/apps/{app}/releases/{release}`
             * @since 1.13
             */
            protected List(java.lang.String parent) {
              super(FirebaseAppDistribution.this, "GET", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1ListFeedbackReportsResponse.class);
              this.parent = com.google.api.client.util.Preconditions.checkNotNull(parent, "Required parameter parent must be specified.");
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                    "Parameter parent must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+$");
              }
            }

            @Override
            public com.google.api.client.http.HttpResponse executeUsingHead() throws java.io.IOException {
              return super.executeUsingHead();
            }

            @Override
            public com.google.api.client.http.HttpRequest buildHttpRequestUsingHead() throws java.io.IOException {
              return super.buildHttpRequestUsingHead();
            }

            @Override
            public List set$Xgafv(java.lang.String $Xgafv) {
              return (List) super.set$Xgafv($Xgafv);
            }

            @Override
            public List setAccessToken(java.lang.String accessToken) {
              return (List) super.setAccessToken(accessToken);
            }

            @Override
            public List setAlt(java.lang.String alt) {
              return (List) super.setAlt(alt);
            }

            @Override
            public List setCallback(java.lang.String callback) {
              return (List) super.setCallback(callback);
            }

            @Override
            public List setFields(java.lang.String fields) {
              return (List) super.setFields(fields);
            }

            @Override
            public List setKey(java.lang.String key) {
              return (List) super.setKey(key);
            }

            @Override
            public List setOauthToken(java.lang.String oauthToken) {
              return (List) super.setOauthToken(oauthToken);
            }

            @Override
            public List setPrettyPrint(java.lang.Boolean prettyPrint) {
              return (List) super.setPrettyPrint(prettyPrint);
            }

            @Override
            public List setQuotaUser(java.lang.String quotaUser) {
              return (List) super.setQuotaUser(quotaUser);
            }

            @Override
            public List setUploadType(java.lang.String uploadType) {
              return (List) super.setUploadType(uploadType);
            }

            @Override
            public List setUploadProtocol(java.lang.String uploadProtocol) {
              return (List) super.setUploadProtocol(uploadProtocol);
            }

            /**
             * Required. The name of the release resource, which is the parent of the feedback
             * report resources. Format: `projects/{project_number}/apps/{app}/releases/{release}`
             */
            @com.google.api.client.util.Key
            private java.lang.String parent;

            /** Required. The name of the release resource, which is the parent of the feedback report resources.
           Format: `projects/{project_number}/apps/{app}/releases/{release}`
             */
            public java.lang.String getParent() {
              return parent;
            }

            /**
             * Required. The name of the release resource, which is the parent of the feedback
             * report resources. Format: `projects/{project_number}/apps/{app}/releases/{release}`
             */
            public List setParent(java.lang.String parent) {
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                    "Parameter parent must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+$");
              }
              this.parent = parent;
              return this;
            }

            /**
             * The maximum number of feedback reports to return. The service may return fewer than
             * this value. The valid range is [1-100]; If unspecified (0), at most 25 feedback
             * reports are returned. Values above 100 are coerced to 100.
             */
            @com.google.api.client.util.Key
            private java.lang.Integer pageSize;

            /** The maximum number of feedback reports to return. The service may return fewer than this value. The
           valid range is [1-100]; If unspecified (0), at most 25 feedback reports are returned. Values above
           100 are coerced to 100.
             */
            public java.lang.Integer getPageSize() {
              return pageSize;
            }

            /**
             * The maximum number of feedback reports to return. The service may return fewer than
             * this value. The valid range is [1-100]; If unspecified (0), at most 25 feedback
             * reports are returned. Values above 100 are coerced to 100.
             */
            public List setPageSize(java.lang.Integer pageSize) {
              this.pageSize = pageSize;
              return this;
            }

            /**
             * A page token, received from a previous `ListFeedbackReports` call. Provide this to
             * retrieve the subsequent page. When paginating, all other parameters provided to
             * `ListFeedbackReports` must match the call that provided the page token.
             */
            @com.google.api.client.util.Key
            private java.lang.String pageToken;

            /** A page token, received from a previous `ListFeedbackReports` call. Provide this to retrieve the
           subsequent page. When paginating, all other parameters provided to `ListFeedbackReports` must match
           the call that provided the page token.
             */
            public java.lang.String getPageToken() {
              return pageToken;
            }

            /**
             * A page token, received from a previous `ListFeedbackReports` call. Provide this to
             * retrieve the subsequent page. When paginating, all other parameters provided to
             * `ListFeedbackReports` must match the call that provided the page token.
             */
            public List setPageToken(java.lang.String pageToken) {
              this.pageToken = pageToken;
              return this;
            }

            @Override
            public List set(String parameterName, Object value) {
              return (List) super.set(parameterName, value);
            }
          }

        }
        /**
         * An accessor for creating requests from the Operations collection.
         *
         * <p>The typical use is:</p>
         * <pre>
         *   {@code FirebaseAppDistribution firebaseappdistribution = new FirebaseAppDistribution(...);}
         *   {@code FirebaseAppDistribution.Operations.List request = firebaseappdistribution.operations().list(parameters ...)}
         * </pre>
         *
         * @return the resource collection
         */
        public Operations operations() {
          return new Operations();
        }

        /**
         * The "operations" collection of methods.
         */
        public class Operations {

          /**
           * Starts asynchronous cancellation on a long-running operation. The server makes a best effort to
           * cancel the operation, but success is not guaranteed. If the server doesn't support this method,
           * it returns `google.rpc.Code.UNIMPLEMENTED`. Clients can use Operations.GetOperation or other
           * methods to check whether the cancellation succeeded or whether the operation completed despite
           * cancellation. On successful cancellation, the operation is not deleted; instead, it becomes an
           * operation with an Operation.error value with a google.rpc.Status.code of 1, corresponding to
           * `Code.CANCELLED`.
           *
           * Create a request for the method "operations.cancel".
           *
           * This request holds the parameters needed by the firebaseappdistribution server.  After setting
           * any optional parameters, call the {@link Cancel#execute()} method to invoke the remote operation.
           *
           * @param name The name of the operation resource to be cancelled.
           * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningCancelOperationRequest}
           * @return the request
           */
          public Cancel cancel(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningCancelOperationRequest content) throws java.io.IOException {
            Cancel result = new Cancel(name, content);
            initialize(result);
            return result;
          }

          public class Cancel extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty> {

            private static final String REST_PATH = "v1/{+name}:cancel";

            private final java.util.regex.Pattern NAME_PATTERN =
                java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");

            /**
             * Starts asynchronous cancellation on a long-running operation. The server makes a best effort to
             * cancel the operation, but success is not guaranteed. If the server doesn't support this method,
             * it returns `google.rpc.Code.UNIMPLEMENTED`. Clients can use Operations.GetOperation or other
             * methods to check whether the cancellation succeeded or whether the operation completed despite
             * cancellation. On successful cancellation, the operation is not deleted; instead, it becomes an
             * operation with an Operation.error value with a google.rpc.Status.code of 1, corresponding to
             * `Code.CANCELLED`.
             *
             * Create a request for the method "operations.cancel".
             *
             * This request holds the parameters needed by the the firebaseappdistribution server.  After
             * setting any optional parameters, call the {@link Cancel#execute()} method to invoke the remote
             * operation. <p> {@link
             * Cancel#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must
             * be called to initialize this instance immediately after invoking the constructor. </p>
             *
             * @param name The name of the operation resource to be cancelled.
             * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningCancelOperationRequest}
             * @since 1.13
             */
            protected Cancel(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningCancelOperationRequest content) {
              super(FirebaseAppDistribution.this, "POST", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty.class);
              this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");
              }
            }

            @Override
            public Cancel set$Xgafv(java.lang.String $Xgafv) {
              return (Cancel) super.set$Xgafv($Xgafv);
            }

            @Override
            public Cancel setAccessToken(java.lang.String accessToken) {
              return (Cancel) super.setAccessToken(accessToken);
            }

            @Override
            public Cancel setAlt(java.lang.String alt) {
              return (Cancel) super.setAlt(alt);
            }

            @Override
            public Cancel setCallback(java.lang.String callback) {
              return (Cancel) super.setCallback(callback);
            }

            @Override
            public Cancel setFields(java.lang.String fields) {
              return (Cancel) super.setFields(fields);
            }

            @Override
            public Cancel setKey(java.lang.String key) {
              return (Cancel) super.setKey(key);
            }

            @Override
            public Cancel setOauthToken(java.lang.String oauthToken) {
              return (Cancel) super.setOauthToken(oauthToken);
            }

            @Override
            public Cancel setPrettyPrint(java.lang.Boolean prettyPrint) {
              return (Cancel) super.setPrettyPrint(prettyPrint);
            }

            @Override
            public Cancel setQuotaUser(java.lang.String quotaUser) {
              return (Cancel) super.setQuotaUser(quotaUser);
            }

            @Override
            public Cancel setUploadType(java.lang.String uploadType) {
              return (Cancel) super.setUploadType(uploadType);
            }

            @Override
            public Cancel setUploadProtocol(java.lang.String uploadProtocol) {
              return (Cancel) super.setUploadProtocol(uploadProtocol);
            }

            /** The name of the operation resource to be cancelled. */
            @com.google.api.client.util.Key
            private java.lang.String name;

            /** The name of the operation resource to be cancelled.
             */
            public java.lang.String getName() {
              return name;
            }

            /** The name of the operation resource to be cancelled. */
            public Cancel setName(java.lang.String name) {
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");
              }
              this.name = name;
              return this;
            }

            @Override
            public Cancel set(String parameterName, Object value) {
              return (Cancel) super.set(parameterName, value);
            }
          }
          /**
           * Deletes a long-running operation. This method indicates that the client is no longer interested
           * in the operation result. It does not cancel the operation. If the server doesn't support this
           * method, it returns `google.rpc.Code.UNIMPLEMENTED`.
           *
           * Create a request for the method "operations.delete".
           *
           * This request holds the parameters needed by the firebaseappdistribution server.  After setting
           * any optional parameters, call the {@link Delete#execute()} method to invoke the remote operation.
           *
           * @param name The name of the operation resource to be deleted.
           * @return the request
           */
          public Delete delete(java.lang.String name) throws java.io.IOException {
            Delete result = new Delete(name);
            initialize(result);
            return result;
          }

          public class Delete extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty> {

            private static final String REST_PATH = "v1/{+name}";

            private final java.util.regex.Pattern NAME_PATTERN =
                java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");

            /**
             * Deletes a long-running operation. This method indicates that the client is no longer interested
             * in the operation result. It does not cancel the operation. If the server doesn't support this
             * method, it returns `google.rpc.Code.UNIMPLEMENTED`.
             *
             * Create a request for the method "operations.delete".
             *
             * This request holds the parameters needed by the the firebaseappdistribution server.  After
             * setting any optional parameters, call the {@link Delete#execute()} method to invoke the remote
             * operation. <p> {@link
             * Delete#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must
             * be called to initialize this instance immediately after invoking the constructor. </p>
             *
             * @param name The name of the operation resource to be deleted.
             * @since 1.13
             */
            protected Delete(java.lang.String name) {
              super(FirebaseAppDistribution.this, "DELETE", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty.class);
              this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");
              }
            }

            @Override
            public Delete set$Xgafv(java.lang.String $Xgafv) {
              return (Delete) super.set$Xgafv($Xgafv);
            }

            @Override
            public Delete setAccessToken(java.lang.String accessToken) {
              return (Delete) super.setAccessToken(accessToken);
            }

            @Override
            public Delete setAlt(java.lang.String alt) {
              return (Delete) super.setAlt(alt);
            }

            @Override
            public Delete setCallback(java.lang.String callback) {
              return (Delete) super.setCallback(callback);
            }

            @Override
            public Delete setFields(java.lang.String fields) {
              return (Delete) super.setFields(fields);
            }

            @Override
            public Delete setKey(java.lang.String key) {
              return (Delete) super.setKey(key);
            }

            @Override
            public Delete setOauthToken(java.lang.String oauthToken) {
              return (Delete) super.setOauthToken(oauthToken);
            }

            @Override
            public Delete setPrettyPrint(java.lang.Boolean prettyPrint) {
              return (Delete) super.setPrettyPrint(prettyPrint);
            }

            @Override
            public Delete setQuotaUser(java.lang.String quotaUser) {
              return (Delete) super.setQuotaUser(quotaUser);
            }

            @Override
            public Delete setUploadType(java.lang.String uploadType) {
              return (Delete) super.setUploadType(uploadType);
            }

            @Override
            public Delete setUploadProtocol(java.lang.String uploadProtocol) {
              return (Delete) super.setUploadProtocol(uploadProtocol);
            }

            /** The name of the operation resource to be deleted. */
            @com.google.api.client.util.Key
            private java.lang.String name;

            /** The name of the operation resource to be deleted.
             */
            public java.lang.String getName() {
              return name;
            }

            /** The name of the operation resource to be deleted. */
            public Delete setName(java.lang.String name) {
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");
              }
              this.name = name;
              return this;
            }

            @Override
            public Delete set(String parameterName, Object value) {
              return (Delete) super.set(parameterName, value);
            }
          }
          /**
           * Gets the latest state of a long-running operation. Clients can use this method to poll the
           * operation result at intervals as recommended by the API service.
           *
           * Create a request for the method "operations.get".
           *
           * This request holds the parameters needed by the firebaseappdistribution server.  After setting
           * any optional parameters, call the {@link Get#execute()} method to invoke the remote operation.
           *
           * @param name The name of the operation resource.
           * @return the request
           */
          public Get get(java.lang.String name) throws java.io.IOException {
            Get result = new Get(name);
            initialize(result);
            return result;
          }

          public class Get extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningOperation> {

            private static final String REST_PATH = "v1/{+name}";

            private final java.util.regex.Pattern NAME_PATTERN =
                java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");

            /**
             * Gets the latest state of a long-running operation. Clients can use this method to poll the
             * operation result at intervals as recommended by the API service.
             *
             * Create a request for the method "operations.get".
             *
             * This request holds the parameters needed by the the firebaseappdistribution server.  After
             * setting any optional parameters, call the {@link Get#execute()} method to invoke the remote
             * operation. <p> {@link
             * Get#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must be
             * called to initialize this instance immediately after invoking the constructor. </p>
             *
             * @param name The name of the operation resource.
             * @since 1.13
             */
            protected Get(java.lang.String name) {
              super(FirebaseAppDistribution.this, "GET", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningOperation.class);
              this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");
              }
            }

            @Override
            public com.google.api.client.http.HttpResponse executeUsingHead() throws java.io.IOException {
              return super.executeUsingHead();
            }

            @Override
            public com.google.api.client.http.HttpRequest buildHttpRequestUsingHead() throws java.io.IOException {
              return super.buildHttpRequestUsingHead();
            }

            @Override
            public Get set$Xgafv(java.lang.String $Xgafv) {
              return (Get) super.set$Xgafv($Xgafv);
            }

            @Override
            public Get setAccessToken(java.lang.String accessToken) {
              return (Get) super.setAccessToken(accessToken);
            }

            @Override
            public Get setAlt(java.lang.String alt) {
              return (Get) super.setAlt(alt);
            }

            @Override
            public Get setCallback(java.lang.String callback) {
              return (Get) super.setCallback(callback);
            }

            @Override
            public Get setFields(java.lang.String fields) {
              return (Get) super.setFields(fields);
            }

            @Override
            public Get setKey(java.lang.String key) {
              return (Get) super.setKey(key);
            }

            @Override
            public Get setOauthToken(java.lang.String oauthToken) {
              return (Get) super.setOauthToken(oauthToken);
            }

            @Override
            public Get setPrettyPrint(java.lang.Boolean prettyPrint) {
              return (Get) super.setPrettyPrint(prettyPrint);
            }

            @Override
            public Get setQuotaUser(java.lang.String quotaUser) {
              return (Get) super.setQuotaUser(quotaUser);
            }

            @Override
            public Get setUploadType(java.lang.String uploadType) {
              return (Get) super.setUploadType(uploadType);
            }

            @Override
            public Get setUploadProtocol(java.lang.String uploadProtocol) {
              return (Get) super.setUploadProtocol(uploadProtocol);
            }

            /** The name of the operation resource. */
            @com.google.api.client.util.Key
            private java.lang.String name;

            /** The name of the operation resource.
             */
            public java.lang.String getName() {
              return name;
            }

            /** The name of the operation resource. */
            public Get setName(java.lang.String name) {
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");
              }
              this.name = name;
              return this;
            }

            @Override
            public Get set(String parameterName, Object value) {
              return (Get) super.set(parameterName, value);
            }
          }
          /**
           * Lists operations that match the specified filter in the request. If the server doesn't support
           * this method, it returns `UNIMPLEMENTED`.
           *
           * Create a request for the method "operations.list".
           *
           * This request holds the parameters needed by the firebaseappdistribution server.  After setting
           * any optional parameters, call the {@link List#execute()} method to invoke the remote operation.
           *
           * @param name The name of the operation's parent resource.
           * @return the request
           */
          public List list(java.lang.String name) throws java.io.IOException {
            List result = new List(name);
            initialize(result);
            return result;
          }

          public class List extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningListOperationsResponse> {

            private static final String REST_PATH = "v1/{+name}/operations";

            private final java.util.regex.Pattern NAME_PATTERN =
                java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+$");

            /**
             * Lists operations that match the specified filter in the request. If the server doesn't support
             * this method, it returns `UNIMPLEMENTED`.
             *
             * Create a request for the method "operations.list".
             *
             * This request holds the parameters needed by the the firebaseappdistribution server.  After
             * setting any optional parameters, call the {@link List#execute()} method to invoke the remote
             * operation. <p> {@link
             * List#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must be
             * called to initialize this instance immediately after invoking the constructor. </p>
             *
             * @param name The name of the operation's parent resource.
             * @since 1.13
             */
            protected List(java.lang.String name) {
              super(FirebaseAppDistribution.this, "GET", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningListOperationsResponse.class);
              this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+$");
              }
            }

            @Override
            public com.google.api.client.http.HttpResponse executeUsingHead() throws java.io.IOException {
              return super.executeUsingHead();
            }

            @Override
            public com.google.api.client.http.HttpRequest buildHttpRequestUsingHead() throws java.io.IOException {
              return super.buildHttpRequestUsingHead();
            }

            @Override
            public List set$Xgafv(java.lang.String $Xgafv) {
              return (List) super.set$Xgafv($Xgafv);
            }

            @Override
            public List setAccessToken(java.lang.String accessToken) {
              return (List) super.setAccessToken(accessToken);
            }

            @Override
            public List setAlt(java.lang.String alt) {
              return (List) super.setAlt(alt);
            }

            @Override
            public List setCallback(java.lang.String callback) {
              return (List) super.setCallback(callback);
            }

            @Override
            public List setFields(java.lang.String fields) {
              return (List) super.setFields(fields);
            }

            @Override
            public List setKey(java.lang.String key) {
              return (List) super.setKey(key);
            }

            @Override
            public List setOauthToken(java.lang.String oauthToken) {
              return (List) super.setOauthToken(oauthToken);
            }

            @Override
            public List setPrettyPrint(java.lang.Boolean prettyPrint) {
              return (List) super.setPrettyPrint(prettyPrint);
            }

            @Override
            public List setQuotaUser(java.lang.String quotaUser) {
              return (List) super.setQuotaUser(quotaUser);
            }

            @Override
            public List setUploadType(java.lang.String uploadType) {
              return (List) super.setUploadType(uploadType);
            }

            @Override
            public List setUploadProtocol(java.lang.String uploadProtocol) {
              return (List) super.setUploadProtocol(uploadProtocol);
            }

            /** The name of the operation's parent resource. */
            @com.google.api.client.util.Key
            private java.lang.String name;

            /** The name of the operation's parent resource.
             */
            public java.lang.String getName() {
              return name;
            }

            /** The name of the operation's parent resource. */
            public List setName(java.lang.String name) {
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+$");
              }
              this.name = name;
              return this;
            }

            /** The standard list filter. */
            @com.google.api.client.util.Key
            private java.lang.String filter;

            /** The standard list filter.
             */
            public java.lang.String getFilter() {
              return filter;
            }

            /** The standard list filter. */
            public List setFilter(java.lang.String filter) {
              this.filter = filter;
              return this;
            }

            /** The standard list page size. */
            @com.google.api.client.util.Key
            private java.lang.Integer pageSize;

            /** The standard list page size.
             */
            public java.lang.Integer getPageSize() {
              return pageSize;
            }

            /** The standard list page size. */
            public List setPageSize(java.lang.Integer pageSize) {
              this.pageSize = pageSize;
              return this;
            }

            /** The standard list page token. */
            @com.google.api.client.util.Key
            private java.lang.String pageToken;

            /** The standard list page token.
             */
            public java.lang.String getPageToken() {
              return pageToken;
            }

            /** The standard list page token. */
            public List setPageToken(java.lang.String pageToken) {
              this.pageToken = pageToken;
              return this;
            }

            @Override
            public List set(String parameterName, Object value) {
              return (List) super.set(parameterName, value);
            }
          }
          /**
           * Waits until the specified long-running operation is done or reaches at most a specified timeout,
           * returning the latest state. If the operation is already done, the latest state is immediately
           * returned. If the timeout specified is greater than the default HTTP/RPC timeout, the HTTP/RPC
           * timeout is used. If the server does not support this method, it returns
           * `google.rpc.Code.UNIMPLEMENTED`. Note that this method is on a best-effort basis. It may return
           * the latest state before the specified timeout (including immediately), meaning even an immediate
           * response is no guarantee that the operation is done.
           *
           * Create a request for the method "operations.wait".
           *
           * This request holds the parameters needed by the firebaseappdistribution server.  After setting
           * any optional parameters, call the {@link Wait#execute()} method to invoke the remote operation.
           *
           * @param name The name of the operation resource to wait on.
           * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningWaitOperationRequest}
           * @return the request
           */
          public Wait wait(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningWaitOperationRequest content) throws java.io.IOException {
            Wait result = new Wait(name, content);
            initialize(result);
            return result;
          }

          public class Wait extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningOperation> {

            private static final String REST_PATH = "v1/{+name}:wait";

            private final java.util.regex.Pattern NAME_PATTERN =
                java.util.regex.Pattern.compile("^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");

            /**
             * Waits until the specified long-running operation is done or reaches at most a specified
             * timeout, returning the latest state. If the operation is already done, the latest state is
             * immediately returned. If the timeout specified is greater than the default HTTP/RPC timeout,
             * the HTTP/RPC timeout is used. If the server does not support this method, it returns
             * `google.rpc.Code.UNIMPLEMENTED`. Note that this method is on a best-effort basis. It may return
             * the latest state before the specified timeout (including immediately), meaning even an
             * immediate response is no guarantee that the operation is done.
             *
             * Create a request for the method "operations.wait".
             *
             * This request holds the parameters needed by the the firebaseappdistribution server.  After
             * setting any optional parameters, call the {@link Wait#execute()} method to invoke the remote
             * operation. <p> {@link
             * Wait#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must be
             * called to initialize this instance immediately after invoking the constructor. </p>
             *
             * @param name The name of the operation resource to wait on.
             * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningWaitOperationRequest}
             * @since 1.13
             */
            protected Wait(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningWaitOperationRequest content) {
              super(FirebaseAppDistribution.this, "POST", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleLongrunningOperation.class);
              this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");
              }
            }

            @Override
            public Wait set$Xgafv(java.lang.String $Xgafv) {
              return (Wait) super.set$Xgafv($Xgafv);
            }

            @Override
            public Wait setAccessToken(java.lang.String accessToken) {
              return (Wait) super.setAccessToken(accessToken);
            }

            @Override
            public Wait setAlt(java.lang.String alt) {
              return (Wait) super.setAlt(alt);
            }

            @Override
            public Wait setCallback(java.lang.String callback) {
              return (Wait) super.setCallback(callback);
            }

            @Override
            public Wait setFields(java.lang.String fields) {
              return (Wait) super.setFields(fields);
            }

            @Override
            public Wait setKey(java.lang.String key) {
              return (Wait) super.setKey(key);
            }

            @Override
            public Wait setOauthToken(java.lang.String oauthToken) {
              return (Wait) super.setOauthToken(oauthToken);
            }

            @Override
            public Wait setPrettyPrint(java.lang.Boolean prettyPrint) {
              return (Wait) super.setPrettyPrint(prettyPrint);
            }

            @Override
            public Wait setQuotaUser(java.lang.String quotaUser) {
              return (Wait) super.setQuotaUser(quotaUser);
            }

            @Override
            public Wait setUploadType(java.lang.String uploadType) {
              return (Wait) super.setUploadType(uploadType);
            }

            @Override
            public Wait setUploadProtocol(java.lang.String uploadProtocol) {
              return (Wait) super.setUploadProtocol(uploadProtocol);
            }

            /** The name of the operation resource to wait on. */
            @com.google.api.client.util.Key
            private java.lang.String name;

            /** The name of the operation resource to wait on.
             */
            public java.lang.String getName() {
              return name;
            }

            /** The name of the operation resource to wait on. */
            public Wait setName(java.lang.String name) {
              if (!getSuppressPatternChecks()) {
                com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                    "Parameter name must conform to the pattern " +
                    "^projects/[^/]+/apps/[^/]+/releases/[^/]+/operations/[^/]+$");
              }
              this.name = name;
              return this;
            }

            @Override
            public Wait set(String parameterName, Object value) {
              return (Wait) super.set(parameterName, value);
            }
          }

        }
      }
    }
    /**
     * An accessor for creating requests from the Groups collection.
     *
     * <p>The typical use is:</p>
     * <pre>
     *   {@code FirebaseAppDistribution firebaseappdistribution = new FirebaseAppDistribution(...);}
     *   {@code FirebaseAppDistribution.Groups.List request = firebaseappdistribution.groups().list(parameters ...)}
     * </pre>
     *
     * @return the resource collection
     */
    public Groups groups() {
      return new Groups();
    }

    /**
     * The "groups" collection of methods.
     */
    public class Groups {

      /**
       * Batch adds members to a group. The testers will gain access to all releases that the groups have
       * access to.
       *
       * Create a request for the method "groups.batchJoin".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link BatchJoin#execute()} method to invoke the remote
       * operation.
       *
       * @param group Required. The name of the group resource to which testers are added. Format:
       *        `projects/{project_number}/groups/{group_alias}`
       * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchJoinGroupRequest}
       * @return the request
       */
      public BatchJoin batchJoin(java.lang.String group, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchJoinGroupRequest content) throws java.io.IOException {
        BatchJoin result = new BatchJoin(group, content);
        initialize(result);
        return result;
      }

      public class BatchJoin extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty> {

        private static final String REST_PATH = "v1/{+group}:batchJoin";

        private final java.util.regex.Pattern GROUP_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+/groups/[^/]+$");

        /**
         * Batch adds members to a group. The testers will gain access to all releases that the groups
         * have access to.
         *
         * Create a request for the method "groups.batchJoin".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link BatchJoin#execute()} method to invoke the
         * remote operation. <p> {@link
         * BatchJoin#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)}
         * must be called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param group Required. The name of the group resource to which testers are added. Format:
       *        `projects/{project_number}/groups/{group_alias}`
         * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchJoinGroupRequest}
         * @since 1.13
         */
        protected BatchJoin(java.lang.String group, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchJoinGroupRequest content) {
          super(FirebaseAppDistribution.this, "POST", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty.class);
          this.group = com.google.api.client.util.Preconditions.checkNotNull(group, "Required parameter group must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(GROUP_PATTERN.matcher(group).matches(),
                "Parameter group must conform to the pattern " +
                "^projects/[^/]+/groups/[^/]+$");
          }
        }

        @Override
        public BatchJoin set$Xgafv(java.lang.String $Xgafv) {
          return (BatchJoin) super.set$Xgafv($Xgafv);
        }

        @Override
        public BatchJoin setAccessToken(java.lang.String accessToken) {
          return (BatchJoin) super.setAccessToken(accessToken);
        }

        @Override
        public BatchJoin setAlt(java.lang.String alt) {
          return (BatchJoin) super.setAlt(alt);
        }

        @Override
        public BatchJoin setCallback(java.lang.String callback) {
          return (BatchJoin) super.setCallback(callback);
        }

        @Override
        public BatchJoin setFields(java.lang.String fields) {
          return (BatchJoin) super.setFields(fields);
        }

        @Override
        public BatchJoin setKey(java.lang.String key) {
          return (BatchJoin) super.setKey(key);
        }

        @Override
        public BatchJoin setOauthToken(java.lang.String oauthToken) {
          return (BatchJoin) super.setOauthToken(oauthToken);
        }

        @Override
        public BatchJoin setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (BatchJoin) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public BatchJoin setQuotaUser(java.lang.String quotaUser) {
          return (BatchJoin) super.setQuotaUser(quotaUser);
        }

        @Override
        public BatchJoin setUploadType(java.lang.String uploadType) {
          return (BatchJoin) super.setUploadType(uploadType);
        }

        @Override
        public BatchJoin setUploadProtocol(java.lang.String uploadProtocol) {
          return (BatchJoin) super.setUploadProtocol(uploadProtocol);
        }

        /**
         * Required. The name of the group resource to which testers are added. Format:
         * `projects/{project_number}/groups/{group_alias}`
         */
        @com.google.api.client.util.Key
        private java.lang.String group;

        /** Required. The name of the group resource to which testers are added. Format:
       `projects/{project_number}/groups/{group_alias}`
         */
        public java.lang.String getGroup() {
          return group;
        }

        /**
         * Required. The name of the group resource to which testers are added. Format:
         * `projects/{project_number}/groups/{group_alias}`
         */
        public BatchJoin setGroup(java.lang.String group) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(GROUP_PATTERN.matcher(group).matches(),
                "Parameter group must conform to the pattern " +
                "^projects/[^/]+/groups/[^/]+$");
          }
          this.group = group;
          return this;
        }

        @Override
        public BatchJoin set(String parameterName, Object value) {
          return (BatchJoin) super.set(parameterName, value);
        }
      }
      /**
       * Batch removed members from a group. The testers will lose access to all releases that the groups
       * have access to.
       *
       * Create a request for the method "groups.batchLeave".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link BatchLeave#execute()} method to invoke the remote
       * operation.
       *
       * @param group Required. The name of the group resource from which testers are removed. Format:
       *        `projects/{project_number}/groups/{group_alias}`
       * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchLeaveGroupRequest}
       * @return the request
       */
      public BatchLeave batchLeave(java.lang.String group, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchLeaveGroupRequest content) throws java.io.IOException {
        BatchLeave result = new BatchLeave(group, content);
        initialize(result);
        return result;
      }

      public class BatchLeave extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty> {

        private static final String REST_PATH = "v1/{+group}:batchLeave";

        private final java.util.regex.Pattern GROUP_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+/groups/[^/]+$");

        /**
         * Batch removed members from a group. The testers will lose access to all releases that the
         * groups have access to.
         *
         * Create a request for the method "groups.batchLeave".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link BatchLeave#execute()} method to invoke the
         * remote operation. <p> {@link
         * BatchLeave#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)}
         * must be called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param group Required. The name of the group resource from which testers are removed. Format:
       *        `projects/{project_number}/groups/{group_alias}`
         * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchLeaveGroupRequest}
         * @since 1.13
         */
        protected BatchLeave(java.lang.String group, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchLeaveGroupRequest content) {
          super(FirebaseAppDistribution.this, "POST", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty.class);
          this.group = com.google.api.client.util.Preconditions.checkNotNull(group, "Required parameter group must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(GROUP_PATTERN.matcher(group).matches(),
                "Parameter group must conform to the pattern " +
                "^projects/[^/]+/groups/[^/]+$");
          }
        }

        @Override
        public BatchLeave set$Xgafv(java.lang.String $Xgafv) {
          return (BatchLeave) super.set$Xgafv($Xgafv);
        }

        @Override
        public BatchLeave setAccessToken(java.lang.String accessToken) {
          return (BatchLeave) super.setAccessToken(accessToken);
        }

        @Override
        public BatchLeave setAlt(java.lang.String alt) {
          return (BatchLeave) super.setAlt(alt);
        }

        @Override
        public BatchLeave setCallback(java.lang.String callback) {
          return (BatchLeave) super.setCallback(callback);
        }

        @Override
        public BatchLeave setFields(java.lang.String fields) {
          return (BatchLeave) super.setFields(fields);
        }

        @Override
        public BatchLeave setKey(java.lang.String key) {
          return (BatchLeave) super.setKey(key);
        }

        @Override
        public BatchLeave setOauthToken(java.lang.String oauthToken) {
          return (BatchLeave) super.setOauthToken(oauthToken);
        }

        @Override
        public BatchLeave setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (BatchLeave) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public BatchLeave setQuotaUser(java.lang.String quotaUser) {
          return (BatchLeave) super.setQuotaUser(quotaUser);
        }

        @Override
        public BatchLeave setUploadType(java.lang.String uploadType) {
          return (BatchLeave) super.setUploadType(uploadType);
        }

        @Override
        public BatchLeave setUploadProtocol(java.lang.String uploadProtocol) {
          return (BatchLeave) super.setUploadProtocol(uploadProtocol);
        }

        /**
         * Required. The name of the group resource from which testers are removed. Format:
         * `projects/{project_number}/groups/{group_alias}`
         */
        @com.google.api.client.util.Key
        private java.lang.String group;

        /** Required. The name of the group resource from which testers are removed. Format:
       `projects/{project_number}/groups/{group_alias}`
         */
        public java.lang.String getGroup() {
          return group;
        }

        /**
         * Required. The name of the group resource from which testers are removed. Format:
         * `projects/{project_number}/groups/{group_alias}`
         */
        public BatchLeave setGroup(java.lang.String group) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(GROUP_PATTERN.matcher(group).matches(),
                "Parameter group must conform to the pattern " +
                "^projects/[^/]+/groups/[^/]+$");
          }
          this.group = group;
          return this;
        }

        @Override
        public BatchLeave set(String parameterName, Object value) {
          return (BatchLeave) super.set(parameterName, value);
        }
      }
      /**
       * Create a group.
       *
       * Create a request for the method "groups.create".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link Create#execute()} method to invoke the remote operation.
       *
       * @param parent Required. The name of the project resource, which is the parent of the group resource. Format:
       *        `projects/{project_number}`
       * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group}
       * @return the request
       */
      public Create create(java.lang.String parent, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group content) throws java.io.IOException {
        Create result = new Create(parent, content);
        initialize(result);
        return result;
      }

      public class Create extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group> {

        private static final String REST_PATH = "v1/{+parent}/groups";

        private final java.util.regex.Pattern PARENT_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+$");

        /**
         * Create a group.
         *
         * Create a request for the method "groups.create".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link Create#execute()} method to invoke the remote
         * operation. <p> {@link
         * Create#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must
         * be called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param parent Required. The name of the project resource, which is the parent of the group resource. Format:
       *        `projects/{project_number}`
         * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group}
         * @since 1.13
         */
        protected Create(java.lang.String parent, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group content) {
          super(FirebaseAppDistribution.this, "POST", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group.class);
          this.parent = com.google.api.client.util.Preconditions.checkNotNull(parent, "Required parameter parent must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                "Parameter parent must conform to the pattern " +
                "^projects/[^/]+$");
          }
        }

        @Override
        public Create set$Xgafv(java.lang.String $Xgafv) {
          return (Create) super.set$Xgafv($Xgafv);
        }

        @Override
        public Create setAccessToken(java.lang.String accessToken) {
          return (Create) super.setAccessToken(accessToken);
        }

        @Override
        public Create setAlt(java.lang.String alt) {
          return (Create) super.setAlt(alt);
        }

        @Override
        public Create setCallback(java.lang.String callback) {
          return (Create) super.setCallback(callback);
        }

        @Override
        public Create setFields(java.lang.String fields) {
          return (Create) super.setFields(fields);
        }

        @Override
        public Create setKey(java.lang.String key) {
          return (Create) super.setKey(key);
        }

        @Override
        public Create setOauthToken(java.lang.String oauthToken) {
          return (Create) super.setOauthToken(oauthToken);
        }

        @Override
        public Create setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (Create) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public Create setQuotaUser(java.lang.String quotaUser) {
          return (Create) super.setQuotaUser(quotaUser);
        }

        @Override
        public Create setUploadType(java.lang.String uploadType) {
          return (Create) super.setUploadType(uploadType);
        }

        @Override
        public Create setUploadProtocol(java.lang.String uploadProtocol) {
          return (Create) super.setUploadProtocol(uploadProtocol);
        }

        /**
         * Required. The name of the project resource, which is the parent of the group resource.
         * Format: `projects/{project_number}`
         */
        @com.google.api.client.util.Key
        private java.lang.String parent;

        /** Required. The name of the project resource, which is the parent of the group resource. Format:
       `projects/{project_number}`
         */
        public java.lang.String getParent() {
          return parent;
        }

        /**
         * Required. The name of the project resource, which is the parent of the group resource.
         * Format: `projects/{project_number}`
         */
        public Create setParent(java.lang.String parent) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                "Parameter parent must conform to the pattern " +
                "^projects/[^/]+$");
          }
          this.parent = parent;
          return this;
        }

        /**
         * Optional. The "alias" to use for the group, which will become the final component of the
         * group's resource name. This value must be unique per project. The field is named
         * `groupId` to comply with AIP guidance for user-specified IDs. This value should be 4-63
         * characters, and valid characters are `/a-z-/`. If not set, it will be generated based on
         * the display name.
         */
        @com.google.api.client.util.Key
        private java.lang.String groupId;

        /** Optional. The "alias" to use for the group, which will become the final component of the group's
       resource name. This value must be unique per project. The field is named `groupId` to comply with
       AIP guidance for user-specified IDs. This value should be 4-63 characters, and valid characters are
       `/a-z-/`. If not set, it will be generated based on the display name.
         */
        public java.lang.String getGroupId() {
          return groupId;
        }

        /**
         * Optional. The "alias" to use for the group, which will become the final component of the
         * group's resource name. This value must be unique per project. The field is named
         * `groupId` to comply with AIP guidance for user-specified IDs. This value should be 4-63
         * characters, and valid characters are `/a-z-/`. If not set, it will be generated based on
         * the display name.
         */
        public Create setGroupId(java.lang.String groupId) {
          this.groupId = groupId;
          return this;
        }

        @Override
        public Create set(String parameterName, Object value) {
          return (Create) super.set(parameterName, value);
        }
      }
      /**
       * Delete a group.
       *
       * Create a request for the method "groups.delete".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link Delete#execute()} method to invoke the remote operation.
       *
       * @param name Required. The name of the group resource. Format: `projects/{project_number}/groups/{group_alias}`
       * @return the request
       */
      public Delete delete(java.lang.String name) throws java.io.IOException {
        Delete result = new Delete(name);
        initialize(result);
        return result;
      }

      public class Delete extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty> {

        private static final String REST_PATH = "v1/{+name}";

        private final java.util.regex.Pattern NAME_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+/groups/[^/]+$");

        /**
         * Delete a group.
         *
         * Create a request for the method "groups.delete".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link Delete#execute()} method to invoke the remote
         * operation. <p> {@link
         * Delete#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must
         * be called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param name Required. The name of the group resource. Format: `projects/{project_number}/groups/{group_alias}`
         * @since 1.13
         */
        protected Delete(java.lang.String name) {
          super(FirebaseAppDistribution.this, "DELETE", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleProtobufEmpty.class);
          this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                "Parameter name must conform to the pattern " +
                "^projects/[^/]+/groups/[^/]+$");
          }
        }

        @Override
        public Delete set$Xgafv(java.lang.String $Xgafv) {
          return (Delete) super.set$Xgafv($Xgafv);
        }

        @Override
        public Delete setAccessToken(java.lang.String accessToken) {
          return (Delete) super.setAccessToken(accessToken);
        }

        @Override
        public Delete setAlt(java.lang.String alt) {
          return (Delete) super.setAlt(alt);
        }

        @Override
        public Delete setCallback(java.lang.String callback) {
          return (Delete) super.setCallback(callback);
        }

        @Override
        public Delete setFields(java.lang.String fields) {
          return (Delete) super.setFields(fields);
        }

        @Override
        public Delete setKey(java.lang.String key) {
          return (Delete) super.setKey(key);
        }

        @Override
        public Delete setOauthToken(java.lang.String oauthToken) {
          return (Delete) super.setOauthToken(oauthToken);
        }

        @Override
        public Delete setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (Delete) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public Delete setQuotaUser(java.lang.String quotaUser) {
          return (Delete) super.setQuotaUser(quotaUser);
        }

        @Override
        public Delete setUploadType(java.lang.String uploadType) {
          return (Delete) super.setUploadType(uploadType);
        }

        @Override
        public Delete setUploadProtocol(java.lang.String uploadProtocol) {
          return (Delete) super.setUploadProtocol(uploadProtocol);
        }

        /**
         * Required. The name of the group resource. Format:
         * `projects/{project_number}/groups/{group_alias}`
         */
        @com.google.api.client.util.Key
        private java.lang.String name;

        /** Required. The name of the group resource. Format: `projects/{project_number}/groups/{group_alias}`
         */
        public java.lang.String getName() {
          return name;
        }

        /**
         * Required. The name of the group resource. Format:
         * `projects/{project_number}/groups/{group_alias}`
         */
        public Delete setName(java.lang.String name) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                "Parameter name must conform to the pattern " +
                "^projects/[^/]+/groups/[^/]+$");
          }
          this.name = name;
          return this;
        }

        @Override
        public Delete set(String parameterName, Object value) {
          return (Delete) super.set(parameterName, value);
        }
      }
      /**
       * Get a group.
       *
       * Create a request for the method "groups.get".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link Get#execute()} method to invoke the remote operation.
       *
       * @param name Required. The name of the group resource to retrieve. Format:
       *        `projects/{project_number}/groups/{group_alias}`
       * @return the request
       */
      public Get get(java.lang.String name) throws java.io.IOException {
        Get result = new Get(name);
        initialize(result);
        return result;
      }

      public class Get extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group> {

        private static final String REST_PATH = "v1/{+name}";

        private final java.util.regex.Pattern NAME_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+/groups/[^/]+$");

        /**
         * Get a group.
         *
         * Create a request for the method "groups.get".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link Get#execute()} method to invoke the remote
         * operation. <p> {@link
         * Get#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must be
         * called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param name Required. The name of the group resource to retrieve. Format:
       *        `projects/{project_number}/groups/{group_alias}`
         * @since 1.13
         */
        protected Get(java.lang.String name) {
          super(FirebaseAppDistribution.this, "GET", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group.class);
          this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                "Parameter name must conform to the pattern " +
                "^projects/[^/]+/groups/[^/]+$");
          }
        }

        @Override
        public com.google.api.client.http.HttpResponse executeUsingHead() throws java.io.IOException {
          return super.executeUsingHead();
        }

        @Override
        public com.google.api.client.http.HttpRequest buildHttpRequestUsingHead() throws java.io.IOException {
          return super.buildHttpRequestUsingHead();
        }

        @Override
        public Get set$Xgafv(java.lang.String $Xgafv) {
          return (Get) super.set$Xgafv($Xgafv);
        }

        @Override
        public Get setAccessToken(java.lang.String accessToken) {
          return (Get) super.setAccessToken(accessToken);
        }

        @Override
        public Get setAlt(java.lang.String alt) {
          return (Get) super.setAlt(alt);
        }

        @Override
        public Get setCallback(java.lang.String callback) {
          return (Get) super.setCallback(callback);
        }

        @Override
        public Get setFields(java.lang.String fields) {
          return (Get) super.setFields(fields);
        }

        @Override
        public Get setKey(java.lang.String key) {
          return (Get) super.setKey(key);
        }

        @Override
        public Get setOauthToken(java.lang.String oauthToken) {
          return (Get) super.setOauthToken(oauthToken);
        }

        @Override
        public Get setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (Get) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public Get setQuotaUser(java.lang.String quotaUser) {
          return (Get) super.setQuotaUser(quotaUser);
        }

        @Override
        public Get setUploadType(java.lang.String uploadType) {
          return (Get) super.setUploadType(uploadType);
        }

        @Override
        public Get setUploadProtocol(java.lang.String uploadProtocol) {
          return (Get) super.setUploadProtocol(uploadProtocol);
        }

        /**
         * Required. The name of the group resource to retrieve. Format:
         * `projects/{project_number}/groups/{group_alias}`
         */
        @com.google.api.client.util.Key
        private java.lang.String name;

        /** Required. The name of the group resource to retrieve. Format:
       `projects/{project_number}/groups/{group_alias}`
         */
        public java.lang.String getName() {
          return name;
        }

        /**
         * Required. The name of the group resource to retrieve. Format:
         * `projects/{project_number}/groups/{group_alias}`
         */
        public Get setName(java.lang.String name) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                "Parameter name must conform to the pattern " +
                "^projects/[^/]+/groups/[^/]+$");
          }
          this.name = name;
          return this;
        }

        @Override
        public Get set(String parameterName, Object value) {
          return (Get) super.set(parameterName, value);
        }
      }
      /**
       * List groups.
       *
       * Create a request for the method "groups.list".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link List#execute()} method to invoke the remote operation.
       *
       * @param parent Required. The name of the project resource, which is the parent of the group resources. Format:
       *        `projects/{project_number}`
       * @return the request
       */
      public List list(java.lang.String parent) throws java.io.IOException {
        List result = new List(parent);
        initialize(result);
        return result;
      }

      public class List extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1ListGroupsResponse> {

        private static final String REST_PATH = "v1/{+parent}/groups";

        private final java.util.regex.Pattern PARENT_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+$");

        /**
         * List groups.
         *
         * Create a request for the method "groups.list".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link List#execute()} method to invoke the remote
         * operation. <p> {@link
         * List#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must be
         * called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param parent Required. The name of the project resource, which is the parent of the group resources. Format:
       *        `projects/{project_number}`
         * @since 1.13
         */
        protected List(java.lang.String parent) {
          super(FirebaseAppDistribution.this, "GET", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1ListGroupsResponse.class);
          this.parent = com.google.api.client.util.Preconditions.checkNotNull(parent, "Required parameter parent must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                "Parameter parent must conform to the pattern " +
                "^projects/[^/]+$");
          }
        }

        @Override
        public com.google.api.client.http.HttpResponse executeUsingHead() throws java.io.IOException {
          return super.executeUsingHead();
        }

        @Override
        public com.google.api.client.http.HttpRequest buildHttpRequestUsingHead() throws java.io.IOException {
          return super.buildHttpRequestUsingHead();
        }

        @Override
        public List set$Xgafv(java.lang.String $Xgafv) {
          return (List) super.set$Xgafv($Xgafv);
        }

        @Override
        public List setAccessToken(java.lang.String accessToken) {
          return (List) super.setAccessToken(accessToken);
        }

        @Override
        public List setAlt(java.lang.String alt) {
          return (List) super.setAlt(alt);
        }

        @Override
        public List setCallback(java.lang.String callback) {
          return (List) super.setCallback(callback);
        }

        @Override
        public List setFields(java.lang.String fields) {
          return (List) super.setFields(fields);
        }

        @Override
        public List setKey(java.lang.String key) {
          return (List) super.setKey(key);
        }

        @Override
        public List setOauthToken(java.lang.String oauthToken) {
          return (List) super.setOauthToken(oauthToken);
        }

        @Override
        public List setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (List) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public List setQuotaUser(java.lang.String quotaUser) {
          return (List) super.setQuotaUser(quotaUser);
        }

        @Override
        public List setUploadType(java.lang.String uploadType) {
          return (List) super.setUploadType(uploadType);
        }

        @Override
        public List setUploadProtocol(java.lang.String uploadProtocol) {
          return (List) super.setUploadProtocol(uploadProtocol);
        }

        /**
         * Required. The name of the project resource, which is the parent of the group resources.
         * Format: `projects/{project_number}`
         */
        @com.google.api.client.util.Key
        private java.lang.String parent;

        /** Required. The name of the project resource, which is the parent of the group resources. Format:
       `projects/{project_number}`
         */
        public java.lang.String getParent() {
          return parent;
        }

        /**
         * Required. The name of the project resource, which is the parent of the group resources.
         * Format: `projects/{project_number}`
         */
        public List setParent(java.lang.String parent) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                "Parameter parent must conform to the pattern " +
                "^projects/[^/]+$");
          }
          this.parent = parent;
          return this;
        }

        /**
         * Optional. The maximum number of groups to return. The service may return fewer than this
         * value. The valid range is [1-1000]; If unspecified (0), at most 25 groups are returned.
         * Values above 1000 are coerced to 1000.
         */
        @com.google.api.client.util.Key
        private java.lang.Integer pageSize;

        /** Optional. The maximum number of groups to return. The service may return fewer than this value. The
       valid range is [1-1000]; If unspecified (0), at most 25 groups are returned. Values above 1000 are
       coerced to 1000.
         */
        public java.lang.Integer getPageSize() {
          return pageSize;
        }

        /**
         * Optional. The maximum number of groups to return. The service may return fewer than this
         * value. The valid range is [1-1000]; If unspecified (0), at most 25 groups are returned.
         * Values above 1000 are coerced to 1000.
         */
        public List setPageSize(java.lang.Integer pageSize) {
          this.pageSize = pageSize;
          return this;
        }

        /**
         * Optional. A page token, received from a previous `ListGroups` call. Provide this to
         * retrieve the subsequent page. When paginating, all other parameters provided to
         * `ListGroups` must match the call that provided the page token.
         */
        @com.google.api.client.util.Key
        private java.lang.String pageToken;

        /** Optional. A page token, received from a previous `ListGroups` call. Provide this to retrieve the
       subsequent page. When paginating, all other parameters provided to `ListGroups` must match the call
       that provided the page token.
         */
        public java.lang.String getPageToken() {
          return pageToken;
        }

        /**
         * Optional. A page token, received from a previous `ListGroups` call. Provide this to
         * retrieve the subsequent page. When paginating, all other parameters provided to
         * `ListGroups` must match the call that provided the page token.
         */
        public List setPageToken(java.lang.String pageToken) {
          this.pageToken = pageToken;
          return this;
        }

        @Override
        public List set(String parameterName, Object value) {
          return (List) super.set(parameterName, value);
        }
      }
      /**
       * Update a group.
       *
       * Create a request for the method "groups.patch".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link Patch#execute()} method to invoke the remote operation.
       *
       * @param name The name of the group resource. Format: `projects/{project_number}/groups/{group_alias}`
       * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group}
       * @return the request
       */
      public Patch patch(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group content) throws java.io.IOException {
        Patch result = new Patch(name, content);
        initialize(result);
        return result;
      }

      public class Patch extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group> {

        private static final String REST_PATH = "v1/{+name}";

        private final java.util.regex.Pattern NAME_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+/groups/[^/]+$");

        /**
         * Update a group.
         *
         * Create a request for the method "groups.patch".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link Patch#execute()} method to invoke the remote
         * operation. <p> {@link
         * Patch#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must
         * be called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param name The name of the group resource. Format: `projects/{project_number}/groups/{group_alias}`
         * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group}
         * @since 1.13
         */
        protected Patch(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group content) {
          super(FirebaseAppDistribution.this, "PATCH", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Group.class);
          this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                "Parameter name must conform to the pattern " +
                "^projects/[^/]+/groups/[^/]+$");
          }
        }

        @Override
        public Patch set$Xgafv(java.lang.String $Xgafv) {
          return (Patch) super.set$Xgafv($Xgafv);
        }

        @Override
        public Patch setAccessToken(java.lang.String accessToken) {
          return (Patch) super.setAccessToken(accessToken);
        }

        @Override
        public Patch setAlt(java.lang.String alt) {
          return (Patch) super.setAlt(alt);
        }

        @Override
        public Patch setCallback(java.lang.String callback) {
          return (Patch) super.setCallback(callback);
        }

        @Override
        public Patch setFields(java.lang.String fields) {
          return (Patch) super.setFields(fields);
        }

        @Override
        public Patch setKey(java.lang.String key) {
          return (Patch) super.setKey(key);
        }

        @Override
        public Patch setOauthToken(java.lang.String oauthToken) {
          return (Patch) super.setOauthToken(oauthToken);
        }

        @Override
        public Patch setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (Patch) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public Patch setQuotaUser(java.lang.String quotaUser) {
          return (Patch) super.setQuotaUser(quotaUser);
        }

        @Override
        public Patch setUploadType(java.lang.String uploadType) {
          return (Patch) super.setUploadType(uploadType);
        }

        @Override
        public Patch setUploadProtocol(java.lang.String uploadProtocol) {
          return (Patch) super.setUploadProtocol(uploadProtocol);
        }

        /**
         * The name of the group resource. Format: `projects/{project_number}/groups/{group_alias}`
         */
        @com.google.api.client.util.Key
        private java.lang.String name;

        /** The name of the group resource. Format: `projects/{project_number}/groups/{group_alias}`
         */
        public java.lang.String getName() {
          return name;
        }

        /**
         * The name of the group resource. Format: `projects/{project_number}/groups/{group_alias}`
         */
        public Patch setName(java.lang.String name) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                "Parameter name must conform to the pattern " +
                "^projects/[^/]+/groups/[^/]+$");
          }
          this.name = name;
          return this;
        }

        /** The list of fields to update. */
        @com.google.api.client.util.Key
        private String updateMask;

        /** The list of fields to update.
         */
        public String getUpdateMask() {
          return updateMask;
        }

        /** The list of fields to update. */
        public Patch setUpdateMask(String updateMask) {
          this.updateMask = updateMask;
          return this;
        }

        @Override
        public Patch set(String parameterName, Object value) {
          return (Patch) super.set(parameterName, value);
        }
      }

    }
    /**
     * An accessor for creating requests from the Testers collection.
     *
     * <p>The typical use is:</p>
     * <pre>
     *   {@code FirebaseAppDistribution firebaseappdistribution = new FirebaseAppDistribution(...);}
     *   {@code FirebaseAppDistribution.Testers.List request = firebaseappdistribution.testers().list(parameters ...)}
     * </pre>
     *
     * @return the resource collection
     */
    public Testers testers() {
      return new Testers();
    }

    /**
     * The "testers" collection of methods.
     */
    public class Testers {

      /**
       * Batch adds testers. This call adds testers for the specified emails if they don't already exist.
       * Returns all testers specified in the request, including newly created and previously existing
       * testers. This action is idempotent.
       *
       * Create a request for the method "testers.batchAdd".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link BatchAdd#execute()} method to invoke the remote
       * operation.
       *
       * @param project Required. The name of the project resource. Format: `projects/{project_number}`
       * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchAddTestersRequest}
       * @return the request
       */
      public BatchAdd batchAdd(java.lang.String project, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchAddTestersRequest content) throws java.io.IOException {
        BatchAdd result = new BatchAdd(project, content);
        initialize(result);
        return result;
      }

      public class BatchAdd extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchAddTestersResponse> {

        private static final String REST_PATH = "v1/{+project}/testers:batchAdd";

        private final java.util.regex.Pattern PROJECT_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+$");

        /**
         * Batch adds testers. This call adds testers for the specified emails if they don't already
         * exist. Returns all testers specified in the request, including newly created and previously
         * existing testers. This action is idempotent.
         *
         * Create a request for the method "testers.batchAdd".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link BatchAdd#execute()} method to invoke the
         * remote operation. <p> {@link
         * BatchAdd#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)}
         * must be called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param project Required. The name of the project resource. Format: `projects/{project_number}`
         * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchAddTestersRequest}
         * @since 1.13
         */
        protected BatchAdd(java.lang.String project, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchAddTestersRequest content) {
          super(FirebaseAppDistribution.this, "POST", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchAddTestersResponse.class);
          this.project = com.google.api.client.util.Preconditions.checkNotNull(project, "Required parameter project must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(PROJECT_PATTERN.matcher(project).matches(),
                "Parameter project must conform to the pattern " +
                "^projects/[^/]+$");
          }
        }

        @Override
        public BatchAdd set$Xgafv(java.lang.String $Xgafv) {
          return (BatchAdd) super.set$Xgafv($Xgafv);
        }

        @Override
        public BatchAdd setAccessToken(java.lang.String accessToken) {
          return (BatchAdd) super.setAccessToken(accessToken);
        }

        @Override
        public BatchAdd setAlt(java.lang.String alt) {
          return (BatchAdd) super.setAlt(alt);
        }

        @Override
        public BatchAdd setCallback(java.lang.String callback) {
          return (BatchAdd) super.setCallback(callback);
        }

        @Override
        public BatchAdd setFields(java.lang.String fields) {
          return (BatchAdd) super.setFields(fields);
        }

        @Override
        public BatchAdd setKey(java.lang.String key) {
          return (BatchAdd) super.setKey(key);
        }

        @Override
        public BatchAdd setOauthToken(java.lang.String oauthToken) {
          return (BatchAdd) super.setOauthToken(oauthToken);
        }

        @Override
        public BatchAdd setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (BatchAdd) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public BatchAdd setQuotaUser(java.lang.String quotaUser) {
          return (BatchAdd) super.setQuotaUser(quotaUser);
        }

        @Override
        public BatchAdd setUploadType(java.lang.String uploadType) {
          return (BatchAdd) super.setUploadType(uploadType);
        }

        @Override
        public BatchAdd setUploadProtocol(java.lang.String uploadProtocol) {
          return (BatchAdd) super.setUploadProtocol(uploadProtocol);
        }

        /** Required. The name of the project resource. Format: `projects/{project_number}` */
        @com.google.api.client.util.Key
        private java.lang.String project;

        /** Required. The name of the project resource. Format: `projects/{project_number}`
         */
        public java.lang.String getProject() {
          return project;
        }

        /** Required. The name of the project resource. Format: `projects/{project_number}` */
        public BatchAdd setProject(java.lang.String project) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(PROJECT_PATTERN.matcher(project).matches(),
                "Parameter project must conform to the pattern " +
                "^projects/[^/]+$");
          }
          this.project = project;
          return this;
        }

        @Override
        public BatchAdd set(String parameterName, Object value) {
          return (BatchAdd) super.set(parameterName, value);
        }
      }
      /**
       * Batch removes testers. If found, this call deletes testers for the specified emails. Returns all
       * deleted testers.
       *
       * Create a request for the method "testers.batchRemove".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link BatchRemove#execute()} method to invoke the remote
       * operation.
       *
       * @param project Required. The name of the project resource. Format: `projects/{project_number}`
       * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchRemoveTestersRequest}
       * @return the request
       */
      public BatchRemove batchRemove(java.lang.String project, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchRemoveTestersRequest content) throws java.io.IOException {
        BatchRemove result = new BatchRemove(project, content);
        initialize(result);
        return result;
      }

      public class BatchRemove extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchRemoveTestersResponse> {

        private static final String REST_PATH = "v1/{+project}/testers:batchRemove";

        private final java.util.regex.Pattern PROJECT_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+$");

        /**
         * Batch removes testers. If found, this call deletes testers for the specified emails. Returns
         * all deleted testers.
         *
         * Create a request for the method "testers.batchRemove".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link BatchRemove#execute()} method to invoke the
         * remote operation. <p> {@link
         * BatchRemove#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)}
         * must be called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param project Required. The name of the project resource. Format: `projects/{project_number}`
         * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchRemoveTestersRequest}
         * @since 1.13
         */
        protected BatchRemove(java.lang.String project, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchRemoveTestersRequest content) {
          super(FirebaseAppDistribution.this, "POST", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1BatchRemoveTestersResponse.class);
          this.project = com.google.api.client.util.Preconditions.checkNotNull(project, "Required parameter project must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(PROJECT_PATTERN.matcher(project).matches(),
                "Parameter project must conform to the pattern " +
                "^projects/[^/]+$");
          }
        }

        @Override
        public BatchRemove set$Xgafv(java.lang.String $Xgafv) {
          return (BatchRemove) super.set$Xgafv($Xgafv);
        }

        @Override
        public BatchRemove setAccessToken(java.lang.String accessToken) {
          return (BatchRemove) super.setAccessToken(accessToken);
        }

        @Override
        public BatchRemove setAlt(java.lang.String alt) {
          return (BatchRemove) super.setAlt(alt);
        }

        @Override
        public BatchRemove setCallback(java.lang.String callback) {
          return (BatchRemove) super.setCallback(callback);
        }

        @Override
        public BatchRemove setFields(java.lang.String fields) {
          return (BatchRemove) super.setFields(fields);
        }

        @Override
        public BatchRemove setKey(java.lang.String key) {
          return (BatchRemove) super.setKey(key);
        }

        @Override
        public BatchRemove setOauthToken(java.lang.String oauthToken) {
          return (BatchRemove) super.setOauthToken(oauthToken);
        }

        @Override
        public BatchRemove setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (BatchRemove) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public BatchRemove setQuotaUser(java.lang.String quotaUser) {
          return (BatchRemove) super.setQuotaUser(quotaUser);
        }

        @Override
        public BatchRemove setUploadType(java.lang.String uploadType) {
          return (BatchRemove) super.setUploadType(uploadType);
        }

        @Override
        public BatchRemove setUploadProtocol(java.lang.String uploadProtocol) {
          return (BatchRemove) super.setUploadProtocol(uploadProtocol);
        }

        /** Required. The name of the project resource. Format: `projects/{project_number}` */
        @com.google.api.client.util.Key
        private java.lang.String project;

        /** Required. The name of the project resource. Format: `projects/{project_number}`
         */
        public java.lang.String getProject() {
          return project;
        }

        /** Required. The name of the project resource. Format: `projects/{project_number}` */
        public BatchRemove setProject(java.lang.String project) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(PROJECT_PATTERN.matcher(project).matches(),
                "Parameter project must conform to the pattern " +
                "^projects/[^/]+$");
          }
          this.project = project;
          return this;
        }

        @Override
        public BatchRemove set(String parameterName, Object value) {
          return (BatchRemove) super.set(parameterName, value);
        }
      }
      /**
       * Lists testers and their resource ids.
       *
       * Create a request for the method "testers.list".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link List#execute()} method to invoke the remote operation.
       *
       * @param parent Required. The name of the project resource, which is the parent of the tester resources. Format:
       *        `projects/{project_number}`
       * @return the request
       */
      public List list(java.lang.String parent) throws java.io.IOException {
        List result = new List(parent);
        initialize(result);
        return result;
      }

      public class List extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1ListTestersResponse> {

        private static final String REST_PATH = "v1/{+parent}/testers";

        private final java.util.regex.Pattern PARENT_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+$");

        /**
         * Lists testers and their resource ids.
         *
         * Create a request for the method "testers.list".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link List#execute()} method to invoke the remote
         * operation. <p> {@link
         * List#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must be
         * called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param parent Required. The name of the project resource, which is the parent of the tester resources. Format:
       *        `projects/{project_number}`
         * @since 1.13
         */
        protected List(java.lang.String parent) {
          super(FirebaseAppDistribution.this, "GET", REST_PATH, null, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1ListTestersResponse.class);
          this.parent = com.google.api.client.util.Preconditions.checkNotNull(parent, "Required parameter parent must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                "Parameter parent must conform to the pattern " +
                "^projects/[^/]+$");
          }
        }

        @Override
        public com.google.api.client.http.HttpResponse executeUsingHead() throws java.io.IOException {
          return super.executeUsingHead();
        }

        @Override
        public com.google.api.client.http.HttpRequest buildHttpRequestUsingHead() throws java.io.IOException {
          return super.buildHttpRequestUsingHead();
        }

        @Override
        public List set$Xgafv(java.lang.String $Xgafv) {
          return (List) super.set$Xgafv($Xgafv);
        }

        @Override
        public List setAccessToken(java.lang.String accessToken) {
          return (List) super.setAccessToken(accessToken);
        }

        @Override
        public List setAlt(java.lang.String alt) {
          return (List) super.setAlt(alt);
        }

        @Override
        public List setCallback(java.lang.String callback) {
          return (List) super.setCallback(callback);
        }

        @Override
        public List setFields(java.lang.String fields) {
          return (List) super.setFields(fields);
        }

        @Override
        public List setKey(java.lang.String key) {
          return (List) super.setKey(key);
        }

        @Override
        public List setOauthToken(java.lang.String oauthToken) {
          return (List) super.setOauthToken(oauthToken);
        }

        @Override
        public List setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (List) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public List setQuotaUser(java.lang.String quotaUser) {
          return (List) super.setQuotaUser(quotaUser);
        }

        @Override
        public List setUploadType(java.lang.String uploadType) {
          return (List) super.setUploadType(uploadType);
        }

        @Override
        public List setUploadProtocol(java.lang.String uploadProtocol) {
          return (List) super.setUploadProtocol(uploadProtocol);
        }

        /**
         * Required. The name of the project resource, which is the parent of the tester resources.
         * Format: `projects/{project_number}`
         */
        @com.google.api.client.util.Key
        private java.lang.String parent;

        /** Required. The name of the project resource, which is the parent of the tester resources. Format:
       `projects/{project_number}`
         */
        public java.lang.String getParent() {
          return parent;
        }

        /**
         * Required. The name of the project resource, which is the parent of the tester resources.
         * Format: `projects/{project_number}`
         */
        public List setParent(java.lang.String parent) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(PARENT_PATTERN.matcher(parent).matches(),
                "Parameter parent must conform to the pattern " +
                "^projects/[^/]+$");
          }
          this.parent = parent;
          return this;
        }

        /**
         * Optional. The expression to filter testers listed in the response. To learn more about
         * filtering, refer to [Google's AIP-160 standard](http://aip.dev/160). Supported fields: -
         * `name` - `displayName` - `groups` Example: - `name = "projects/-/testers@example.com"` -
         * `displayName = "Joe Sixpack"` - `groups = "projects/groups/qa-team"`
         */
        @com.google.api.client.util.Key
        private java.lang.String filter;

        /** Optional. The expression to filter testers listed in the response. To learn more about filtering,
       refer to [Google's AIP-160 standard](http://aip.dev/160). Supported fields: - `name` -
       `displayName` - `groups` Example: - `name = "projects/-/testers@example.com"` - `displayName = "Joe
       Sixpack"` - `groups = "projects/groups/qa-team"`
         */
        public java.lang.String getFilter() {
          return filter;
        }

        /**
         * Optional. The expression to filter testers listed in the response. To learn more about
         * filtering, refer to [Google's AIP-160 standard](http://aip.dev/160). Supported fields: -
         * `name` - `displayName` - `groups` Example: - `name = "projects/-/testers@example.com"` -
         * `displayName = "Joe Sixpack"` - `groups = "projects/groups/qa-team"`
         */
        public List setFilter(java.lang.String filter) {
          this.filter = filter;
          return this;
        }

        /**
         * Optional. The maximum number of testers to return. The service may return fewer than this
         * value. The valid range is [1-1000]; If unspecified (0), at most 10 testers are returned.
         * Values above 1000 are coerced to 1000.
         */
        @com.google.api.client.util.Key
        private java.lang.Integer pageSize;

        /** Optional. The maximum number of testers to return. The service may return fewer than this value.
       The valid range is [1-1000]; If unspecified (0), at most 10 testers are returned. Values above 1000
       are coerced to 1000.
         */
        public java.lang.Integer getPageSize() {
          return pageSize;
        }

        /**
         * Optional. The maximum number of testers to return. The service may return fewer than this
         * value. The valid range is [1-1000]; If unspecified (0), at most 10 testers are returned.
         * Values above 1000 are coerced to 1000.
         */
        public List setPageSize(java.lang.Integer pageSize) {
          this.pageSize = pageSize;
          return this;
        }

        /**
         * Optional. A page token, received from a previous `ListTesters` call. Provide this to
         * retrieve the subsequent page. When paginating, all other parameters provided to
         * `ListTesters` must match the call that provided the page token.
         */
        @com.google.api.client.util.Key
        private java.lang.String pageToken;

        /** Optional. A page token, received from a previous `ListTesters` call. Provide this to retrieve the
       subsequent page. When paginating, all other parameters provided to `ListTesters` must match the
       call that provided the page token.
         */
        public java.lang.String getPageToken() {
          return pageToken;
        }

        /**
         * Optional. A page token, received from a previous `ListTesters` call. Provide this to
         * retrieve the subsequent page. When paginating, all other parameters provided to
         * `ListTesters` must match the call that provided the page token.
         */
        public List setPageToken(java.lang.String pageToken) {
          this.pageToken = pageToken;
          return this;
        }

        @Override
        public List set(String parameterName, Object value) {
          return (List) super.set(parameterName, value);
        }
      }
      /**
       * Update a tester. If the testers joins a group they gain access to all releases that the group has
       * access to.
       *
       * Create a request for the method "testers.patch".
       *
       * This request holds the parameters needed by the firebaseappdistribution server.  After setting
       * any optional parameters, call the {@link Patch#execute()} method to invoke the remote operation.
       *
       * @param name The name of the tester resource. Format: `projects/{project_number}/testers/{email_address}`
       * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Tester}
       * @return the request
       */
      public Patch patch(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Tester content) throws java.io.IOException {
        Patch result = new Patch(name, content);
        initialize(result);
        return result;
      }

      public class Patch extends FirebaseAppDistributionRequest<com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Tester> {

        private static final String REST_PATH = "v1/{+name}";

        private final java.util.regex.Pattern NAME_PATTERN =
            java.util.regex.Pattern.compile("^projects/[^/]+/testers/[^/]+$");

        /**
         * Update a tester. If the testers joins a group they gain access to all releases that the group
         * has access to.
         *
         * Create a request for the method "testers.patch".
         *
         * This request holds the parameters needed by the the firebaseappdistribution server.  After
         * setting any optional parameters, call the {@link Patch#execute()} method to invoke the remote
         * operation. <p> {@link
         * Patch#initialize(com.google.api.client.googleapis.services.AbstractGoogleClientRequest)} must
         * be called to initialize this instance immediately after invoking the constructor. </p>
         *
         * @param name The name of the tester resource. Format: `projects/{project_number}/testers/{email_address}`
         * @param content the {@link com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Tester}
         * @since 1.13
         */
        protected Patch(java.lang.String name, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Tester content) {
          super(FirebaseAppDistribution.this, "PATCH", REST_PATH, content, com.google.api.services.firebaseappdistribution.v1.model.GoogleFirebaseAppdistroV1Tester.class);
          this.name = com.google.api.client.util.Preconditions.checkNotNull(name, "Required parameter name must be specified.");
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                "Parameter name must conform to the pattern " +
                "^projects/[^/]+/testers/[^/]+$");
          }
        }

        @Override
        public Patch set$Xgafv(java.lang.String $Xgafv) {
          return (Patch) super.set$Xgafv($Xgafv);
        }

        @Override
        public Patch setAccessToken(java.lang.String accessToken) {
          return (Patch) super.setAccessToken(accessToken);
        }

        @Override
        public Patch setAlt(java.lang.String alt) {
          return (Patch) super.setAlt(alt);
        }

        @Override
        public Patch setCallback(java.lang.String callback) {
          return (Patch) super.setCallback(callback);
        }

        @Override
        public Patch setFields(java.lang.String fields) {
          return (Patch) super.setFields(fields);
        }

        @Override
        public Patch setKey(java.lang.String key) {
          return (Patch) super.setKey(key);
        }

        @Override
        public Patch setOauthToken(java.lang.String oauthToken) {
          return (Patch) super.setOauthToken(oauthToken);
        }

        @Override
        public Patch setPrettyPrint(java.lang.Boolean prettyPrint) {
          return (Patch) super.setPrettyPrint(prettyPrint);
        }

        @Override
        public Patch setQuotaUser(java.lang.String quotaUser) {
          return (Patch) super.setQuotaUser(quotaUser);
        }

        @Override
        public Patch setUploadType(java.lang.String uploadType) {
          return (Patch) super.setUploadType(uploadType);
        }

        @Override
        public Patch setUploadProtocol(java.lang.String uploadProtocol) {
          return (Patch) super.setUploadProtocol(uploadProtocol);
        }

        /**
         * The name of the tester resource. Format:
         * `projects/{project_number}/testers/{email_address}`
         */
        @com.google.api.client.util.Key
        private java.lang.String name;

        /** The name of the tester resource. Format: `projects/{project_number}/testers/{email_address}`
         */
        public java.lang.String getName() {
          return name;
        }

        /**
         * The name of the tester resource. Format:
         * `projects/{project_number}/testers/{email_address}`
         */
        public Patch setName(java.lang.String name) {
          if (!getSuppressPatternChecks()) {
            com.google.api.client.util.Preconditions.checkArgument(NAME_PATTERN.matcher(name).matches(),
                "Parameter name must conform to the pattern " +
                "^projects/[^/]+/testers/[^/]+$");
          }
          this.name = name;
          return this;
        }

        /** The list of fields to update. */
        @com.google.api.client.util.Key
        private String updateMask;

        /** The list of fields to update.
         */
        public String getUpdateMask() {
          return updateMask;
        }

        /** The list of fields to update. */
        public Patch setUpdateMask(String updateMask) {
          this.updateMask = updateMask;
          return this;
        }

        @Override
        public Patch set(String parameterName, Object value) {
          return (Patch) super.set(parameterName, value);
        }
      }

    }
  }

  /**
   * Builder for {@link FirebaseAppDistribution}.
   *
   * <p>
   * Implementation is not thread-safe.
   * </p>
   *
   * @since 1.3.0
   */
  public static final class Builder extends com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient.Builder {

    private static String chooseEndpoint(com.google.api.client.http.HttpTransport transport) {
      // If the GOOGLE_API_USE_MTLS_ENDPOINT environment variable value is "always", use mTLS endpoint.
      // If the env variable is "auto", use mTLS endpoint if and only if the transport is mTLS.
      // Use the regular endpoint for all other cases.
      String useMtlsEndpoint = System.getenv("GOOGLE_API_USE_MTLS_ENDPOINT");
      useMtlsEndpoint = useMtlsEndpoint == null ? "auto" : useMtlsEndpoint;
      if ("always".equals(useMtlsEndpoint) || ("auto".equals(useMtlsEndpoint) && transport != null && transport.isMtls())) {
        return DEFAULT_MTLS_ROOT_URL;
      }
      return DEFAULT_ROOT_URL;
    }

    /**
     * Returns an instance of a new builder.
     *
     * @param transport HTTP transport, which should normally be:
     *        <ul>
     *        <li>Google App Engine:
     *        {@code com.google.api.client.extensions.appengine.http.UrlFetchTransport}</li>
     *        <li>Android: {@code newCompatibleTransport} from
     *        {@code com.google.api.client.extensions.android.http.AndroidHttp}</li>
     *        <li>Java: {@link com.google.api.client.googleapis.javanet.GoogleNetHttpTransport#newTrustedTransport()}
     *        </li>
     *        </ul>
     * @param jsonFactory JSON factory, which may be:
     *        <ul>
     *        <li>Jackson: {@code com.google.api.client.json.jackson2.JacksonFactory}</li>
     *        <li>Google GSON: {@code com.google.api.client.json.gson.GsonFactory}</li>
     *        <li>Android Honeycomb or higher:
     *        {@code com.google.api.client.extensions.android.json.AndroidJsonFactory}</li>
     *        </ul>
     * @param httpRequestInitializer HTTP request initializer or {@code null} for none
     * @since 1.7
     */
    public Builder(com.google.api.client.http.HttpTransport transport, com.google.api.client.json.JsonFactory jsonFactory,
        com.google.api.client.http.HttpRequestInitializer httpRequestInitializer) {
      super(
          transport,
          jsonFactory,
          Builder.chooseEndpoint(transport),
          DEFAULT_SERVICE_PATH,
          httpRequestInitializer,
          false);
      setBatchPath(DEFAULT_BATCH_PATH);
    }

    /** Builds a new instance of {@link FirebaseAppDistribution}. */
    @Override
    public FirebaseAppDistribution build() {
      return new FirebaseAppDistribution(this);
    }

    @Override
    public Builder setRootUrl(String rootUrl) {
      return (Builder) super.setRootUrl(rootUrl);
    }

    @Override
    public Builder setServicePath(String servicePath) {
      return (Builder) super.setServicePath(servicePath);
    }

    @Override
    public Builder setBatchPath(String batchPath) {
      return (Builder) super.setBatchPath(batchPath);
    }

    @Override
    public Builder setHttpRequestInitializer(com.google.api.client.http.HttpRequestInitializer httpRequestInitializer) {
      return (Builder) super.setHttpRequestInitializer(httpRequestInitializer);
    }

    @Override
    public Builder setApplicationName(String applicationName) {
      return (Builder) super.setApplicationName(applicationName);
    }

    @Override
    public Builder setSuppressPatternChecks(boolean suppressPatternChecks) {
      return (Builder) super.setSuppressPatternChecks(suppressPatternChecks);
    }

    @Override
    public Builder setSuppressRequiredParameterChecks(boolean suppressRequiredParameterChecks) {
      return (Builder) super.setSuppressRequiredParameterChecks(suppressRequiredParameterChecks);
    }

    @Override
    public Builder setSuppressAllChecks(boolean suppressAllChecks) {
      return (Builder) super.setSuppressAllChecks(suppressAllChecks);
    }

    /**
     * Set the {@link FirebaseAppDistributionRequestInitializer}.
     *
     * @since 1.12
     */
    public Builder setFirebaseAppDistributionRequestInitializer(
        FirebaseAppDistributionRequestInitializer firebaseappdistributionRequestInitializer) {
      return (Builder) super.setGoogleClientRequestInitializer(firebaseappdistributionRequestInitializer);
    }

    @Override
    public Builder setGoogleClientRequestInitializer(
        com.google.api.client.googleapis.services.GoogleClientRequestInitializer googleClientRequestInitializer) {
      return (Builder) super.setGoogleClientRequestInitializer(googleClientRequestInitializer);
    }
  }
}
