| Index: generated/googleapis/lib/storage/v1.dart | 
| diff --git a/generated/googleapis/lib/storage/v1.dart b/generated/googleapis/lib/storage/v1.dart | 
| index 6760b13a9a305fd2f87ece024bc946f30fd36674..b71019f356d45c067152a740dddf1efda943093c 100644 | 
| --- a/generated/googleapis/lib/storage/v1.dart | 
| +++ b/generated/googleapis/lib/storage/v1.dart | 
| @@ -455,6 +455,45 @@ class BucketsResourceApi { | 
| } | 
|  | 
| /** | 
| +   * Returns an IAM policy for the specified bucket. | 
| +   * | 
| +   * Request parameters: | 
| +   * | 
| +   * [bucket] - Name of a bucket. | 
| +   * | 
| +   * Completes with a [Policy]. | 
| +   * | 
| +   * Completes with a [commons.ApiRequestError] if the API endpoint returned an | 
| +   * error. | 
| +   * | 
| +   * If the used [http.Client] completes with an error when making a REST call, | 
| +   * this method will complete with the same error. | 
| +   */ | 
| +  async.Future<Policy> getIamPolicy(core.String bucket) { | 
| +    var _url = null; | 
| +    var _queryParams = new core.Map(); | 
| +    var _uploadMedia = null; | 
| +    var _uploadOptions = null; | 
| +    var _downloadOptions = commons.DownloadOptions.Metadata; | 
| +    var _body = null; | 
| + | 
| +    if (bucket == null) { | 
| +      throw new core.ArgumentError("Parameter bucket is required."); | 
| +    } | 
| + | 
| +    _url = 'b/' + commons.Escaper.ecapeVariable('$bucket') + '/iam'; | 
| + | 
| +    var _response = _requester.request(_url, | 
| +                                       "GET", | 
| +                                       body: _body, | 
| +                                       queryParams: _queryParams, | 
| +                                       uploadOptions: _uploadOptions, | 
| +                                       uploadMedia: _uploadMedia, | 
| +                                       downloadOptions: _downloadOptions); | 
| +    return _response.then((data) => new Policy.fromJson(data)); | 
| +  } | 
| + | 
| +  /** | 
| * Creates a new bucket. | 
| * | 
| * [request] - The metadata request object. | 
| @@ -709,6 +748,96 @@ class BucketsResourceApi { | 
| } | 
|  | 
| /** | 
| +   * Updates an IAM policy for the specified bucket. | 
| +   * | 
| +   * [request] - The metadata request object. | 
| +   * | 
| +   * Request parameters: | 
| +   * | 
| +   * [bucket] - Name of a bucket. | 
| +   * | 
| +   * Completes with a [Policy]. | 
| +   * | 
| +   * Completes with a [commons.ApiRequestError] if the API endpoint returned an | 
| +   * error. | 
| +   * | 
| +   * If the used [http.Client] completes with an error when making a REST call, | 
| +   * this method will complete with the same error. | 
| +   */ | 
| +  async.Future<Policy> setIamPolicy(Policy request, core.String bucket) { | 
| +    var _url = null; | 
| +    var _queryParams = new core.Map(); | 
| +    var _uploadMedia = null; | 
| +    var _uploadOptions = null; | 
| +    var _downloadOptions = commons.DownloadOptions.Metadata; | 
| +    var _body = null; | 
| + | 
| +    if (request != null) { | 
| +      _body = convert.JSON.encode((request).toJson()); | 
| +    } | 
| +    if (bucket == null) { | 
| +      throw new core.ArgumentError("Parameter bucket is required."); | 
| +    } | 
| + | 
| +    _url = 'b/' + commons.Escaper.ecapeVariable('$bucket') + '/iam'; | 
| + | 
| +    var _response = _requester.request(_url, | 
| +                                       "PUT", | 
| +                                       body: _body, | 
| +                                       queryParams: _queryParams, | 
| +                                       uploadOptions: _uploadOptions, | 
| +                                       uploadMedia: _uploadMedia, | 
| +                                       downloadOptions: _downloadOptions); | 
| +    return _response.then((data) => new Policy.fromJson(data)); | 
| +  } | 
| + | 
| +  /** | 
| +   * Tests a set of permissions on the given bucket to see which, if any, are | 
| +   * held by the caller. | 
| +   * | 
| +   * Request parameters: | 
| +   * | 
| +   * [bucket] - Name of a bucket. | 
| +   * | 
| +   * [permissions] - Permissions to test. | 
| +   * | 
| +   * Completes with a [TestIamPermissionsResponse]. | 
| +   * | 
| +   * Completes with a [commons.ApiRequestError] if the API endpoint returned an | 
| +   * error. | 
| +   * | 
| +   * If the used [http.Client] completes with an error when making a REST call, | 
| +   * this method will complete with the same error. | 
| +   */ | 
| +  async.Future<TestIamPermissionsResponse> testIamPermissions(core.String bucket, core.List<core.String> permissions) { | 
| +    var _url = null; | 
| +    var _queryParams = new core.Map(); | 
| +    var _uploadMedia = null; | 
| +    var _uploadOptions = null; | 
| +    var _downloadOptions = commons.DownloadOptions.Metadata; | 
| +    var _body = null; | 
| + | 
| +    if (bucket == null) { | 
| +      throw new core.ArgumentError("Parameter bucket is required."); | 
| +    } | 
| +    if (permissions == null || permissions.isEmpty) { | 
| +      throw new core.ArgumentError("Parameter permissions is required."); | 
| +    } | 
| +    _queryParams["permissions"] = permissions; | 
| + | 
| +    _url = 'b/' + commons.Escaper.ecapeVariable('$bucket') + '/iam/testPermissions'; | 
| + | 
| +    var _response = _requester.request(_url, | 
| +                                       "GET", | 
| +                                       body: _body, | 
| +                                       queryParams: _queryParams, | 
| +                                       uploadOptions: _uploadOptions, | 
| +                                       uploadMedia: _uploadMedia, | 
| +                                       downloadOptions: _downloadOptions); | 
| +    return _response.then((data) => new TestIamPermissionsResponse.fromJson(data)); | 
| +  } | 
| + | 
| +  /** | 
| * Updates a bucket. Changes to the bucket will be readable immediately after | 
| * writing, but configuration changes may take time to propagate. | 
| * | 
| @@ -1960,6 +2089,57 @@ class ObjectsResourceApi { | 
| } | 
|  | 
| /** | 
| +   * Returns an IAM policy for the specified object. | 
| +   * | 
| +   * Request parameters: | 
| +   * | 
| +   * [bucket] - Name of the bucket in which the object resides. | 
| +   * | 
| +   * [object] - Name of the object. For information about how to URL encode | 
| +   * object names to be path safe, see Encoding URI Path Parts. | 
| +   * | 
| +   * [generation] - If present, selects a specific revision of this object (as | 
| +   * opposed to the latest version, the default). | 
| +   * | 
| +   * Completes with a [Policy]. | 
| +   * | 
| +   * Completes with a [commons.ApiRequestError] if the API endpoint returned an | 
| +   * error. | 
| +   * | 
| +   * If the used [http.Client] completes with an error when making a REST call, | 
| +   * this method will complete with the same error. | 
| +   */ | 
| +  async.Future<Policy> getIamPolicy(core.String bucket, core.String object, {core.String generation}) { | 
| +    var _url = null; | 
| +    var _queryParams = new core.Map(); | 
| +    var _uploadMedia = null; | 
| +    var _uploadOptions = null; | 
| +    var _downloadOptions = commons.DownloadOptions.Metadata; | 
| +    var _body = null; | 
| + | 
| +    if (bucket == null) { | 
| +      throw new core.ArgumentError("Parameter bucket is required."); | 
| +    } | 
| +    if (object == null) { | 
| +      throw new core.ArgumentError("Parameter object is required."); | 
| +    } | 
| +    if (generation != null) { | 
| +      _queryParams["generation"] = [generation]; | 
| +    } | 
| + | 
| +    _url = 'b/' + commons.Escaper.ecapeVariable('$bucket') + '/o/' + commons.Escaper.ecapeVariable('$object') + '/iam'; | 
| + | 
| +    var _response = _requester.request(_url, | 
| +                                       "GET", | 
| +                                       body: _body, | 
| +                                       queryParams: _queryParams, | 
| +                                       uploadOptions: _uploadOptions, | 
| +                                       uploadMedia: _uploadMedia, | 
| +                                       downloadOptions: _downloadOptions); | 
| +    return _response.then((data) => new Policy.fromJson(data)); | 
| +  } | 
| + | 
| +  /** | 
| * Stores a new object and metadata. | 
| * | 
| * [request] - The metadata request object. | 
| @@ -2455,6 +2635,120 @@ class ObjectsResourceApi { | 
| } | 
|  | 
| /** | 
| +   * Updates an IAM policy for the specified object. | 
| +   * | 
| +   * [request] - The metadata request object. | 
| +   * | 
| +   * Request parameters: | 
| +   * | 
| +   * [bucket] - Name of the bucket in which the object resides. | 
| +   * | 
| +   * [object] - Name of the object. For information about how to URL encode | 
| +   * object names to be path safe, see Encoding URI Path Parts. | 
| +   * | 
| +   * [generation] - If present, selects a specific revision of this object (as | 
| +   * opposed to the latest version, the default). | 
| +   * | 
| +   * Completes with a [Policy]. | 
| +   * | 
| +   * Completes with a [commons.ApiRequestError] if the API endpoint returned an | 
| +   * error. | 
| +   * | 
| +   * If the used [http.Client] completes with an error when making a REST call, | 
| +   * this method will complete with the same error. | 
| +   */ | 
| +  async.Future<Policy> setIamPolicy(Policy request, core.String bucket, core.String object, {core.String generation}) { | 
| +    var _url = null; | 
| +    var _queryParams = new core.Map(); | 
| +    var _uploadMedia = null; | 
| +    var _uploadOptions = null; | 
| +    var _downloadOptions = commons.DownloadOptions.Metadata; | 
| +    var _body = null; | 
| + | 
| +    if (request != null) { | 
| +      _body = convert.JSON.encode((request).toJson()); | 
| +    } | 
| +    if (bucket == null) { | 
| +      throw new core.ArgumentError("Parameter bucket is required."); | 
| +    } | 
| +    if (object == null) { | 
| +      throw new core.ArgumentError("Parameter object is required."); | 
| +    } | 
| +    if (generation != null) { | 
| +      _queryParams["generation"] = [generation]; | 
| +    } | 
| + | 
| +    _url = 'b/' + commons.Escaper.ecapeVariable('$bucket') + '/o/' + commons.Escaper.ecapeVariable('$object') + '/iam'; | 
| + | 
| +    var _response = _requester.request(_url, | 
| +                                       "PUT", | 
| +                                       body: _body, | 
| +                                       queryParams: _queryParams, | 
| +                                       uploadOptions: _uploadOptions, | 
| +                                       uploadMedia: _uploadMedia, | 
| +                                       downloadOptions: _downloadOptions); | 
| +    return _response.then((data) => new Policy.fromJson(data)); | 
| +  } | 
| + | 
| +  /** | 
| +   * Tests a set of permissions on the given object to see which, if any, are | 
| +   * held by the caller. | 
| +   * | 
| +   * Request parameters: | 
| +   * | 
| +   * [bucket] - Name of the bucket in which the object resides. | 
| +   * | 
| +   * [object] - Name of the object. For information about how to URL encode | 
| +   * object names to be path safe, see Encoding URI Path Parts. | 
| +   * | 
| +   * [permissions] - Permissions to test. | 
| +   * | 
| +   * [generation] - If present, selects a specific revision of this object (as | 
| +   * opposed to the latest version, the default). | 
| +   * | 
| +   * Completes with a [TestIamPermissionsResponse]. | 
| +   * | 
| +   * Completes with a [commons.ApiRequestError] if the API endpoint returned an | 
| +   * error. | 
| +   * | 
| +   * If the used [http.Client] completes with an error when making a REST call, | 
| +   * this method will complete with the same error. | 
| +   */ | 
| +  async.Future<TestIamPermissionsResponse> testIamPermissions(core.String bucket, core.String object, core.List<core.String> permissions, {core.String generation}) { | 
| +    var _url = null; | 
| +    var _queryParams = new core.Map(); | 
| +    var _uploadMedia = null; | 
| +    var _uploadOptions = null; | 
| +    var _downloadOptions = commons.DownloadOptions.Metadata; | 
| +    var _body = null; | 
| + | 
| +    if (bucket == null) { | 
| +      throw new core.ArgumentError("Parameter bucket is required."); | 
| +    } | 
| +    if (object == null) { | 
| +      throw new core.ArgumentError("Parameter object is required."); | 
| +    } | 
| +    if (permissions == null || permissions.isEmpty) { | 
| +      throw new core.ArgumentError("Parameter permissions is required."); | 
| +    } | 
| +    _queryParams["permissions"] = permissions; | 
| +    if (generation != null) { | 
| +      _queryParams["generation"] = [generation]; | 
| +    } | 
| + | 
| +    _url = 'b/' + commons.Escaper.ecapeVariable('$bucket') + '/o/' + commons.Escaper.ecapeVariable('$object') + '/iam/testPermissions'; | 
| + | 
| +    var _response = _requester.request(_url, | 
| +                                       "GET", | 
| +                                       body: _body, | 
| +                                       queryParams: _queryParams, | 
| +                                       uploadOptions: _uploadOptions, | 
| +                                       uploadMedia: _uploadMedia, | 
| +                                       downloadOptions: _downloadOptions); | 
| +    return _response.then((data) => new TestIamPermissionsResponse.fromJson(data)); | 
| +  } | 
| + | 
| +  /** | 
| * Updates an object's metadata. | 
| * | 
| * [request] - The metadata request object. | 
| @@ -4234,6 +4528,148 @@ class Objects { | 
| } | 
| } | 
|  | 
| +class PolicyBindings { | 
| +  /** | 
| +   * A collection of identifiers for members who may assume the provided role. | 
| +   * Recognized identifiers are as follows: | 
| +   * - allUsers — A special identifier that represents anyone on the internet; | 
| +   * with or without a Google account. | 
| +   * - allAuthenticatedUsers — A special identifier that represents anyone who | 
| +   * is authenticated with a Google account or a service account. | 
| +   * - user:emailid — An email address that represents a specific account. For | 
| +   * example, user:alice@gmail.com or user:joe@example.com. | 
| +   * - serviceAccount:emailid — An email address that represents a service | 
| +   * account. For example, | 
| +   * serviceAccount:my-other-app@appspot.gserviceaccount.com . | 
| +   * - group:emailid — An email address that represents a Google group. For | 
| +   * example, group:admins@example.com. | 
| +   * - domain:domain — A Google Apps domain name that represents all the users | 
| +   * of that domain. For example, domain:google.com or domain:example.com. | 
| +   * - projectOwner:projectid — Owners of the given project. For example, | 
| +   * projectOwner:my-example-project | 
| +   * - projectEditor:projectid — Editors of the given project. For example, | 
| +   * projectEditor:my-example-project | 
| +   * - projectViewer:projectid — Viewers of the given project. For example, | 
| +   * projectViewer:my-example-project | 
| +   */ | 
| +  core.List<core.String> members; | 
| +  /** | 
| +   * The role to which members belong. Two types of roles are supported: new IAM | 
| +   * roles, which grant permissions that do not map directly to those provided | 
| +   * by ACLs, and legacy IAM roles, which do map directly to ACL permissions. | 
| +   * All roles are of the format roles/storage.specificRole. | 
| +   * The new IAM roles are: | 
| +   * - roles/storage.admin — Full control of Google Cloud Storage resources. | 
| +   * - roles/storage.objectViewer — Read-Only access to Google Cloud Storage | 
| +   * objects. | 
| +   * - roles/storage.objectCreator — Access to create objects in Google Cloud | 
| +   * Storage. | 
| +   * - roles/storage.objectAdmin — Full control of Google Cloud Storage objects. | 
| +   * The legacy IAM roles are: | 
| +   * - roles/storage.legacyObjectReader — Read-only access to objects without | 
| +   * listing. Equivalent to an ACL entry on an object with the READER role. | 
| +   * - roles/storage.legacyObjectOwner — Read/write access to existing objects | 
| +   * without listing. Equivalent to an ACL entry on an object with the OWNER | 
| +   * role. | 
| +   * - roles/storage.legacyBucketReader — Read access to buckets with object | 
| +   * listing. Equivalent to an ACL entry on a bucket with the READER role. | 
| +   * - roles/storage.legacyBucketWriter — Read access to buckets with object | 
| +   * listing/creation/deletion. Equivalent to an ACL entry on a bucket with the | 
| +   * WRITER role. | 
| +   * - roles/storage.legacyBucketOwner — Read and write access to existing | 
| +   * buckets with object listing/creation/deletion. Equivalent to an ACL entry | 
| +   * on a bucket with the OWNER role. | 
| +   */ | 
| +  core.String role; | 
| + | 
| +  PolicyBindings(); | 
| + | 
| +  PolicyBindings.fromJson(core.Map _json) { | 
| +    if (_json.containsKey("members")) { | 
| +      members = _json["members"]; | 
| +    } | 
| +    if (_json.containsKey("role")) { | 
| +      role = _json["role"]; | 
| +    } | 
| +  } | 
| + | 
| +  core.Map toJson() { | 
| +    var _json = new core.Map(); | 
| +    if (members != null) { | 
| +      _json["members"] = members; | 
| +    } | 
| +    if (role != null) { | 
| +      _json["role"] = role; | 
| +    } | 
| +    return _json; | 
| +  } | 
| +} | 
| + | 
| +/** A bucket/object IAM policy. */ | 
| +class Policy { | 
| +  /** | 
| +   * An association between a role, which comes with a set of permissions, and | 
| +   * members who may assume that role. | 
| +   */ | 
| +  core.List<PolicyBindings> bindings; | 
| +  /** HTTP 1.1  Entity tag for the policy. */ | 
| +  core.String etag; | 
| +  core.List<core.int> get etagAsBytes { | 
| +    return convert.BASE64.decode(etag); | 
| +  } | 
| + | 
| +  void set etagAsBytes(core.List<core.int> _bytes) { | 
| +    etag = convert.BASE64.encode(_bytes).replaceAll("/", "_").replaceAll("+", "-"); | 
| +  } | 
| +  /** | 
| +   * The kind of item this is. For policies, this is always storage#policy. This | 
| +   * field is ignored on input. | 
| +   */ | 
| +  core.String kind; | 
| +  /** | 
| +   * The ID of the resource to which this policy belongs. Will be of the form | 
| +   * buckets/bucket for buckets, and buckets/bucket/objects/object for objects. | 
| +   * A specific generation may be specified by appending #generationNumber to | 
| +   * the end of the object name, e.g. buckets/my-bucket/objects/data.txt#17. The | 
| +   * current generation can be denoted with #0. This field is ignored on input. | 
| +   */ | 
| +  core.String resourceId; | 
| + | 
| +  Policy(); | 
| + | 
| +  Policy.fromJson(core.Map _json) { | 
| +    if (_json.containsKey("bindings")) { | 
| +      bindings = _json["bindings"].map((value) => new PolicyBindings.fromJson(value)).toList(); | 
| +    } | 
| +    if (_json.containsKey("etag")) { | 
| +      etag = _json["etag"]; | 
| +    } | 
| +    if (_json.containsKey("kind")) { | 
| +      kind = _json["kind"]; | 
| +    } | 
| +    if (_json.containsKey("resourceId")) { | 
| +      resourceId = _json["resourceId"]; | 
| +    } | 
| +  } | 
| + | 
| +  core.Map toJson() { | 
| +    var _json = new core.Map(); | 
| +    if (bindings != null) { | 
| +      _json["bindings"] = bindings.map((value) => (value).toJson()).toList(); | 
| +    } | 
| +    if (etag != null) { | 
| +      _json["etag"] = etag; | 
| +    } | 
| +    if (kind != null) { | 
| +      _json["kind"] = kind; | 
| +    } | 
| +    if (resourceId != null) { | 
| +      _json["resourceId"] = resourceId; | 
| +    } | 
| +    return _json; | 
| +  } | 
| +} | 
| + | 
| /** A rewrite response. */ | 
| class RewriteResponse { | 
| /** | 
| @@ -4310,3 +4746,51 @@ class RewriteResponse { | 
| return _json; | 
| } | 
| } | 
| + | 
| +/** A storage.(buckets|objects).testIamPermissions response. */ | 
| +class TestIamPermissionsResponse { | 
| +  /** The kind of item this is. */ | 
| +  core.String kind; | 
| +  /** | 
| +   * The permissions held by the caller. Permissions are always of the format | 
| +   * storage.resource.capability, where resource is one of buckets or objects. | 
| +   * The supported permissions are as follows: | 
| +   * - storage.buckets.delete — Delete bucket. | 
| +   * - storage.buckets.get — Read bucket metadata. | 
| +   * - storage.buckets.getIamPolicy — Read bucket IAM policy. | 
| +   * - storage.buckets.create — Create bucket. | 
| +   * - storage.buckets.list — List buckets. | 
| +   * - storage.buckets.setIamPolicy — Update bucket IAM policy. | 
| +   * - storage.buckets.update — Update bucket metadata. | 
| +   * - storage.objects.delete — Delete object. | 
| +   * - storage.objects.get — Read object data and metadata. | 
| +   * - storage.objects.getIamPolicy — Read object IAM policy. | 
| +   * - storage.objects.create — Create object. | 
| +   * - storage.objects.list — List objects. | 
| +   * - storage.objects.setIamPolicy — Update object IAM policy. | 
| +   * - storage.objects.update — Update object metadata. | 
| +   */ | 
| +  core.List<core.String> permissions; | 
| + | 
| +  TestIamPermissionsResponse(); | 
| + | 
| +  TestIamPermissionsResponse.fromJson(core.Map _json) { | 
| +    if (_json.containsKey("kind")) { | 
| +      kind = _json["kind"]; | 
| +    } | 
| +    if (_json.containsKey("permissions")) { | 
| +      permissions = _json["permissions"]; | 
| +    } | 
| +  } | 
| + | 
| +  core.Map toJson() { | 
| +    var _json = new core.Map(); | 
| +    if (kind != null) { | 
| +      _json["kind"] = kind; | 
| +    } | 
| +    if (permissions != null) { | 
| +      _json["permissions"] = permissions; | 
| +    } | 
| +    return _json; | 
| +  } | 
| +} | 
|  |